docker commitコマンドの使い方(実例付)CE対応


 docker commitコマンドの使い方を解説します。Docker CE ver17.12.1に対応してます。

 このコマンドは、コンテナに対して行った設定や更新したファイルを、新しいDockerイメージとして格納することが出来ます。つまり、現状のコンテナの状態をDockerイメージとして保存することが可能です。

 例えば、公式なCentOSのDockerイメージを独自にカスタマイズして、個人用のCentOSイメージを作成することも可能です。

 それでは以下で詳細に解説いたします。

 

docker commitコマンドのフォーマットとオプション

フォーマット

docker commit [オプション] [コンテナ] [リポジトリ[:タグ]]

 

主なオプション一覧

-a, --author=""
Dockerイメージ作者の情報を設定する

-c, --change=""
対象コンテナのベースイメージに設定された各種設定を追加/変更する

-m, --message=""
コミットメッセージを設定する

-p, --pause=true
commitを実行する際にコンテナを一時停止する(デフォルトは一時停止)

■ 本記事の目次に戻る ■

docker commitコマンドの主な使い方

 以下の実例は、CentOSの公式イメージにより起動したコンテナ(testvm)を使用します。コンテナは「docker run -d --name testvm centos init」で起動します。

 

コンテナの現状をDockerイメージとして保存する

 以下の起動中のコンテナがあります。

$ docker ps
CONTAINER ID  IMAGE   COMMAND CREATED       STATUS       PORTS NAMES
9b967148b532  centos  "init"  3 seconds ago Up 2 seconds       testvm

 これから、このコンテナ内にファイルを作成し、その後、このコンテナのDockerイメージを作成したいと思います。

 まず、コンテナのルートディレクトリ上に、ファイル「test-vm.txt」を作成します。

$ docker exec testvm touch /test-vm.txt
$ docker exec testvm ls -l /test-vm.txt
-rw-r--r-- 1 root root 0 Oct 28 07:21 /test-vm.txt

 このコンテナtestvmを、以下のdocker commitコマンドにて、「testvm-new:v1.1」というイメージ名のDockerイメージとして保存します。

$ docker commit testvm testvm-new:v1.1

 docker imagesコマンドにて、Dockerイメージが作成されているか確認します。

$ docker images
REPOSITORY   TAG   IMAGE ID      CREATED        SIZE
testvm-new   v1.1  bd1136bacce2  8 seconds ago  196.8 MB

 次に、このDockerイメージでコンテナを起動して、先ほど作成したファイルが含まれているか確認します。

$ docker run --rm testvm-new:v1.1 ls -l /test-vm.txt
-rw-r--r-- 1 root root 0 Oct 28 07:21 /test-vm.txt

 先ほどコンテナtestvm内に作成したファイルが存在することが確認できました。よって、Dockerイメージ「testvm-new:v1.1」は、先ほどファイルを作成したコンテナtestvmを基に作られたDockerイメージであることが分かります。

(注意)
docker commitコマンドでDockerイメージとして出力されるのは、コンテナ内のファイルのみで、データボリューム(コンテナ起動時に-vオプションで指定した領域やDockerfileにてVOLUME指定した領域など)は対象外です。ご注意下さい。

■ 本記事の目次に戻る ■

Dockerイメージに制作者名とコミットメッセージを設定する

 先ほど使用したコンテナtestvmを「testvm-new:v2.1」というイメージ名のDockerイメージとして保存しますが、その際、制作者名とコミットメッセージを設定します。

$ docker commit -a "test author" -m "This image name is testvm-new" testvm testvm-new:v2.1

 docker inspectコマンドにて、Dockerイメージの詳細情報を確認してみます。

$ docker inspect testvm-new:v2.1

 対象イメージの詳細情報が大量に出力されますが、目的の部分のみ抜粋して掲載します。

              (略)
    "Comment": "This image name is testvm-new",
              (略)
    "Author": "test author",
              (略)

 docker commitコマンド実行時にオプションとして設定した制作者(Author)とコミットメッセージ(Comment)を確認できました。(Commentは最初の方、Authorは中間くらいに出力されていると思います)

 このAuthorとCommentは、作成したDockerイメージを公開する際に付与しておくことで、第三者がイメージの内容を識別しやすくなります。

