はじめに
この実験では、既存のコンテナから新しい Docker イメージを作成するためにdocker container commitコマンドを使用する方法を学びます。まずコンテナを起動して変更を加え、その後それらの変更を新しいイメージにコミットします。
また、新しい設定(新しい CMD や EXPOSE 命令の設定など)を含めてコンテナの変更をコミットする方法も探求し、実行中のコンテナに基づいてカスタムイメージを作成する柔軟性を実証します。
コンテナの起動と変更
このステップでは、Docker コンテナを起動し、その内部で変更を加える方法を学びます。シンプルな Ubuntu イメージを使用してこのプロセスを実演します。
まず、Ubuntu イメージをプルしましょう。このコマンドは Docker Hub から Ubuntu イメージをローカルマシンにダウンロードします。
docker pull ubuntu:latest
イメージがダウンロードされていることを示す出力が表示されるはずです。ダウンロードが完了したら、このイメージを基にコンテナを実行できます。
次に、Ubuntu イメージを使用してインタラクティブなコンテナを実行します。-itフラグは疑似 TTY を割り当て、stdin を開いたままにすることで、コンテナのシェルと対話できるようにします。--nameフラグはコンテナに名前を割り当て、後で参照しやすくします。
docker run -it --name my-ubuntu ubuntu:latest /bin/bash
このコマンドを実行すると、コンテナの bash シェル内に入ります。ホスト名を確認することでこれを確認できます(ホスト名はコンテナ ID になります)。
コンテナ内で、シンプルなファイルを作成しましょう。echoコマンドを使用して、ルートディレクトリにhello.txtというファイルにテキストを書き込みます。
echo "Hello from inside the container!" > /hello.txt
catコマンドを使用して、ファイルが作成され、正しい内容が含まれていることを確認できます。
cat /hello.txt
「Hello from inside the container!」という出力が表示されるはずです。
コンテナ内で変更を加えたので、コンテナのシェルを終了しましょう。
exit
これでホストマシンのターミナルに戻りました。コンテナはまだバックグラウンドで実行されています。実行中のコンテナをリスト表示することでこれを確認できます。
docker ps
my-ubuntuコンテナがリストに表示されるはずです。
コンテナの変更を新しいイメージにコミット
前のステップでは、ファイルを作成することで実行中のコンテナ内に変更を加えました。ここでは、これらの変更を新しい Docker イメージとして保存する方法を学びます。このプロセスを「コンテナのコミット」と呼びます。
コンテナをコミットすると、コンテナのファイルシステムや設定に加えた変更を含む新しいイメージが作成されます。これは既存のイメージを基にカスタムイメージを作成する際に便利です。
コンテナをコミットするにはdocker commitコマンドを使用します。基本的な構文はdocker commit [container_name] [new_image_name]です。ここではmy-ubuntuコンテナをコミットし、新しいイメージにmy-ubuntu-modifiedという名前を付けます。
docker commit my-ubuntu my-ubuntu-modified
新しく作成されたイメージの ID を示す長い文字列が出力されるはずです。
新しいイメージが作成されたことを確認しましょう。docker imagesコマンドを使用してシステム上のすべてのイメージをリスト表示できます。
docker images
元のubuntuイメージと共に、my-ubuntu-modifiedが出力に表示されるはずです。
変更が新しいイメージに保存されたことを確認するために、my-ubuntu-modifiedを基に新しいコンテナを実行し、前のステップで作成したファイルを確認しましょう。
docker run -it --name my-ubuntu-test my-ubuntu-modified /bin/bash
新しいコンテナ内に入ったら、/hello.txtファイルの存在を確認します。
cat /hello.txt
「Hello from inside the container!」という出力が表示され、変更が新しいイメージに正常にコミットされたことが確認できます。
次に、コンテナを終了します。
exit
最後に、作成したテストコンテナをクリーンアップしましょう。
docker rm -f my-ubuntu-test
新しい設定でコンテナ変更をコミット
このステップでは、コンテナの変更をコミットする際に新しい設定も含める方法を学びます。これにより、コンテナ起動時に実行するデフォルトコマンドや環境変数などの設定を定義できます。
前のステップで使用したmy-ubuntuコンテナを引き続き使用します。まず、現在の状態をコミットするため、コンテナを停止しましょう。
docker stop my-ubuntu
コンテナ名my-ubuntuが出力され、停止したことが確認できます。
次に、コンテナをコミットし、新しいイメージにラベルを追加します。ラベルはイメージにメタデータを追加するためのキーと値のペアです。ここでは修正イメージのバージョンを示すラベルを追加します。-cフラグの後に設定命令を記述します。
docker commit -c 'LABEL version="1.0"' my-ubuntu my-ubuntu-labeled
新しく作成されたイメージの ID が出力されます。
新しいイメージmy-ubuntu-labeledが作成され、ラベルが適用されたことを確認しましょう。docker inspectコマンドを使用してイメージの詳細情報を表示できます。
docker inspect my-ubuntu-labeled
出力は大きな JSON オブジェクトになります。"Config"ブロック内の"Labels"セクションを探してください。"version": "1.0"が表示されているはずです。
または、docker inspectにフィルタリングを適用してラベルを直接確認することもできます。
docker inspect --format '{{.Config.Labels}}' my-ubuntu-labeled
このコマンドはイメージに関連付けられたラベルのみを出力します。map[version:1.0]のような結果が表示されるはずです。
コミット時に環境変数を設定するなど、他の設定も追加できます。my-ubuntuコンテナを再度コミットし、今度は環境変数を追加しましょう。
docker commit -c 'ENV MY_VARIABLE="Hello Docker"' my-ubuntu my-ubuntu-env
docker inspectを使用して新しいイメージと環境変数を確認します。
docker inspect --format '{{.Config.Env}}' my-ubuntu-env
[PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin MY_VARIABLE=Hello Docker]のような出力が表示され、環境変数が設定されていることが確認できます。
新しい CMD と EXPOSE 命令でコンテナ変更をコミット
この最終ステップでは、コンテナの変更をコミットし、新しいイメージのデフォルトコマンド(CMD)と公開ポート(EXPOSE)を設定する方法を学びます。
CMD命令は、コマンドを指定せずにイメージからコンテナを起動した際に実行されるデフォルトコマンドを設定します。EXPOSE命令は、Docker に対してコンテナが実行時に指定されたネットワークポートでリッスンすることを通知します。
my-ubuntuコンテナを再度コミットし、今回は/hello.txtの内容を表示するデフォルトコマンドを設定し、ポート 80 を公開します。
まず、my-ubuntuコンテナが停止していることを確認してください。
docker stop my-ubuntu
次に、CMDとEXPOSE命令を含めてコンテナをコミットします。CMD命令は文字列の JSON 配列として指定することに注意してください。
docker commit -c 'CMD ["cat", "/hello.txt"]' -c 'EXPOSE 80' my-ubuntu my-ubuntu-final
新しく作成されたイメージの ID が出力されます。
docker inspectを使用して、新しいイメージmy-ubuntu-finalのCMDとEXPOSE設定を確認しましょう。
docker inspect --format '{{.Config.Cmd}}' my-ubuntu-final
[cat /hello.txt]が出力され、デフォルトコマンドが設定されていることを確認できます。
次に、公開ポートを確認します。
docker inspect --format '{{.Config.ExposedPorts}}' my-ubuntu-final
map[80/tcp:{}]のような出力が表示され、ポート 80 が公開されていることがわかります。
最後に、この新しいイメージからコマンドを指定せずにコンテナを実行し、デフォルトのCMDが機能するか確認しましょう。
docker run --rm my-ubuntu-final
--rmフラグは、コンテナが終了時に自動的に削除されるようにします。デフォルトコマンドがcat /hello.txtであるため、コンテナは起動し、"Hello from inside the container!"と表示した後、終了します。
ターミナルに"Hello from inside the container!"と表示されるはずです。
これにより、コンテナの変更をコミットし、結果のイメージのデフォルト動作とネットワーク設定を定義する方法が実証されました。
まとめ
この実験では、Docker コンテナの起動と変更方法を学びました。Ubuntu イメージをプルし、それに基づいてインタラクティブなコンテナを実行し、コンテナ内でファイルを作成し、コンテナを実行したままシェルから退出しました。
その後、実行中のコンテナ内で行った変更をコミットして新しい Docker イメージを作成する方法を学びました。このプロセスにより、コンテナの現在の状態を再利用可能なイメージとして保存できます。



