また、Dockerのインストールは、「【Linux CentOS 7】Dockerをyumでインストールする手順と簡単な動作テスト【Docker-ce 18.06.1.ce】」の手順で行った。
■Dockerイメージを圧縮してファイルに保存
○イメージ一覧
次のDockerイメージが存在している。これを圧縮してファイルに保存する。
# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE1GB程度ある。
image-centos7-popfile-20181122 latest 341bbc5d6f87 30 hours ago 1.09GB
○圧縮してファイルに保存
# docker save image-centos7-popfile-20181122 | gzip > image-centos7-popfile-20181122.tgz
(c.f.)圧縮しない場合は、-oオプションで直接出力ファイル名を指定する。
# docker save -o image-name.tar image-name
# ls -l
-rw-r--r-- 1 root root 370858897 11月 22 17:34 image-centos7-popfile-20181122.tgz
約1GBが、370MB程度に圧縮された。
■ファイルに保存済みのイメージを別のDockerホストに復元
○生成した圧縮ファイルを別のDockerホストにコピーした。
# scp -P 22 image-centos7-popfile-20181122.tgz root@192.168.20.3:/root/
<意味>
-P 22 SSHポート番号を明示的に指定する。
image-centos7-popfile-20181122.tgz 送信するファイル
root@192.168.20.3:/root/ 送信先ホスト(rootはログインユーザー)とそこのディレクトリ
ちなみに、フォルダごとコピーしたい場合は、scp -r とすればよい。
例えば、カレントディレクトリ内にあるimage-folderを、リモートの/rootディレクトリ内にコピーする。
# scp -r -P 22 image-folder root@192.168.20.3:/root/
-p というオプション(小文字)を指定すれば、ファイル属性をオリジナルのままにすることができる。
○コピー先の別のDockerホスト側で、イメージを圧縮ファイルからロードした。
コピー先とした別のDockerホストのコンソールを表示した。
ファイルの確認
[root@another ~]# ls image*
イメージを圧縮ファイルからロード
[root@another ~]# gunzip -c image-centos7-popfile-20181122.tgz | docker load
イメージの一覧表示
# docker image list
また、無事にこのイメージからコンテナをrunさせることができた。
このようにDockerは、動作環境を「ファイル」として丸ごと出力し別のホストへ移動できるのでとても便利だ。
<参考>
・Docker: save/load container using tgz file (tar.gz)
< https://codepad.co/snippet/hh8FztUc > 2018年11月23日
・docker save
< https://docs.docker.com/engine/reference/commandline/save/ > 2018年11月23日
・docker load
< https://docs.docker.com/engine/reference/commandline/load/ > 2018年11月23日
・Docker Tutorial 4: Exporting Container and Saving Image
< https://medium.com/@sh.tsang/docker-tutorial-4-exporting-container-and-saving-image-c3a7d792cfb6 > 2018年11月23日
・How to copy a folder from remote to local using scp? [closed]
< https://stackoverflow.com/questions/11304895/how-to-copy-a-folder-from-remote-to-local-using-scp > 2019年7月1日
ちなみに、フォルダごとコピーしたい場合は、scp -r とすればよい。
例えば、カレントディレクトリ内にあるimage-folderを、リモートの/rootディレクトリ内にコピーする。
# scp -r -P 22 image-folder root@192.168.20.3:/root/
-p というオプション(小文字)を指定すれば、ファイル属性をオリジナルのままにすることができる。
○コピー先の別のDockerホスト側で、イメージを圧縮ファイルからロードした。
コピー先とした別のDockerホストのコンソールを表示した。
ファイルの確認
[root@another ~]# ls image*
image-centos7-popfile-20181122.tgz
イメージを圧縮ファイルからロード
[root@another ~]# gunzip -c image-centos7-popfile-20181122.tgz | docker load
1d31b5806ba4: Loading layer [==================================================>] 208.3MB/208.3MB
3c544c486d65: Loading layer [==================================================>] 150.5MB/150.5MB
ad7894c4b1ef: Loading layer [==================================================>] 115.6MB/115.6MB
2331b5983314: Loading layer [==================================================>] 106.2MB/106.2MB
9ae5363d1828: Loading layer [==================================================>] 530.4MB/530.4MB
Loaded image: image-centos7-popfile-20181122:latest
(c.f)圧縮ファイルでなく普通のtarファイルの場合、-i オプションでファイルを指定する。
# docker load -i image-name.tar
イメージの一覧表示
# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE確かにロードされた。
image-centos7-popfile-20181122 latest 341bbc5d6f87 31 hours ago 1.09GB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
また、無事にこのイメージからコンテナをrunさせることができた。
このようにDockerは、動作環境を「ファイル」として丸ごと出力し別のホストへ移動できるのでとても便利だ。
<参考>
・Docker: save/load container using tgz file (tar.gz)
< https://codepad.co/snippet/hh8FztUc > 2018年11月23日
・docker save
< https://docs.docker.com/engine/reference/commandline/save/ > 2018年11月23日
・docker load
< https://docs.docker.com/engine/reference/commandline/load/ > 2018年11月23日
・Docker Tutorial 4: Exporting Container and Saving Image
< https://medium.com/@sh.tsang/docker-tutorial-4-exporting-container-and-saving-image-c3a7d792cfb6 > 2018年11月23日
・How to copy a folder from remote to local using scp? [closed]
< https://stackoverflow.com/questions/11304895/how-to-copy-a-folder-from-remote-to-local-using-scp > 2019年7月1日
・How to preserve files original creation date?
< https://stackoverflow.com/questions/20255368/how-to-preserve-files-original-creation-date > 2020年8月8日