本記事はDocker ver24.0.7の環境で確認しています。
このコマンドは、現時点でのコンテナの状態をDockerイメージとして出力することができます。
コンテナに対して行った設定や更新したファイルを含め、コンテナ内の全ファイルと合わせて新しいDockerイメージを作成します。
例えば、公式なCentOSのDockerイメージを独自にカスタマイズして、個人用のCentOSイメージを作成する場合などに利用できます。
docker commitコマンドのフォーマットとオプション
フォーマット
docker commit [オプション] [コンテナ] [リポジトリ[:タグ]]
主なオプション一覧
オプション | 概説 |
---|---|
-a, --author="" | Dockerイメージ作者の情報を設定する |
-c, --change="" | 対象コンテナのベースイメージに設定された 各種設定を追加/変更する |
-m, --message="" | コミットメッセージを設定する |
-p, --pause=true | commitを実行する際にコンテナを一時停止す る(デフォルトは一時停止) |
コマンド例
$ docker commit testvm testvm-new:v1.1
$ docker commit -a "author name" -m "image name is testvm-new" testvm testvm-new
docker commitコマンドの主な使い方
以下で実例をまじえたコマンドの使い方を解説していきたいと思います。
基本事項の解説
docker commitコマンドを実行しますと、コンテナを起動してから現在までに、コンテナ起動時に指定したDockerイメージに対して行った変更を全て反映した新しいDockerイメージが作成されます。
出力されるDockerイメージには、Dockerボリュームとして指定されている領域は含まれません。
Dockerボリューム内のファイルへの変更は、Dockerボリュームに保存されていますので、Dockerイメージに反映する必要はありません。
また、Dockerイメージをbuildした際に指定した各種設定(CMDやENV、EXPORTなどのオプション)を変更することもできます。
コンテナの現状をDockerイメージとして保存する
Ubuntu公式のDockerイメージを利用して起動したコンテナのルートディレクトリに適当なファイルを作成して、その状態の新たなDockerイメージを作成してみます。
以下の起動中のコンテナがあります。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b967148b532 ubuntu "/bin/bash" 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 94c1fb7ad897 8 seconds ago 73.9MB
次に、この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イメージに制作者名とコミットメッセージを設定する
docker commitコマンドを使用して、Dockerイメージに制作者名(Author)とコミットメッセージ(Comment)を設定します。
先ほど使用したコンテナtestvmを「testvm-new:v2.1」というイメージ名のDockerイメージとして保存しますが、その際にAuthorやCommentを設定します。
$ 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は中間くらいに出力されていると思います)
Dockerfileで指定されたオプションを追加/変更してイメージを作成する
docker commitコマンドで新たなDockerイメージを作成する際に、「-c」オプションを使ってコンテナ起動時に実行するコマンド(CMD、ENTRYPOINT)、コンテナ外に公開するポート(EXPOSE)、コンテナ内に設定する環境変数(ENV)、なども設定することができます。
これらは、通常Dockerイメージのビルド(build)時に設定しますが、docker commit時にも可能です。
試しに、Ubuntu公式イメージ内に指定されているCMD設定内容の変更とEXPOSE設定の追加を行いたいと思います。
まず、以下のコマンドで、ubuntuイメージを基にコンテナを起動します。
$ docker run -dit --init --name testvm2 ubuntu
docker psコマンドで、コンテナ情報を確認します。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e7f261f9d0a ubuntu "/bin/bash" Up 3 seconds Up 2 seconds
testvm2
このコンテナを基に、docker commitコマンドの「-c」オプションでCMDとEXPOSEの設定を行い、Dockerイメージ「testvm-new:v3.1」を作成します。
$ docker commit -c 'CMD ["cat","/etc/hosts"]' -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": [
"cat",
"/etc/hosts"
],
(略)
「Cmd」の設定は2か所("ContainerConfig"セクション内と"Config"内)ありますが、「"Config"」内の「Cmd」の方を確認します。
"ContainerConfig"セクション内の「Cmd」は、対象のDockerイメージの生成元のコンテナの情報になります。
docker commitコマンドで追加/変更した内容が反映されていることが確認できました。
コンテナを止めずにDockerイメージを作成する
docker commitコマンドは、デフォルトでは、Dockerイメージの作成処理が開始する前にコンテナを一時停止します。
一時停止せず、コンテナが動いたままの状態でDockerイメージを作成する場合は「--pause=false」オプションを使用します。
以下のコマンドは、コンテナtestvmを、一時停止無しでDockerイメージを作成してます。
$ docker commit --pause=false testvm testvm-new:v3.5
おわりに
以上でdocker commitコマンドの紹介を終わります。
ご指摘、ご要望などが御座いましたらコメントいただけるとうれしいです。
他のDockerコマンドの実例付紹介記事は、本サイト内の別記事「Dockerコマンドの一覧(オリジナルな実例付き)」をご参照ください。
ご訪問ありがとうございました!
コメント