Dockerイメージは不変に設計されており、一度作成されたイメージは変更されません。この特性により、同じイメージからインスタンス化されたすべてのコンテナが同一に動作するため、開発者や運用担当者にとって信頼性の高い環境が実現します。さらに、異なるイメージバージョンの管理も簡素化されます。しかし、構成の更新や新しいソフトウェアパッケージの追加など、実行中のコンテナ内の要素を変更しなければならない場合もあります。このようなシナリオでは、このdocker commitコマンドが非常に役立ちます。このコマンドを使用すると、実行中のコンテナに加えられた変更を保持し、それらの変更に基づいて新しいイメージを生成できます。この機能は、迅速なテスト、反復的な開発、そして完全な再構築を必要とせずにカスタマイズされたイメージを作成する場合に特に役立ちます。
Dockerイメージの不変性を理解する
Dockerイメージのアーキテクチャは、複数の読み取り専用レイヤーで構成されています。コンテナが実行されると、Dockerはコンテナレイヤーと呼ばれる書き込み可能なレイヤーを最上位に追加します。すべての変更はこの最上位レイヤーでのみ行われます。コンテナが削除されると、コンテナ内で行われた変更はすべて失われますが、元のイメージの整合性は維持されます。この設計には、いくつかの重要な利点があります。
- 同じイメージから派生したコンテナ間での動作が統一され、一貫性が確保されます。
- コンテナ間の変更を分離して予測可能性を高めます。
- 他のイメージに影響を与える変更を気にせずに、特定のイメージ バージョンを安全にタグ付けします。
この構造は安定性を高めますが、実行中のコンテナに瞬時に調整を加えることが困難です。ここで、docker commitコマンドが極めて重要になります。
実行中のコンテナから新しいイメージを生成する
このdocker commitコマンドを使用すると、実行中のコンテナの現在の状態をスナップショットし、新しいイメージを作成できます。この操作により、インストールされたアプリケーションや設定の変更など、コンテナに加えられた変更がすべてキャプチャされ、新しいレイヤーに保存されます。元のイメージは影響を受けないため、実験や迅速なイテレーションが可能になります。

この機能は、カスタマイズした設定を将来使用するために保存したり、テスト中に軽微な修正を適用したり、最初からやり直すことなく更新されたイメージをチームと共有したりするのに最適です。docker commitコマンドの一般的な構文は次のとおりです。
docker commit [OPTIONS] CONTAINER_ID NEW_IMAGE_NAME[:TAG]
この構文では、
-
CONTAINER_ID: キャプチャするコンテナの一意の ID または名前。 -
NEW_IMAGE_NAME: 新しく作成されたイメージに付ける名前。 -
TAG: オプションのパラメータ。デフォルトは「最新」に設定されています。
このdocker commitコマンドには、メタデータの追加、設定変更の実装、コミット動作の変更など、様々なオプションが用意されています。以下の表に、利用可能なオプションの概要を示します。
| オプション | 長編 | 説明 | 例 |
|---|---|---|---|
| -あ | -著者 | 画像のメタデータに著者名を含めます。 | docker commit -a "Anees"my-container my-image |
| -c | -変化 | ENV、LABEL、CMD などの Dockerfile 命令を新しいイメージに適用します。 | docker commit -c "ENV APP_ENV=prod"my-container my-image |
| -m | -メッセージ | 画像に加えられた変更を要約した簡単なメッセージを添付します。 | docker commit -m "Installed curl"my-container my-image |
| -p | -一時停止 | 一貫性を確保するために、コミット プロセス中にコンテナーを一時停止します (デフォルト: true)。 | docker commit --pause=false my-container my-image |
docker commit の使い方のステップバイステップガイド
の実際の使用例を説明するとdocker commit、Dockerfileを変更せずにAlpineコンテナにcurlユーティリティをインストールしたいとします。まず、Alpineベースイメージからコンテナを起動します。
docker run -it alpine:latest /bin/sh
コンテナ内に入ったら、次のコマンドを実行して必要な調整を実施します。
apk update && apk add curl

変更が完了したら、コンテナを終了します。
exit
次に、これらの変更をコミットして新しいイメージを作成します。
docker commit <container_id> alpine-with-curl:1.0

新しいイメージの作成を確認するには、次のコマンドを実行します。
docker images
curl がプリインストールされた新しいイメージを利用できるようになりました。

新しいDockerイメージのテスト
新しいイメージが作成されたら、それに基づいてコンテナを実行し、変更が保存されていることを確認できます。
docker run -it alpine-with-curl:1.0 /bin/sh
このコマンドは、イメージから生成されたコンテナ内で対話型シェルを開きますalpine-with-curl:1.0。変更が保存されているかどうかを確認できます。
curl --version
このコマンドを実行すると、新しいイメージ内で変更がそのまま反映されていることが確認されます。

docker commit vs Dockerfile: 適切なツールの選択
Dockerfileとdocker commitDockerイメージの作成はどちらも容易ですが、目的と用途は異なります。一貫性と再現性のあるビルドが必要な場合、特に継続的インテグレーションや本番環境のシナリオでは、Dockerfileを使用するのが推奨されます。この方法では、すべての変更がコード形式で明確かつ簡潔に記録されるため、経時的な管理、分析、制御が容易になります。これにより、将来のイメージビルドでも同じ結果が得られることが保証され、継続的なサポートとチームワークにとって非常に重要です。
逆に、docker commitDockerfile全体を修正することなく、迅速な修正、テストの実行、または軽微な調整を即座に行うには有利です。この方法は、実験、デバッグ、または変更の即時検証の際に特に役立ちます。ただし、この方法にはドキュメントが不足しているため、長期的な本番環境での使用よりも、一時的な調整に適しています。
まとめると、docker commit主に実験や一時的な修正に使用し、本番環境品質のイメージはDockerfileに頼ることになります。他の重要なDockerコマンドの知識を広げることで、コンテナ、イメージ、統合ワークフローを扱う際の経験も向上します。