Dockerコンテナを移行してみる【失敗編】

#背景
ある環境で建てた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
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167392/52d8b67a-8e34-c63b-ffe0-db9876582d8d.png)

#手順
###イメージに変換する
まずは起動しているDockerコンテナを停止します

```shell:停止
[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> <イメージ名>`
下ではディレクトリを指定するもんだと思って書いていますが、ミスです。本来は作成するイメージ名を記載します。

```shell:イメージ化
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は作成されています。変な名前で。

```shell:
[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を指定して削除することは出来ません。当たり前だけど。

```shell
[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の方もイメージ化します。

```shell:イメージ化
[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にしないとファイルとして転送出来ないからです。

```shell
[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については割愛します。

###展開する

転送した先にログインし、転送ファイルがあるか確認します。

```shell
[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に展開するだけでコンテナとしては立ち上がることはありません。

```shell:test

[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 <イメージ名>`

```shell
[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画面に戻ってしまいました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167392/39228309-e798-e2ad-e4f5-96f8a66d6444.png)


#考察
Volumeを移行しなかったためにデータが移行されず移行先でまっさらなコンテナが出来てしまったと考えられます。
従って、imageの他にVolumeを丸めて転送する必要がありそうです。

ということで成功編へと続きます。
[Dockerコンテナを移行してみる【成功編】](https://qiita.com/Osbrewery/items/57feacd9d1f84f8813aa)