#背景
ある環境で建てたDockerコンテナを別のホストに移行し、データ等が適切に引き継がれるかテストしたいと考えました。
#前提環境
移行元・移行先ともに
OS:CentOS Linux release 7.4.1708 (Core)
Docker:Docker version 17.12.1-ce, build 7390fc6
コンテナ:wordpressとmysql
#流れ
【失敗例】
・コンテナをイメージに変換
・イメージをtarに変換
・tarファイルを移行先で展開
この場合はVolumeが移行できておらず、単純なimageの展開になってしまう。
#ゴール
予め移行元の環境でWordpressをカスタマイズしておき、移行先でコンテナを展開した際に同じカスタマイズされたページが出ればOK
#手順
###イメージに変換する
まずは起動しているDockerコンテナを停止します
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e43ffef0e6c0 wordpress "docker-entrypoint.s…" 20 minutes ago Up 18 minutes 0.0.0.0:8080->80/tcp tvc-wordpress
04f6a48f8168 mysql "docker-entrypoint.s…" 22 minutes ago Up 18 minutes 3306/tcp wordpress-mysql
[root@docker01 ~]#
[root@docker01 docker]# docker stop tvc-wordpress
tvc-wordpress
[root@docker01 docker]# docker stop wordpress-mysql
wordpress-mysql
[root@docker01 docker]#
[root@docker01 docker]#
[root@docker01 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker01 docker]#
続いてコンテナをイメージ化します
docker commit <CONTAINER ID> <イメージ名>
下ではディレクトリを指定するもんだと思って書いていますが、ミスです。本来は作成するイメージ名を記載します。
docker commit e43ffef0e6c0 image/bkup/wordpress
sha256:8c6f718cfe06a08df98a2b276ebf56e2f9a4e3e890fcbfddf49f71279d170974
[root@docker01 docker]#
[root@docker01 docker]#
[root@docker01 docker]# ls image/bkup/
[root@docker01 docker]#
[root@docker01 docker]# ls -la image/bkup/
合計 8
drwxr-xr-x. 2 root root 4096 4月 5 04:50 .
drwx------. 4 root root 4096 4月 5 04:50 ..
わざわざbkupディレクトリを作成して、そこにimageを作るもんだとおもっていたのですが、imageに実体はなく、当然lsしても何も出てきません。
ここは特殊で驚きました。
しかし以下のようにちゃんとimageは作成されています。変な名前で。
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
image/bkup/wordpress latest 8c6f718cfe06 9 minutes ago 408MB
wordpress latest 53046cdd8f97 13 days ago 408MB
mysql latest 5195076672a7 3 weeks ago 371MB
<none> <none> e8cebf03929c 2 months ago 407MB
<none> <none> f008d8ff927d 2 months ago 409MB
imageの名前を変えたい、と思いコピーして古いimageを削除するようにしました。
その際、IMAGE IDも同一なものが作成されてしまうのでIMAGE IDを指定して削除することは出来ません。当たり前だけど。
[root@docker01 ~]# docker tag 8c6f718cfe06 wordpress_trans
[root@docker01 ~]#
[root@docker01 ~]#
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress_trans latest 8c6f718cfe06 9 minutes ago 408MB
image/bkup/wordpress latest 8c6f718cfe06 9 minutes ago 408MB
wordpress latest 53046cdd8f97 13 days ago 408MB
mysql latest 5195076672a7 3 weeks ago 371MB
<none> <none> e8cebf03929c 2 months ago 407MB
<none> <none> f008d8ff927d 2 months ago 409MB
[root@docker01 ~]#
[root@docker01 ~]# docker rmi 8c6f718cfe06
Error response from daemon: conflict: unable to delete 8c6f718cfe06 (must be forced) - image is referenced in multiple repositories
[root@docker01 ~]#
[root@docker01 ~]# docker rmi image/bkup/wordpress
Untagged: image/bkup/wordpress:latest
[root@docker01 ~]#
[root@docker01 ~]#
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress_trans latest 8c6f718cfe06 11 minutes ago 408MB
wordpress latest 53046cdd8f97 13 days ago 408MB
mysql latest 5195076672a7 3 weeks ago 371MB
<none> <none> e8cebf03929c 2 months ago 407MB
<none> <none> f008d8ff927d 2 months ago 409MB
続いてmysqlの方もイメージ化します。
[root@docker01 ~]# docker commit 04f6a48f8168 mysql_trans
sha256:7ea06243cc0f174ddbab7dcaeba31b1e9dd573bb743cdc308556f7223a1c4e51
[root@docker01 ~]#
[root@docker01 ~]#
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql_trans latest 7ea06243cc0f 6 seconds ago 371MB
wordpress_trans latest 8c6f718cfe06 16 minutes ago 408MB
wordpress latest 53046cdd8f97 13 days ago 408MB
mysql latest 5195076672a7 3 weeks ago 371MB
<none> <none> e8cebf03929c 2 months ago 407MB
<none> <none> f008d8ff927d 2 months ago 409MB
[root@docker01 ~]#
###tarでまとめる
次にdocker save
コマンドでimageをtarにします。imageは実体がないため、移行する際tarにしないとファイルとして転送出来ないからです。
[root@docker01 ~]# docker save wordpress_trans > wordpress_trans.tar
[root@docker01 ~]#
[root@docker01 ~]# docker save mysql_trans > mysql_trans.tar
[root@docker01 ~]#
[root@docker01 ~]#
[root@docker01 ~]# ls
mysql_trans.tar wordpress_trans.tar
###転送する
scpにて転送してあげてください。
scpについては割愛します。
###展開する
転送した先にログインし、転送ファイルがあるか確認します。
[root@docker02 ~]# ls -l /var/lib/docker/image/
合計 776688
-rw-r--r--. 1 root root 376540160 4月 5 05:10 mysql_trans.tar
drwx------. 5 root root 4096 4月 5 04:32 overlay2
-rw-r--r--. 1 root root 417993216 4月 5 05:12 wordpress_trans.tar
転送してきたtarファイルを指定してdocker load
コマンドでimageとして展開します。
この際、imageに展開するだけでコンテナとしては立ち上がることはありません。
[root@docker02 ~]# docker load < /var/lib/docker/image/mysql_trans.tar
3358360aedad: Loading layer [==================================================>] 58.44MB/58.44MB
813996252a80: Loading layer [==================================================>] 338.4kB/338.4kB
f0f28cc0eea1: Loading layer [==================================================>] 10.43MB/10.43MB
55d5d837463a: Loading layer [==================================================>] 4.472MB/4.472MB
fbb39c7dedaf: Loading layer [==================================================>] 1.536kB/1.536kB
317e578f94b9: Loading layer [==================================================>] 46.11MB/46.11MB
b0c77fd3841d: Loading layer [==================================================>] 26.62kB/26.62kB
14d83b80d542: Loading layer [==================================================>] 3.584kB/3.584kB
4b402dfbab7b: Loading layer [==================================================>] 256.7MB/256.7MB
1df83efbc52b: Loading layer [==================================================>] 9.216kB/9.216kB
c5479ef6e03d: Loading layer [==================================================>] 1.536kB/1.536kB
4968c8a1a4ed: Loading layer [==================================================>] 2.56kB/2.56kB
Loaded image: mysql_trans:latest
[root@docker02 ~]#
[root@docker02 ~]#
[root@docker02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker02 ~]#
[root@docker02 ~]#
[root@docker02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker02 ~]#
[root@docker02 ~]#
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql_trans latest 7ea06243cc0f 6 minutes ago 371MB
[root@docker02 ~]#
[root@docker02 ~]# docker load < /var/lib/docker/image/wordpress_trans.tar
8afea72e9884: Loading layer [==================================================>] 3.584kB/3.584kB
bef0857fe280: Loading layer [==================================================>] 213.6MB/213.6MB
cb53331bb53b: Loading layer [==================================================>] 3.584kB/3.584kB
1a8b2c727926: Loading layer [==================================================>] 43.02MB/43.02MB
e93701a63c26: Loading layer [==================================================>] 10.24kB/10.24kB
5855072110ab: Loading layer [==================================================>] 9.728kB/9.728kB
8fb1a93d7f47: Loading layer [==================================================>] 4.096kB/4.096kB
d57c1573498d: Loading layer [==================================================>] 7.68kB/7.68kB
a548ab1e80a1: Loading layer [==================================================>] 13.45MB/13.45MB
129dddf9a291: Loading layer [==================================================>] 4.096kB/4.096kB
ccc8d4bf6131: Loading layer [==================================================>] 58.16MB/58.16MB
d30050c3a650: Loading layer [==================================================>] 11.78kB/11.78kB
486e62a78b6a: Loading layer [==================================================>] 4.608kB/4.608kB
32824a523b94: Loading layer [==================================================>] 4.608kB/4.608kB
36c58ff81f53: Loading layer [==================================================>] 3.392MB/3.392MB
0fab5427325d: Loading layer [==================================================>] 4.608kB/4.608kB
19715d8bad28: Loading layer [==================================================>] 7.168kB/7.168kB
efad8f2c9588: Loading layer [==================================================>] 27.72MB/27.72MB
6d7e4758c18c: Loading layer [==================================================>] 10.75kB/10.75kB
3f1ff61f8987: Loading layer [==================================================>] 3.584kB/3.584kB
Loaded image: wordpress_trans:latest
[root@docker02 ~]#
###コンテナの構築
いよいよコンテナを構築します。
先程展開したイメージを指定してコンテナをビルドします。
docker run --name <コンテナ名> -e <mysqlを構成する際の設定> -d <イメージ名>
[root@docker02 ~]# docker run --name wordpress-mysql -e MYSQL_ROOT_PASSWORD=password -e MYSQL_USER=root -e MYSQL_PASSWORD=password -e MYSQL_DATABASE=wordpressdb -d mysql_trans
dfb36526a16ecb37dc9ee15446385a772234602200730c2b96bcef55e0ee8222
[root@docker02 ~]#
[root@docker02 ~]# docker run --name tvc-wordpress -p 8080:80 --link wordpress-mysql:mysql -d wordpress_trans
a28d68cc22f2f44bdb1379a08ef885071883c7c779f7d4d4f5f84a64778a8651
docker: Error response from daemon: Cannot link to a non running container: /wordpress-mysql AS /tvc-wordpress/mysql.
[root@docker02 ~]# docker start wordpress-mysql
wordpress-mysql
[root@docker02 ~]# docker start tvc-wordpress
tvc-wordpress
[root@docker02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a28d68cc22f2 wordpress_trans "docker-entrypoint.s…" About a minute ago Up 4 seconds 0.0.0.0:8080->80/tcp tvc-wordpress
dfb36526a16e mysql_trans "docker-entrypoint.s…" About a minute ago Up 12 seconds 3306/tcp wordpress-mysql
これでコンテナが起動したので
http://<自分のIP>
:8080
にアクセスしてみましょう。
#結果
起動はしますが、以前構築したwordpress環境は無く、Install画面に戻ってしまいました。
#考察
Volumeを移行しなかったためにデータが移行されず移行先でまっさらなコンテナが出来てしまったと考えられます。
従って、imageの他にVolumeを丸めて転送する必要がありそうです。
ということで成功編へと続きます。
Dockerコンテナを移行してみる【成功編】