Dockerのシステム移行手順（バックアップおよび復元方法）

## 大まかな移行の流れ
1. コンテナのイメージバックアップ取得（移行元）
2. データボリュームのバックアップ取得（移行元）
3. コンテナのイメージバックを復元（移行先）
4. データボリュームのバックアップを復元（移行先）

![image](https://qiita-image-store.s3.amazonaws.com/0/61752/679cb6f6-c446-16d7-5020-55a7407b8a0d.png)


## コンテナのイメージバックアップを何故とるのか。
本来であればコンテナのイメージバックアップをとるような仕組みはよろしくない。バックアップを必要とすることはあってはならない。docker-composeファイルやDockerfileですべて完結されるべきでファイルさえあれば常に同じ環境が構築（他人へ再配布）できるような仕組みが良いとされている。
しかし、どうしても自動化できない設定をするケースがある。（例えばRedmineのBacklogsプラグイン等）
もしくは、Dockerが良く理解していない他人が、見ていないところで勝手にコンテナにアクセスしてyumで何か追加インストールしたりもあり得る。よって定期的にコンテナをイメージバックアップしたり、別マシンへ移行する際は直近のコンテナイメージを取得しておく必要がある。

## コンテナのボリュームバックアップを何故とるのか。
コンテナイメージはボリュームが含まれない。
よって、ボリュームは別途バックアップをとる必要がある。


## 具体的な移行手順

### お題
下記サイトの構築docker-composeを用いて構築したRedmineを移行する手順を記します。
https://github.com/sameersbn/docker-redmine/tree/2.6-stable

下記ディレクトリにdocker-compose.ymlを配置して構築したとします。
/root/docker/redmine2.6/docker-compose.yml

### 移行元作業

#### **1. docker-compose.ymlをバックアップ**

`# mkdir /root/bkup.yyyymmdd`
`# cd /root/bkup.yyyymmdd`
`# cp -ip /root/docker/redmine2.6/docker-compose.yml ./`

#### **2. コンテナイメージをバックアップ**

`# docker images`
 → sameersbn_mod_yyyymmdd/redmine:2.6.10-2がないことを確認
 → sameersbn_mod_yyyymmdd/postgresql:9.4-18がないことを確認

`# docker commit redmine26_redmine_1 sameersbn_mod_yyyymmdd/redmine:2.6.10-2`
`# docker commit redmine26_postgresql_1 sameersbn_mod_yyyymmdd/postgresql:9.4-18`

`# docker save -o redmine_bk_yyyymmdd.tar redmine_yyyymmdd/redmine:2.6.10-2`
`# docker save -o redmine_postgresql_bk_yyyymmdd.tar redmine_yyyymmdd/postgresql:9.4-18`

#### **3. ボリュームをバックアップ**

`# docker run --rm --volumes-from redmine26_postgresql_1 -v $(pwd):/backup debian:latest tar cvf /backup/postgresql-data.tar /var/lib/postgresql`
`# docker run --rm --volumes-from redmine26_redmine_1 -v $(pwd):/backup debian:latest tar cvf /backup/redmine-data.tar /home/redmine/data`

#### **4. 移行先へ転送**

`# scp docker-compose.yml *.tar root@xxx.xxx.xxx.xxx:/root/docker/redmine`


### 移行先作業

#### **1. コンテナイメージを復元**

`# cd /root/docker/redmine`
`# docker images`
 → sameersbn_mod_yyyymmdd/redmine:2.6.10-2がないことを確認
 → sameersbn_mod_yyyymmdd/postgresql:9.4-18がないことを確認

`# docker load -i redmine_bk_yyyymmdd.tar`
`# docker load -i redmine_postgresql_bk_yyyymmdd.tar`

`# docker images`
 → sameersbn_mod_yyyymmdd/redmine:2.6.10-2が存在することを確認
 → sameersbn_mod_yyyymmdd/postgresql:9.4-18が存在することを確認

#### **2. docker-composeを変更**

`# vi docker-compose.yml`
  →「sameersbn/redmine:2.6.10-2」を「sameersbn_mod_yyyymmdd/redmine:2.6.10-2」に書き換える
  →「sameersbn/postgresql:9.4-18」を「sameersbn_mod_yyyymmdd/postgresql:9.4-18」に書き換える


#### **3. コンテナ作成**

`# docker-compose up`
  →「redmine_redmine_1 exited with code 0」が最後に表示されたらCtrl-C

#### **4. ボリューム復元**

`# tar xvf postgresql-data.tar`
コンテナ作成時に生成されたフォルダを一旦削除する。
`# rm -rf /srv/docker/redmine/postgresql/9.4/main/*`
解凍したバックアップデータを配置し直す。
`# cp -irp var/lib/postgresql/9.4/main/* /srv/docker/redmine/postgresql/9.4/main/`
`# ls -l /srv/docker/redmine/postgresql/`
  → 権限確認
上記で確認した権限で設定する。
`# chown 102:106 -R /srv/docker/redmine/postgresql/9.4/main/`
用済みディレクトリを削除します。
`rm -rf var/`

上記と同様に作業を繰り返す。
`# tar xvf redmine-data.tar`
`# rm -rf /srv/docker/redmine/redmine/*`
`# cp -irp home/redmine/data/*  /srv/docker/redmine/redmine/`
`# ls -l /srv/docker/redmine/`
  → redmineディレクトリの権限確認
`# chown 1000:1000 -R /srv/docker/redmine/redmine/`
`# rm -rf home/`


#### **5. コンテナを再起動**
`# docker-compose start`
`# docker-compose logs`
  → エラーが出力されていないことを確認

## 参考元
http://qiita.com/lciel/items/e21a4ede3bac7fb3ec5a
https://docs.docker.com/engine/tutorials/dockervolumes/

以上。