docker commitを使って更新したコンテナからのイメージ作成について

前回、Dockerイメージのレイヤ構造とコンテナへの変更について解説しました。コンテナに変更を加えても、そのままコンテナを終了してしまうと、コンテナレイヤは破棄されるため変更も保存されません。

変更を保存する場合は、docker commitコマンドで対応が可能です。まず、ssh接続できるコンテナを立ち上げます(参考:Dockerの基本的な使い方

❯ docker run -d -t -i -p 2022:22 --name="docker_demo" docker_demo
2658a4d4d96a2a36c5b55d3d63a39e5567dce20471ac6885326597d54cb39fb1

ssh接続して、Test_New_File.txtというファイルを作成します。

❯ ssh root@localhost -p 2022
root@localhost's password:
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.9.184-linuxkit x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

root@2658a4d4d96a:/# touch Test_New_File.txt
root@2658a4d4d96a:/# ll
-rw-r--r--   1 root root    0 Jan 11 04:36 Test_New_File.txt

ファイルを追加したコンテナを、新たなイメージとしてnew_docker_demoという名前で作成してみます。コマンドはdocker commitを使用します。

root@2658a4d4d96a:/# exit

❯ docker commit docker_demo new_docker_demo
sha256:bec3404d505e671e14e31768e9b198ee979b5ca6aa9970897454e4eb5c2a9a3c

❯ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
new_docker_demo     latest              bec3404d505e        16 seconds ago      204MB
docker_demo         latest              cd226ad8e4c1        2 days ago          204MB

docker imagesコマンドを確認すると、新たにnew_docker_demoというイメージが作成されていることが分かります。

new_docker_demoを起動してみます。

❯ docker run -d -t -i -p 3022:22 --name="new_docker_demo" new_docker_demo
d48e86110f9bcf23d1bbf8e4bc5022f499f315cbdfb357fada8522a2721243a0

❯ docker container ls -a
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS                      PORTS                  NAMES
d48e86110f9b        new_docker_demo     "/usr/sbin/sshd -D"   5 seconds ago       Up 3 seconds                0.0.0.0:2022->22/tcp   new_docker_demo

ssh接続して先程作成したファイルが保存されているかを確認してみます。

❯ ssh root@localhost -p 3022
root@eea78050437d:/# ll
total 76
drwxr-xr-x   1 root root 4096 Jan 11 05:07 ./
drwxr-xr-x   1 root root 4096 Jan 11 05:07 ../
-rwxr-xr-x   1 root root    0 Jan 11 05:07 .dockerenv*
-rw-r--r--   1 root root   16 Jan  8 09:49 HelloWorld.txt
-rw-r--r--   1 root root    0 Jan 11 05:06 New_Test_File.txt

現在コンテナはdocker_demonew_docker_demoの2つのコンテナが起動している状態です。

❯ docker container ls -a
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS                      PORTS                  NAMES
eea78050437d        new_docker_demo     "/usr/sbin/sshd -D"   5 minutes ago       Up 5 minutes                0.0.0.0:3022->22/tcp   new_docker_demo
9f09c3bb3a93        docker_demo         "/usr/sbin/sshd -D"   18 minutes ago      Up 7 minutes                0.0.0.0:2022->22/tcp   docker_demo

この2つのコンテナの違いは、コンテナ内にNew_Test_File.txtがあるかどうかの違いだけです。それ以外のレイヤは共通のレイヤになります。このような場合、Dockerはコンテナ間で共有されて保持されます。

con05

Dockerではこのようにレイヤ構造を採用することで、ホスト上に複数のコンテナを実行しても、レイヤごとに共有されるため、ホスト内のイメージサイズの削減が可能です。

関連記事