Docker コンテナイメージのクローン作成ステップバイステップガイド

DockerBeginner
オンラインで実践に進む

はじめに

このチュートリアルでは、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 が正しく動作していることを確認するために、簡単なテストコマンドを実行しましょう。

docker run hello-world

このコマンドは、hello-world イメージをダウンロードして実行し、確認メッセージを出力して終了します。次のような出力が表示されるはずです。

Hello from Docker!
This message shows that your installation appears to be working correctly.

Docker イメージのリスト表示

システムで現在利用可能な Docker イメージを確認するには、以下を実行します。

docker images

このコマンドは、現在ローカルに保存されているすべての Docker イメージを一覧表示します。出力には、イメージリポジトリ、タグ、イメージ ID、作成日、およびサイズが表示されます。

Docker が正しく動作することを確認したので、次のステップで Docker イメージの操作を開始する準備ができました。

Docker イメージのプルと実行

このステップでは、Docker Hub から Docker イメージをプルし、ローカルシステムで実行します。これは、Docker イメージのクローン作成プロセスの最初のステップです。

Docker Hub とは?

Docker Hub は、ユーザーがコンテナイメージを見つけて共有できるクラウドベースのレジストリサービスです。ソフトウェアベンダーによってメンテナンスされている多くの公式イメージと、コミュニティによって提供されたイメージが含まれています。

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 コンテナの実行

次に、先ほどプルした 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 イメージを正常にプルして実行できたので、次のステップでそれに基づいて独自のカスタムイメージを作成する準備ができました。

カスタム Docker イメージの作成

Nginx コンテナが実行されているので、それを変更してカスタムイメージを作成します。これがクローン作成プロセスの核心です。以下を行います。

  1. 実行中のコンテナに変更を加える
  2. これらの変更から新しいイメージを作成する
  3. 新しいイメージに基づいてコンテナを実行する

Docker イメージ作成の理解

Docker イメージは、次の 2 つの方法で作成できます。

  1. Dockerfile を使用する(本番環境で推奨されるアプローチ)
  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

これらのコマンドは、次のことを行います。

  1. 元のコンテナを停止します
  2. 元のコンテナを削除します
  3. カスタムイメージに基づいて新しいコンテナを作成し、ポート 8081 にマッピングします

新しいコンテナのテスト

新しいコンテナが正しく実行されていることを確認しましょう。

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 イメージを作成したので、適切にタグ付けし、共有できるように準備する方法を学びます。実際のシナリオでは、Docker Hub などのレジストリにイメージをプッシュしますが、このチュートリアルでは、準備手順に焦点を当てます。

Docker イメージタグの理解

Docker イメージは、リポジトリ名とタグによって識別されます。タグは、イメージのバージョン管理と整理に役立ちます。デフォルトのタグは latest ですが、意味のあるバージョンタグを使用することをお勧めします。

イメージへのタグの追加

カスタムイメージにさらにいくつかのタグを追加しましょう。

docker tag my-custom-nginx:v1 my-custom-nginx:latest
docker tag my-custom-nginx:v1 my-custom-nginx:stable

これらのコマンドは、イメージに lateststable の 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 などのレジストリにイメージをプッシュします。これを行うには、次のものが必要になります。

  1. Docker Hub でアカウントを作成する
  2. ターミナルから Docker Hub にログインする
  3. Docker Hub のユーザー名でイメージにタグを付ける
  4. イメージをプッシュする

デモンストレーションのために、Docker Hub のユーザー名が yourusername であると仮定しましょう。イメージをプッシュするための準備方法は次のとおりです。

docker tag my-custom-nginx:v1 yourusername/my-custom-nginx:v1

イメージをプッシュするには(実際のシナリオでは)、次のようにします。

## これはデモンストレーション専用です - 実際にはプッシュしません
## docker push yourusername/my-custom-nginx:v1

Docker イメージをファイルに保存する

レジストリにプッシュする代わりに、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 イメージを操作するためのいくつかのベストプラクティスについて説明し、環境をクリーンアップします。

