はじめに
このチュートリアルでは、Docker コンテナイメージのクローン作成プロセスについて説明します。Docker イメージは、アプリケーションを実行するために必要なすべてを含むパッケージ化されたテンプレートであり、クローン作成によって、カスタマイズ可能なコピーを作成できます。このガイドの終わりには、Docker イメージをクローンし、それを変更し、デプロイメントのために共有する方法を理解できるようになります。
このチュートリアルでは、Docker コンテナイメージのクローン作成プロセスについて説明します。Docker イメージは、アプリケーションを実行するために必要なすべてを含むパッケージ化されたテンプレートであり、クローン作成によって、カスタマイズ可能なコピーを作成できます。このガイドの終わりには、Docker イメージをクローンし、それを変更し、デプロイメントのために共有する方法を理解できるようになります。
Docker イメージのクローン作成を開始する前に、Docker が何であるかを理解し、環境が適切にセットアップされていることを確認することが重要です。
Docker は、コンテナを使用してアプリケーションを開発、デプロイ、実行するためのプラットフォームです。コンテナは、アプリケーションとそのすべての依存関係をパッケージ化し、異なる環境間で一貫して動作するようにします。これにより、Docker は開発およびデプロイメントのワークフローに特に役立ちます。
まず、Docker がシステムに正しくインストールされていることを確認しましょう。ターミナルウィンドウを開き、以下を実行します。
docker --version
次のような出力が表示されるはずです。
Docker version 20.10.21, build baeda1f
次に、Docker サービスが実行されていることを確認します。
sudo systemctl status docker
出力は、Docker がアクティブ(実行中)であることを示しているはずです。実行されていない場合は、以下で開始できます。
sudo systemctl start docker
Docker が正しく動作していることを確認するために、簡単なテストコマンドを実行しましょう。
docker run hello-world
このコマンドは、hello-world イメージをダウンロードして実行し、確認メッセージを出力して終了します。次のような出力が表示されるはずです。
Hello from Docker!
This message shows that your installation appears to be working correctly.
システムで現在利用可能な Docker イメージを確認するには、以下を実行します。
docker images
このコマンドは、現在ローカルに保存されているすべての Docker イメージを一覧表示します。出力には、イメージリポジトリ、タグ、イメージ ID、作成日、およびサイズが表示されます。
Docker が正しく動作することを確認したので、次のステップで Docker イメージの操作を開始する準備ができました。
このステップでは、Docker Hub から Docker イメージをプルし、ローカルシステムで実行します。これは、Docker イメージのクローン作成プロセスの最初のステップです。
Docker Hub は、ユーザーがコンテナイメージを見つけて共有できるクラウドベースのレジストリサービスです。ソフトウェアベンダーによってメンテナンスされている多くの公式イメージと、コミュニティによって提供されたイメージが含まれています。
Docker Hub から公式の Nginx Web サーバーイメージをプルしてみましょう。Nginx は、このチュートリアル全体で例として使用する人気の Web サーバーです。
Nginx イメージをダウンロードするには、次のコマンドを実行します。
docker pull nginx:latest
このコマンドは、Nginx イメージの最新バージョンをダウンロードします。ダウンロードの進行状況を示す出力が表示されるはずです。
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
イメージが正常にダウンロードされたことを確認するには、Docker イメージをもう一度一覧表示します。
docker images
これで、Nginx イメージがリストに表示されるはずです。
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 weeks ago 142MB
次に、先ほどプルした Nginx イメージに基づいてコンテナを実行しましょう。
docker run --name my-nginx -d -p 8080:80 nginx
このコマンドは、次のことを行います。
--name my-nginx: コンテナに "my-nginx" という名前を付けます-d: コンテナをデタッチモード(バックグラウンド)で実行します-p 8080:80: ホストのポート 8080 をコンテナのポート 80 にマッピングしますnginx: 先ほどプルした Nginx イメージを使用しますコンテナ ID である長い文字列が出力されるはずです。
コンテナが実行されているかどうかを確認するには、次のようにします。
docker ps
次のような出力が表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8d3e9c5b9a7 nginx "/docker-entrypoint.…" 30 seconds ago Up 29 seconds 0.0.0.0:8080->80/tcp my-nginx
Web ブラウザを開き、http://localhost:8080 に移動するか、curl を使用して、Nginx のデフォルトページにアクセスできるようになりました。
curl http://localhost:8080
Nginx のウェルカムページの HTML コンテンツが表示されるはずです。
これで、Docker イメージを正常にプルして実行できたので、次のステップでそれに基づいて独自のカスタムイメージを作成する準備ができました。
Nginx コンテナが実行されているので、それを変更してカスタムイメージを作成します。これがクローン作成プロセスの核心です。以下を行います。
Docker イメージは、次の 2 つの方法で作成できます。
このチュートリアルでは、クローン作成プロセスを理解するのに簡単なため、2 番目のアプローチを使用します。
まず、デフォルトの Nginx ウェルカムページを置き換えるカスタム HTML ファイルを作成しましょう。実行中のコンテナに入り、そのファイルを変更する必要があります。
次のコマンドを使用して、実行中のコンテナ内でシェルを実行します。
docker exec -it my-nginx bash
これにより、コンテナ内でインタラクティブな bash シェルが開きます。次に、カスタム HTML ファイルを作成しましょう。
echo "<html><body><h1>My Custom Docker Image</h1><p>This is a custom Nginx image created in the LabEx tutorial.</p></body></html>" > /usr/share/nginx/html/index.html
ファイルのコンテンツを確認して、変更を確認できます。
cat /usr/share/nginx/html/index.html
次に、コンテナシェルを終了します。
exit
Nginx サーバーに再度アクセスして、変更が適用されたかどうかをテストしましょう。
curl http://localhost:8080
これで、デフォルトの Nginx ウェルカムページの代わりに、カスタム HTML コンテンツが表示されるはずです。
コンテナを変更したので、これらの変更を含む新しいイメージを作成します。これは、docker commit コマンドを使用して行います。
docker commit my-nginx my-custom-nginx:v1
このコマンドは、my-nginx コンテナの現在の状態に基づいて、タグ v1 を持つ my-custom-nginx という名前の新しいイメージを作成します。
新しいイメージが作成されたことを確認しましょう。
docker images
新しいイメージがリストに表示されるはずです。
REPOSITORY TAG IMAGE ID CREATED SIZE
my-custom-nginx v1 a1b2c3d4e5f6 10 seconds ago 142MB
nginx latest 605c77e624dd 2 weeks ago 142MB
次に、元のコンテナを停止して削除し、カスタムイメージに基づいて新しいコンテナを実行しましょう。
docker stop my-nginx
docker rm my-nginx
docker run --name my-custom-container -d -p 8081:80 my-custom-nginx:v1
これらのコマンドは、次のことを行います。
新しいコンテナが正しく実行されていることを確認しましょう。
docker ps
新しいコンテナがリストに表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
g9h8i7j6k5l4 my-custom-nginx:v1 "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:8081->80/tcp my-custom-container
次に、新しいポートで Nginx サーバーにアクセスします。
curl http://localhost:8081
同じカスタム HTML コンテンツが表示されるはずです。これは、新しいイメージに変更が含まれていることを確認します。
おめでとうございます!Docker イメージを正常にクローンしてカスタマイズしました。次のステップでは、このカスタムイメージを共有する方法を学びます。
カスタム Docker イメージを作成したので、適切にタグ付けし、共有できるように準備する方法を学びます。実際のシナリオでは、Docker Hub などのレジストリにイメージをプッシュしますが、このチュートリアルでは、準備手順に焦点を当てます。
Docker イメージは、リポジトリ名とタグによって識別されます。タグは、イメージのバージョン管理と整理に役立ちます。デフォルトのタグは latest ですが、意味のあるバージョンタグを使用することをお勧めします。
カスタムイメージにさらにいくつかのタグを追加しましょう。
docker tag my-custom-nginx:v1 my-custom-nginx:latest
docker tag my-custom-nginx:v1 my-custom-nginx:stable
これらのコマンドは、イメージに latest と stable の 2 つの追加タグを作成します。実際のイメージデータは 3 つすべてのタグ間で共有されるため、この操作は非常に効率的です。
もう一度イメージを確認しましょう。
docker images
これで、my-custom-nginx の複数のエントリが表示されるはずです。
REPOSITORY TAG IMAGE ID CREATED SIZE
my-custom-nginx v1 a1b2c3d4e5f6 10 minutes ago 142MB
my-custom-nginx latest a1b2c3d4e5f6 10 minutes ago 142MB
my-custom-nginx stable a1b2c3d4e5f6 10 minutes ago 142MB
nginx latest 605c77e624dd 2 weeks ago 142MB
すべての my-custom-nginx イメージが同じ Image ID を持っていることに注意してください。これは、異なるタグを持つ同じイメージであることを示しています。
実際のシナリオでは、Docker Hub などのレジストリにイメージをプッシュします。これを行うには、次のものが必要になります。
デモンストレーションのために、Docker Hub のユーザー名が yourusername であると仮定しましょう。イメージをプッシュするための準備方法は次のとおりです。
docker tag my-custom-nginx:v1 yourusername/my-custom-nginx:v1
イメージをプッシュするには(実際のシナリオでは)、次のようにします。
## これはデモンストレーション専用です - 実際にはプッシュしません
## docker push yourusername/my-custom-nginx:v1
レジストリにプッシュする代わりに、Docker イメージを手動で転送するためにファイルに保存することもできます。
docker save -o my-custom-nginx.tar my-custom-nginx:v1
このコマンドは、イメージを my-custom-nginx.tar という名前の tarball に保存します。ファイルが作成されたことを確認できます。
ls -lh my-custom-nginx.tar
次のような出力が表示されるはずです。
-rw------- 1 labex labex 142M Nov 10 12:34 my-custom-nginx.tar
別のマシン(またはイメージを削除した後の同じマシン)で tarball からイメージを読み込むには、次のようにします。
## このコマンドは、チュートリアルの一部として実際に実行しません
## docker load -i my-custom-nginx.tar
他の人がカスタムイメージを理解できるようにするために、行った変更をドキュメント化することをお勧めします。簡単なドキュメントファイルを作成しましょう。
cat > my-custom-nginx-doc.txt << EOF
## My Custom Nginx Image
This is a custom Nginx image created by cloning the official Nginx image.
### Changes Made
- Replaced the default welcome page with a custom HTML page
### How to Run
docker run --name my-custom-container -d -p 8080:80 my-custom-nginx:v1
### Version History
- v1: Initial custom version with modified welcome page
EOF
これで、カスタムイメージのドキュメントファイルができました。
おめでとうございます!Docker イメージにタグを付け、共有できるように準備する方法を学びました。次のステップでは、いくつかのベストプラクティスについて説明し、環境をクリーンアップします。
この最終ステップでは、Docker イメージを操作するためのいくつかのベストプラクティスについて説明し、環境をクリーンアップします。
latest タグに依存するのではなく、常に特定のバージョンタグを使用してください。これにより、デプロイメントの一貫性が確保されます。
## より良いアプローチ
docker pull nginx:1.23.2
## 予測しにくい
docker pull nginx:latest
イメージが小さいほど、ダウンロードが速くなり、ストレージの使用量が少なくなります。可能であれば、alpine ベースのイメージを使用することを検討してください。
## サイズの違いを見てみましょう
docker pull nginx:alpine
docker images | grep nginx
次のような出力が表示される場合があります。
nginx alpine 2bc7edbc3cf2 2 weeks ago 40.7MB
nginx latest 605c77e624dd 2 weeks ago 142MB
alpine バージョンは大幅に小さくなっています!
Dockerfile でイメージを作成する場合は、最終的なイメージを小さく保つためにマルチステージビルドを使用します。簡単な例を次に示します(これを実行する必要はありません)。
## Build stage
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go build -o app
## Final stage
FROM alpine:3.15
COPY --from=builder /app/app /app
CMD ["/app"]
カスタムイメージについては、常に次のものを含むドキュメントを維持してください。
前のステップで簡単なドキュメントファイルを作成しました。
イメージを定期的に脆弱性についてスキャンします。
## スキャンの例(Docker Desktop にはこれが組み込まれています)
## docker scan my-custom-nginx:v1
Docker イメージを検査するための便利なコマンドを見てみましょう。
docker inspect my-custom-nginx:v1
このコマンドは、イメージのレイヤー、設定、環境変数など、イメージに関する詳細情報を表示します。
イメージがどのように構築されたかの履歴を確認できます。
docker history my-custom-nginx:v1
これにより、イメージの各レイヤーと、それらを作成したコマンドが表示されます。
それでは、作成したコンテナとイメージを削除して、環境をクリーンアップしましょう。
docker stop my-custom-container
docker rm my-custom-container
docker rmi my-custom-nginx:v1 my-custom-nginx:latest my-custom-nginx:stable
docker rmi nginx:latest nginx:alpine
docker ps -a
docker images
Docker には、未使用のリソースをクリーンアップするための便利なコマンドが用意されています。
docker system prune
これにより、停止したすべてのコンテナ、未使用のネットワーク、ぶら下がっているイメージ、およびビルドキャッシュが削除されます。続行する前に確認を求められます。
より積極的なクリーンアップを行うには、次を使用できます。
docker system prune -a
これにより、ぶら下がっているイメージだけでなく、未使用のすべてのイメージも追加で削除されます。
これで、次の方法を学習しました。
これらのスキルは、Docker イメージを操作するための基盤を形成し、コンテナ化の旅を続ける上で役立ちます。
この実践的なチュートリアルでは、Docker コンテナイメージのクローン作成の完全なプロセスを学習しました。まず、Docker の基本を理解し、環境を確認することから始めました。次に、公式の Nginx イメージをプルし、コンテナとして実行しました。次に、その内容を変更してこのコンテナをカスタマイズし、それらの変更をコミットして独自のカスタムイメージを作成しました。
また、バージョン管理と配布のためにイメージに適切にタグ付けする方法、手動転送のためにイメージをファイルに保存する方法、および変更をドキュメント化する方法も学習しました。最後に、Docker イメージを操作するためのベストプラクティスを検討し、環境をクリーンアップしました。
これらのスキルは、開発環境と本番環境で Docker を使用するための強固な基盤を提供します。これで、特定の要件に合わせて Docker イメージを自信を持って作成およびカスタマイズし、アプリケーションをさまざまな環境でよりポータブルで一貫性のあるものにすることができます。