前回、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_demo
とnew_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はコンテナ間で共有されて保持されます。
Dockerではこのようにレイヤ構造を採用することで、ホスト上に複数のコンテナを実行しても、レイヤごとに共有されるため、ホスト内のイメージサイズの削減が可能です。