Docker イメージのベストプラクティス

1. 特定のタグを使用する

latest タグに依存するのではなく、常に特定のバージョンタグを使用してください。これにより、デプロイメントの一貫性が確保されます。

## より良いアプローチ
docker pull nginx:1.23.2

## 予測しにくい
docker pull nginx:latest

2. イメージを小さく保つ

イメージが小さいほど、ダウンロードが速くなり、ストレージの使用量が少なくなります。可能であれば、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 バージョンは大幅に小さくなっています!

3. マルチステージビルドを使用する

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"]

4. イメージをドキュメント化する

カスタムイメージについては、常に次のものを含むドキュメントを維持してください。

  • イメージの目的
  • 使用方法
  • 行った変更
  • 設定オプション

前のステップで簡単なドキュメントファイルを作成しました。

5. 脆弱性のスキャン

イメージを定期的に脆弱性についてスキャンします。

## スキャンの例(Docker Desktop にはこれが組み込まれています)
## docker scan my-custom-nginx:v1

Docker イメージの検査

Docker イメージを検査するための便利なコマンドを見てみましょう。

docker inspect my-custom-nginx:v1

このコマンドは、イメージのレイヤー、設定、環境変数など、イメージに関する詳細情報を表示します。

イメージ履歴の表示

イメージがどのように構築されたかの履歴を確認できます。

docker history my-custom-nginx:v1

これにより、イメージの各レイヤーと、それらを作成したコマンドが表示されます。

クリーンアップ

それでは、作成したコンテナとイメージを削除して、環境をクリーンアップしましょう。

  1. まず、カスタムコンテナを停止して削除します。
docker stop my-custom-container
docker rm my-custom-container
  1. 作成したイメージを削除します。
docker rmi my-custom-nginx:v1 my-custom-nginx:latest my-custom-nginx:stable
  1. 必要に応じて、Nginx イメージを削除します。
docker rmi nginx:latest nginx:alpine
  1. すべてのコンテナとイメージが削除されたことを確認します。
docker ps -a
docker images

Docker System Prune の使用

Docker には、未使用のリソースをクリーンアップするための便利なコマンドが用意されています。

docker system prune

これにより、停止したすべてのコンテナ、未使用のネットワーク、ぶら下がっているイメージ、およびビルドキャッシュが削除されます。続行する前に確認を求められます。

より積極的なクリーンアップを行うには、次を使用できます。

docker system prune -a

これにより、ぶら下がっているイメージだけでなく、未使用のすべてのイメージも追加で削除されます。

結論

これで、次の方法を学習しました。

  1. Docker イメージのプルと実行
  2. 実行中のコンテナの変更
  3. 変更をコミットして新しいカスタムイメージを作成する
  4. 組織と配布のためのイメージへのタグ付け
  5. 手動転送のためにイメージをファイルに保存する
  6. カスタムイメージのドキュメント化
  7. Docker 環境のクリーンアップ

これらのスキルは、Docker イメージを操作するための基盤を形成し、コンテナ化の旅を続ける上で役立ちます。

まとめ

この実践的なチュートリアルでは、Docker コンテナイメージのクローン作成の完全なプロセスを学習しました。まず、Docker の基本を理解し、環境を確認することから始めました。次に、公式の Nginx イメージをプルし、コンテナとして実行しました。次に、その内容を変更してこのコンテナをカスタマイズし、それらの変更をコミットして独自のカスタムイメージを作成しました。

また、バージョン管理と配布のためにイメージに適切にタグ付けする方法、手動転送のためにイメージをファイルに保存する方法、および変更をドキュメント化する方法も学習しました。最後に、Docker イメージを操作するためのベストプラクティスを検討し、環境をクリーンアップしました。

これらのスキルは、開発環境と本番環境で Docker を使用するための強固な基盤を提供します。これで、特定の要件に合わせて Docker イメージを自信を持って作成およびカスタマイズし、アプリケーションをさまざまな環境でよりポータブルで一貫性のあるものにすることができます。