Dockerコンテナーの特徴は、不変性です。いつでも、コンテナを破棄して再作成し、初期状態を再確立できます。 docker commit
を使用する コマンドを使用すると、コンテナイメージに新しい変更をコミットできますが、期待するほど簡単ではありません。
docker commit
を使用して新しいコンテナイメージに変更をコミットする方法を見てみましょう コマンド!
コンテナーは不変(変更されない)になるように構築されているのに、なぜコンテナーに変更をコミットしたいのでしょうか。いくつかの理由があります。
- 変更をすばやくテストするための新しいコンテナ化されたサービスの開発中。
- 最初にソースイメージを修正することなく、本番サービスのバグ修正を迅速に実行します。
-
commit
を使用する イメージのスナップショットを作成し、イメージを新しいサーバーにエクスポートします。
これらはすべての潜在的なシナリオをカバーしているわけではありませんが、docker commit
を使用することを可能にするいくつかのシナリオです。 完璧なユースケース。
一見単純なコマンドの場合、このコマンドは多くのことを実行します。
以下は、commit
の簡単な例です。 指図。実行中のコンテナIDを使用して、d3fdd3517e0a
この例では、myrepository
というリポジトリに新しい画像が作成されます changedimage
という名前です 。
元の画像はversion2
としてタグ付けされています 、これは必須ではありませんが、同じ名前の画像間の変更を追跡するのに役立ちます。
両方の
myrepository
およびchangedimage
は任意に選択されますが、これらは通常、customimages/alpine-linux
などの適切にラベル付けされたリソースを反映します。 。
docker commit d3fdd3517e0a myrepository/changedimage:version2
Dockerコンテナーは、読み取り/書き込みレイヤーが上にある一連の読み取り専用イメージです。上記の例では、Dockerは実行中のコンテナーを一時停止します。この一時停止は、Dockerがイメージを作成しているときに誤ってデータが破損するのを防ぐためです
この一時停止はサービスの中断を引き起こす可能性があるため、
--pause=false
を使用できます 。書き込みが正常に完了しない可能性があるため、データが破損する可能性があります。
さらに、commit
操作は、コンテナ内にマウントされたボリュームに含まれるデータを省略します。ボリュームはコンテナのファイルシステム自体の一部ではないため、Dockerはそれらを無視します。
コミット操作が完了すると、Dockerは新しいコンテナイメージ名の下に元のイメージからの変更を含む新しいレイヤーを作成します。
このチュートリアルの唯一の前提条件はDocker自体です。これは、WindowsのDocker Desktopソフトウェアを介してインストールすることも、Linuxのパッケージを介してインストールすることもできます。
関連:Windowsでの最初のDockerコンテナのデプロイ
ここで、docker commit
の一般的なシナリオをいくつか見てみましょう。 コマンドは便利かもしれません。
まず、パブリックDockerリポジトリからAlpineLinuxコンテナイメージをプルダウンします。アルパインは、最大5MBのサイズで示されているように、スリムなコンテナで知られています。
# Pull the latest Alpine Linux image
docker pull alpine
# List all Docker images
docker images
docker commit
の主な使用例 新しいコンテナイメージの開発です。この画像は、最終的には他の画像のベースとして、または本番コンテナ自体として使用される可能性があります。
以下のスニペットの例では、Dockerは次のとおりです。
- 以前にプルした
alpine
を実行する 画像 - インタラクティブシェルを開いてパッケージをインストールする
- htopパッケージのインストール
# Open an interactive shell to the Docker Alpine Linux container
docker run -it a24bb4013296 bin/sh
# Install the HTOP package
apk add htop
htop
を実行すると、パッケージがコンテナに正しくインストールされていることがわかります。 コマンド。
パッケージを新しい「レイヤー」にインストールしたら、その変更を元のベースイメージにコミットする必要があります。そのためには:
-
docker ps -a
を実行します コンテナIDを見つけるため。 - コンテナIDを使用して、現在のレイヤーのコンテンツを新しいベースイメージにコミットします。
以下の例では、新しいイメージの名前はalpine-htop
です。 タグ付けされたversion1
。同様の名前のDockerイメージバージョンを簡単に追跡できるように、イメージにタグが付けられています。
# List all Docker containers regardless of status, -a or --all to show every container
docker ps -a
# Commit the layer to a new image named alpine-htop and tagged version1
docker commit b57e066d5bfa alpine-htop:version1
# List all images available
docker images
多くの場合、エラーのある本番サービスがある可能性があります。既知の修正がある可能性があり、既存の構成を変更して再デプロイするよりも迅速に修正を適用できます。 docker commit
を使用する 、修正をすばやく適用してから、バックグラウンドで作業して他の必要なコンポーネントを更新できます。
以下のスニペットの例は、NGINXをAlpineLinuxDockerイメージにインストールする方法を示しています。
# First List the available images
docker images
# Run an interactive session for the alpine-htop image
docker run -it a24bb4013296 bin/sh
# Install the NGINX package
apk add nginx
# Create the location for the NGINX PID file
mkdir /run/nginx
# Verify that NGINX is installed
nginx -v
# Run NGINX
/usr/sbin/nginx
# Verify that NGINX is properly running
ps | grep nginx
# Kill the NGINX process
kill 18
# Verify that the NGINX process is no longer active
ps | grep nginx
上で作成した新しいNGINXコンテナをalpine-nginx
という名前の新しいイメージにコミットします タグ付きのversion1
。同じ画像の異なるバージョンを区別するために、画像にタグを付けることがベストプラクティスです。
# List all Docker containers regardless of status, -a or --all to show every container
docker ps -a
# Commit the changes to a new image named alpine-nginx
docker commit 37043139525c alpine-nginx:version1
# Verify that the new image was created
docker images
すべての実行可能ファイルをバックグラウンドで実行できるわけではなく、NGINXも例外ではありません。 NGINXをバックグラウンドで実行してこのコンテナを適切に実行するには、-g 'daemon off;'
を渡します。 NGINXのオプション。
# Run the NGINX container in the background
docker run -d f6b46a3b76be /usr/sbin/nginx -g 'daemon off;'
# Verify that the container is running
docker ps -a
最後に、--change
を使用します ポート80を公開するように切り替えます。--change
を利用する パラメータ、EXPOSE 80
コマンドはコンテナのDockerFileに書き込まれます。この変更が行われたら、新しいコンテナを起動します。新しいコンテナが開始されたら、公開されたポートなしで誤って実行された前のコンテナを停止します。これは、機能していないコンテナを機能しているコンテナに適切に移行するのに役立ちます。
# List all running containers
docker ps -a
# Commit the changes to a new image with an exposed port 80
docker commit --change "EXPOSE 80" c649c813d985 alpine-nginx:version2
# List the running containres
docker ps -a
# List all Docker images
docker images
# Run the newly created image
docker run -d c71f0f9cef7b /usr/sbin/nginx -g 'daemon off;'
# List running containers
docker ps -a
# Stop the prior container without the exposed port 80
docker stop c649c813d985
# List running containers
docker ps -a
Dockerイメージのスナップショット
最後に、実行中のコンテナーのスナップショット(ある時点のイメージ)を使用して、コンテナーを新しいサーバーに移動する必要があるシナリオについてはどうでしょうか。 docker commit
以下に示すように、コマンドはそれを行うのにうまく機能します。
以下のコマンドは、新しいalpine-nginx
を停止してコミットする実行中のコンテナーを作成します バージョン。
# List running Docker containers
docker ps -a
# Create a new running Docker NGINX container
docker run -d c71f0f9cef7b
# List running Docker containers
docker ps -a
# Stop the Docker container
docker stop 7ff99f2bcf6b
# Create a new alpine-nginx version to export
docker commit 7ff99f2bcf6b alpine-nginx:version3
# List the Docker images available
docker images
Dockerイメージをファイルにエクスポートします。この例では、エクスポートファイルの名前はexport.tar
です。 、ただし、必要に応じてファイルに名前を付けます。最後に、export.tar
をインポートします ファイルをDockerに戻し、エンドツーエンドのプロセスを示します。
必ず
repo:tag
の形式を使用してエクスポートしてください 画像を再インポートするときにこれらのラベルを維持したい場合。
# Save the image to a file on the local disk
docker save -o export.tar alpine-nginx:version3
# Verify that the image exists
ls
# Remove the just exported Docker image
docker rmi 39ca9e64828a
# List Docker images and verify that the image is removed
docker images
# Load the Docker image back in
docker load -i export.tar
# List Docker images and show that the image has been loaded back in
docker images
Dockerコミットコマンドの追加オプション
commit
で利用可能な追加オプションを活用する コマンド、多くの異なるシナリオがサポートされています。
コンテナの一時停止
実行中にコンテナを一時停止しないようにするには、--pause=false
を渡すことができます。 一時停止機能を無効にするコマンド。これは、本番サービスをバックアップし、そのサービスを一時停止すると有害になる場合によく使用されます。
一時停止コマンドには、-p
の省略形もあります。 それを使用する方が速いかもしれません。ただし、コンテナの一時停止をバイパスすることにより、ファイルシステムへの書き込みが発生した場合にデータが破損するリスクがあり、不完全または破損したデータが書き込まれる可能性があることに注意してください。
コミットメッセージを残す
多くの開発者によく知られているのは、正しいコミットメッセージを提供することです。ソース管理を使用する場合と同様に、理想的には、コンテナの新しいバージョンがコミットされた理由を説明する有用なメッセージを提供する必要があります。
これは、--message="message to commit"
を使用して実行できます。 指図。以前と同様に、このコマンドの短縮版である-m
があります。 。 Dockerコミットメッセージのリストを表示するには、docker history
を使用します コマンド。
作成者の定義
誰が変更を作成しているかを適切に示すために、誰が変更を行っているかを示す追加のコンテキストを提供する作成者の値を指定できます。これは、--author="Jane Author ([email protected])"
を介して使用できます。 。このコマンドは、-a
の省略形でも使用できます。 。 docker inspect
を使用する 著者などのラベルを含むコンテナ情報のJSONリストを取得できるようになります。
DockerFileの変更を並行して適用する
最後に、docker commit
で使用できる最も複雑なコマンド コマンドはchange
です パラメータ。このパラメータは、コミットと同時にコンテナ内の変更をDockerFileに適用します。
change
を使用できます このようにDockerfileに命令を渡すことにより、パラメータを設定します。--change="ENV TEST true"
。このコマンドは、ENV TEST true
というテキストを入力します。 DockerFileに。これで、コンテナが再び起動したときに、ここで指定した変更がすでに適用されています。
--change
の代わりに 名前、ショートカットを使用して-c
を使用できます エイリアス。
このコマンドを使用して、複数の--change
をチェーンすることもできます 一緒にパラメータ。これにより、1つのコミットコマンドでDockerFileに複数の変更を簡単に追加できます。
change
で使用できるコマンドはごくわずかです。 以下に示すパラメータ。
-
CMD
– CMD命令は、CMD ["executable","parameter1","parameter2"]
の形式を取ります。 。これが推奨される方法ですが、CMD
は1つだけであることに注意してください。 一度にDockerFileに存在できます。最後のCMD
有効になるものになります。CMD
の主な目的 作成時にコンテナのデフォルトの実行コマンドを提供することです。 ENTRYPOINT
– CMDコマンドと同様に、ENTRYPOINTはENTRYPOINT ["executable","parameter1","parameter2"]
の構文を使用します。 。この構文は、なぜCMDではなくENTRYPOINTを使用するのかという疑問を投げかけます。
ENTRYPOINTコマンドは、PID 1
のプライマリプロセスとして実行可能ファイルを実行します 。このアクションにより、docker stop
を使用してプロセスをシャットダウンできます。 優雅に。さらに、CMD
を使用できます これで、executable
を省略します それらのパラメータをENTRYPOINT
に渡す部分 実行可能ファイル。-
ENV
–ほとんどのアプリケーションは環境変数を消費するため、ENVコマンドを使用すると、これらをENV key=value
のキー値形式で簡単に設定できます。 。これらのkey=value変数に標準のLinux環境変数としてアクセスします。 EXPOSE
– EXPOSEコマンドは、コンテナーの外部にポートとオプションのプロトコルを公開します。このコマンドは、コンテナ内のポートをコンテナの外部にマップし、コンテナがコンテンツを提供するWebサーバーなどの外部リソースと対話できるようにします。LABEL
– LABELコマンドは、メタデータをコンテナーに追加します。LABEL version="2.0"
の形式を使用してメタデータを追加できます 追加のメタデータを表示するには、dockerimageinspectコマンドを使用します。ONBUILD
– ONBUILDコマンドは、イメージが別のコンテナービルドのベースとして使用されるときに後で実行する命令を追加します。このパラメーターは、ADDコマンドとRUNコマンドを使用して、ADDコマンドでコンテンツを追加するか、実行可能ファイルを実行します。USER
-USERコマンドは、イメージの実行時に使用するユーザー名(またはUID)とオプションでユーザーグループ(またはGID)を設定します。これはUSER myuser:mygroup
のように見えます 実際には。- ボリューム–ほとんどのコンテナでは、何らかの方法でデータにアクセスする必要があります。 VOLUMEコマンドは、外部にマウントされたボリュームを保持していることを示す、指定された名前のマウントポイントを作成します。これは一般的に次のように使用されます。
VOLUME ["/data"]
。 -
WORKDIR
–最後に、WORKDIRコマンドは、作業ディレクトリーをCMDまたはENTRYPOINTコマンドに設定します。これは、WORKDIR /path/to/directory
のように使用されます。 。 WORKDIRは、実行可能ファイルを開始する必要があるが、その場所がデフォルトのPATH環境変数にない場合に役立ちます。
docker commit
コマンドは驚くほど複雑です。単純な構文がありますが、commitコマンドを使用してDockerFileの変更を追加する機能を使用すると、DockerFileを介してコンテナーを次に作成するときに保持される変更をすばやく行うことができます。
このコマンドはすべての状況で必要なわけではありませんが、迅速なトラブルシューティングやサーバー間で簡単に移動できるコンテナーのスナップショットを作成するには、commitコマンドがすぐに役立ちます!