GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

DockerCommitを使用してコンテナイメージを変更する方法

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コンテナイメージへの変更のコミット

ここで、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命令は、C MD ["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コマンドがすぐに役立ちます!


Docker
  1. Dockerfileを使用してDockerイメージを構築する方法

  2. Dockerイメージを他の人と共有する方法

  3. コンテナと Dockerfile から Docker イメージを作成する方法

  1. Dockerイメージを変更する方法

  2. Dockerイメージに変更をコミットする方法

  3. Dockerコンテナからカスタムイメージを作成する方法

  1. ホスト間でDockerイメージを移動する方法

  2. Dockerコンテナのタイムゾーンを変更する方法

  3. Minikube でローカル docker イメージを使用するには?