■ 本記事の目次に戻る ■

Dockerfileで指定されたオプションを追加/変更してイメージを作成する

 通常、Dockerイメージには様々な設定情報が格納されてます。例えば、コンテナ起動時に実行するコマンド(CMD、ENTRYPOINT)、コンテナ外に公開するポート(EXPOSE)、コンテナ内に設定する環境変数(ENV)、など他にも多数あります。(カッコ内はDockerfile内で指定する命令です)

 docker commitコマンドにて、「-c」オプションで、Dockerfileの命令と設定値を指定すると、指定された値を設定してDockerイメージを作成することが可能です。

 試しに、CentOS公式イメージ内に指定されているCMD設定内容の変更とEXPOSE設定の追加を行いたいと思います。

 まず、以下のコマンドで、centosイメージを基にコンテナを起動します。

$ docker run --name testvm2 centos

 docker psコマンドで、コンテナ情報を確認します。

$ docker ps -a
CONTAINER ID  IMAGE  COMMAND      CREATED        STATUS                   PORTS   NAMES
6e7f261f9d0a  centos "/bin/bash"  9 minutes ago  Exited (0) 9 minutes ago         testvm2

 centosイメージは、作成時にCMD情報として「/bin/bash」が設定されてます。「/bin/bash」はデーモン仕様ではありませんので、コンテナは直ぐ終了してしまいます。

 このコンテナを基に、docker commitコマンドの「-c」オプションでCMDとEXPOSEの設定を行い、Dockerイメージ「testvm-new:v3.1」を作成します。停止しているコンテナに対しても実行可能です。

$ docker commit -c 'CMD ["ping","localhost"]' -c "EXPOSE 8080" testvm2 testvm-new:v3.1

 作成されたDockerイメージ「testvm-new:v3.1」の詳細情報を、Docker inspectコマンドにて確認します。

$ docker inspect testvm-new:v3.1

 対象イメージの詳細情報が大量に出力されますが、目的の部分のみ抜粋して掲載します。

(略)
"ExposedPorts": {
 "8080/tcp": {}
 },
 (略)
"Cmd": [
 "ping",
 "localhost"
 ],
(略)

※「Cmd」の設定は2か所("ContainerConfig"セクション内と"Config"内)ありますが、「"Config"」内の「Cmd」の方を確認します。"ContainerConfig"セクション内の「Cmd」は、対象のDockerイメージの生成元のコンテナの情報になります。

 先ほどは存在しなかったExposedPortsの設定が追加され、CMDの設定がpingコマンドに変更されてます。

 試しに、作成したDockerイメージ「testvm-new:v3.1」でコンテナtestvm2を起動してみます。

$ docker run -d --name testvm3 testvm-new:v3.1

 docker psコマンドでコンテナを確認します。

$ docker ps
CONTAINER ID  IMAGE           COMMAND           CREATED       STATUS        PORTS     NAMES
2b7b53871cda  testvm-new:v3.1 "ping localhost"  3 seconds ago Up 2 seconds  8080/tcp  testvm3

 COMMANDとして、指定したpingコマンドが表示されてます。また、EXPOSEオプションで指定したポートが表示されてます。

 docker commitコマンドで追加/変更した内容が反映されていることが確認できます。

■ 本記事の目次に戻る ■

コンテナを止めずにDockerイメージを作成する

 docker commitコマンドは、デフォルトでは、Dockerイメージの作成処理が開始する前に、コンテナを一時停止します。

 一時停止せず、コンテナが動いたままの状態でDockerイメージを作成する場合は「--pause=false」オプションを使用します。

 以下のコマンドは、コンテナtestvmを、一時停止無しでDockerイメージを作成してます。

$ docker commit --pause=false testvm testvm-new:v3.5

 

  以上でdocker commitコマンドの紹介を終わります。

 ご指摘、ご要望などが御座いましたらコメントいただけるとうれしいです。

 他のDockerコマンドの実例付紹介記事は、本サイト内の別記事「Dockerのコマンドの一覧(ver1.12対応版)(オリジナルな実例付き)」をご参照ください。

 ご訪問ありがとうございました!


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください