Docker環境で、Ubuntuを動かして、色々と設定したのに、exitして再度、立ち上げたら、全部設定が消えてしまったと言う悲劇が起きたので、原因と回避策をさぐりました。
環境は、Mac M1。
散々、試行錯誤しましたが、結論は下記。(これが本質)
■ 例えば、ubuntuのイメージに変更を加えたら、Tagでバージョン管理をする。
ubuntu:0.1.0みたいな感じで、バンバンとバージョンを指定する。
■ すると、スナップションとみたいに、沢山のバージョンが時系列的にできるので、キチンと時系列で管理できる。
下記を参考にしました。
【Docker】第3回 コンテナのライフサイクルとイメージの作成
https://www.public.ne.jp/2019/01/08/docker-3/
Dockerに慣れる : 変更したコンテナイメージを保存する
https://leico.github.io/TechnicalNote/Docker/basic-commit-container
<発生した現象>
下記の様に、Dockerイメージがあります。
test@test-mac ~ % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest a9ebd79b0af9 About an hour ago 65.7MB
ubuntu 20.04 1095aea5bb8b 2 hours ago 65.7MB
test0329 latest 7056fcb1b862 8 days ago 584MB
alpine latest d74e625d9115 7 weeks ago 7.46MB
docker/getting-started latest 289dc403af49 3 months ago 46.5MB
springci/graalvm-ce java17-0.12.x 91af9a3fca9f 5 months ago 1.16GB
test@test-mac ~ %
Ubuntu最新版のDockerイメージを起動します。
test@test-mac ~ % docker run -it ubuntu:latest
root@e3064d80e9b0:/#
root@e3064d80e9b0:/#
root@e3064d80e9b0:/#
JDKの設定等を含めて、かなり時間を掛けて行ったが、再起動したら、全部消えてしまったと言う事例。
尚、イメージを消すときは、"docker rmi [IMAGE ID] --force"コマンド。
% docker rmi 004df6e255ed --force
<原因>
話は簡単で、「コンテナに内部変更を行いそれを残したい場合には、「新たなイメージとして保存」する必要がある。」と言うことだけ。
イメージとしては、こんな感じ。
<操作>
① "docker ps -a"コマンドで、イメージを作成したいContainer IDを見つけた上で、
② "docker commit [Container ID] [保存イメージ名:タグ]"でイメージ保存。
こんな感じで、スナップショットが並んでいる。
test@test-mac ~ % docker ps -a
CONTAINER ID IMAGE COMMAND CREATED
f98bea4d7ca2 ubuntu:latest "/bin/bash" About a minute ago
7fa578e17825 da8d2bf0633b "/bin/bash" 1 hour ago
こんな感じで、イメージ保存。
今回は、"ubuntu:0.1.4" で保存する。
test@test-mac ~ % docker commit f98bea4d7ca2 ubuntu:0.1.4
sha256:006b5819e4b3fe0beadb5baa5753d1654e39d0da4046cd3a3223c9f24ca79ef3
test@ytest-mac ~ %
もう一度、やってみます。そして、本当に保存されているか? も確認してみます。
まず、"docker run -it ubuntu:0.1.4"で、Dockerイメージを起動します。
test@test-mac ~ % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 0.1.4 de7c3ccaa93f 11 minutes ago 69.2MB
ubuntu latest 26b24c9b8227 10 hours ago 69.2MB
alpine latest 1b0be3b64950 2 days ago 7.46MB
docker/getting-started latest 289dc403af49 3 months ago 46.5MB
springci/graalvm-ce java17-0.12.x 91af9a3fca9f 5 months ago 1.16GB
test@test-mac ~ %
test@test-mac ~ %
test@test-mac ~ % docker run -it ubuntu:0.1.4
root@07e3cf260a71:/#
root@07e3cf260a71:/#
/opt/jvmの直下に、現時点で2つのファイルがありますが、3つ目のファイルを足してみます。(xyz.txtです。)
test@test-mac ~ % docker run -it ubuntu:0.1.4
root@07e3cf260a71:/# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
root@07e3cf260a71:/# cd opt
root@07e3cf260a71:/opt# cd jvm
root@07e3cf260a71:/opt/jvm# ls
addtest.txt test0411z.txt
root@07e3cf260a71:/opt/jvm# touch xyz.txt
root@07e3cf260a71:/opt/jvm#
root@07e3cf260a71:/opt/jvm#
"Control + P +Q" で抜けて、一旦、ホストに戻ります。
現在、起動しているのは、ubuntu:0.1.4ですから、これを下記コマンドで、ubuntu:0.1.5として保存します。
"docker commit magical_visvesvaraya ubuntu:0.1.5"
(因みに、# "docker run -it f3b2048369e5 ubuntu:0.1.5"としても同じ。 )
test@test-mac ~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07e3cf260a71 ubuntu:0.1.4 "/bin/bash" 38 seconds ago Up 38 seconds magical_visvesvaraya
0960ac4cad6e ubuntu:latest "/bin/bash" 3 hours ago Up 3 hours kind_kepler
test@test-mac ~ %
test@test-mac ~ % docker commit magical_visvesvaraya ubuntu:0.1.5
test@test-mac ~ %
test@test-mac ~ %
ubuntu:0.1.5として、保存出来た筈です。
test@test-mac ~ %
test@test-mac ~ % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 0.1.5 f3b2048369e5 19 seconds ago 69.2MB
ubuntu 0.1.4 de7c3ccaa93f 20 minutes ago 69.2MB
ubuntu latest 26b24c9b8227 10 hours ago 69.2MB
alpine latest 1b0be3b64950 2 days ago 7.46MB
docker/getting-started latest 289dc403af49 3 months ago 46.5MB
springci/graalvm-ce java17-0.12.x 91af9a3fca9f 5 months ago 1.16GB
ubuntu:0.1.5では、3つのファイルがある事が確認できます。(正常です。)
test@test-mac ~ % docker run -it ubuntu:0.1.5 # "docker run -it f3b2048369e5 ubuntu:0.1.5" でも同じ。
root@23c2599454f4:/# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
root@23c2599454f4:/# cd opt
root@23c2599454f4:/opt# cd jvm
root@23c2599454f4:/opt/jvm# ls
addtest.txt test0411z.txt xyz.txt
因みに、ubuntu:0.1.4では、2つのファイルがある事が確認できます。(これも正常です。)
test@test-mac ~ % docker run -it ubuntu:0.1.4
root@47b34bfe6def:/#
root@47b34bfe6def:/#
root@47b34bfe6def:/# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
root@47b34bfe6def:/# cd opt
root@47b34bfe6def:/opt# cd jvm
root@47b34bfe6def:/opt/jvm# ls
addtest.txt test0411z.txt
root@47b34bfe6def:/opt/jvm#
完