Dockerのデータをバックアップしたいのです(実践編その1)

どうも、やまもとやまです。
前回の記事ではDockerのデータバックアップを試すための準備として、WordPress環境を構築しました。
今回は構築した環境のバックアップとリストアを試してみようと思います。

環境

Dockerのホストとして、AlmaLinux9を最小インストールした環境を想定しています。
前回構築した環境とは別に、AlmaLinux9を最小インストールした後にDockerインストールしたリストア用環境も用意します。

イメージでのバックアップ

まずはイメージでのバックアップと、そこからのリストアを試してみましょう。
前回構築したWordPress環境で、コンテナを停止します。

$ docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED       STATUS       PORTS                                     NAMES
68593745090e   wordpress:latest   "docker-entrypoint.s…"   3 hours ago   Up 3 hours   0.0.0.0:8000->80/tcp, [::]:8000->80/tcp   wordpress-wordpress-1
ebe5ff2ff8cc   mariadb:latest     "docker-entrypoint.s…"   3 hours ago   Up 3 hours   3306/tcp                                  wordpress-db-1

$ docker stop 68593745090e
68593745090e

$ docker ps -a
CONTAINER ID   IMAGE              COMMAND                  CREATED       STATUS                     PORTS      NAMES
68593745090e   wordpress:latest   "docker-entrypoint.s…"   3 hours ago   Exited (0) 3 seconds ago              wordpress-wordpress-1
ebe5ff2ff8cc   mariadb:latest     "docker-entrypoint.s…"   3 hours ago   Up 3 hours                 3306/tcp   wordpress-db-1

$ docker stop ebe5ff2ff8cc
ebe5ff2ff8cc

$ docker ps -a
CONTAINER ID   IMAGE              COMMAND                  CREATED       STATUS                      PORTS     NAMES
68593745090e   wordpress:latest   "docker-entrypoint.s…"   3 hours ago   Exited (0) 50 seconds ago             wordpress-wordpress-1
ebe5ff2ff8cc   mariadb:latest     "docker-entrypoint.s…"   3 hours ago   Exited (0) 5 seconds ago              wordpress-db-1

それぞれSTATUSがExitedとなり、正常に停止しました。
では、コンテナイメージを保存します。
まずは保存するためのイメージを作成します。

$ docker commit 68593745090e wpbackup
sha256:f04f3885701c63f27feae25595685ff286c0d2b0fad5776e0432913aa272e4df

$ docker commit ebe5ff2ff8cc dbbackup
sha256:c3ed89619eccda8b323013bd32a85d2695c1c0b5feac3948a0334d209009b636

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
dbbackup     latest    c3ed89619ecc   26 seconds ago   328MB
wpbackup     latest    f04f3885701c   44 seconds ago   703MB
wordpress    latest    630639aaf7e2   3 weeks ago      703MB
mariadb      latest    4815a3e162ea   3 months ago     328MB

イメージができていますね。
ではイメージをローカルに保存します。

$ docker save wpbackup > wpbackup.tar
$ docker save dbbackup > dbbackup.tar

保存したイメージはリストア用の別サーバーへ転送しておきましょう。

バックアップイメージからのリストア

ここからはリストア用サーバーでの作業になります。
元サーバーから転送してきたイメージを読み込みます。

$ docker load < wpbackup.tar
ace34d1d784c: Loading layer [==================================================>]  77.88MB/77.88MB
f4f83e178afd: Loading layer [==================================================>]  3.584kB/3.584kB
0acba961ef4b: Loading layer [==================================================>]  320.2MB/320.2MB
5369b2c8626c: Loading layer [==================================================>]   5.12kB/5.12kB
c0ace0569af1: Loading layer [==================================================>]  50.47MB/50.47MB
c900b618bc09: Loading layer [==================================================>]  9.728kB/9.728kB
e4c3b971a1d8: Loading layer [==================================================>]   7.68kB/7.68kB
4ddb12a7e490: Loading layer [==================================================>]  12.66MB/12.66MB
cd984ab6bc62: Loading layer [==================================================>]  4.096kB/4.096kB
cf7d4060c4f3: Loading layer [==================================================>]  49.49MB/49.49MB
46b824c41a1e: Loading layer [==================================================>]   12.8kB/12.8kB
21ff49a2a9e2: Loading layer [==================================================>]  4.608kB/4.608kB
f2614b0b05e5: Loading layer [==================================================>]  4.608kB/4.608kB
5f70bf18a086: Loading layer [==================================================>]  1.024kB/1.024kB
773cff38779d: Loading layer [==================================================>]  69.66MB/69.66MB
1e57ddb7c592: Loading layer [==================================================>]  58.61MB/58.61MB
0e1cc155f1a0: Loading layer [==================================================>]  5.632kB/5.632kB
30129b840e56: Loading layer [==================================================>]  4.608kB/4.608kB
59eee4abb2f7: Loading layer [==================================================>]  91.65kB/91.65kB
db91a4b6ebc1: Loading layer [==================================================>]   77.6MB/77.6MB
c56ca458b4c5: Loading layer [==================================================>]  9.216kB/9.216kB
cb8ff19af24c: Loading layer [==================================================>]  6.656kB/6.656kB
78da97de6e18: Loading layer [==================================================>]   2.56kB/2.56kB
Loaded image: wpbackup:latest

$ docker load < dbbackup.tar
8901a649dd5a: Loading layer [==================================================>]  80.61MB/80.61MB
c8d8b9eda3ff: Loading layer [==================================================>]  15.87kB/15.87kB
12e7d90d53aa: Loading layer [==================================================>]  14.12MB/14.12MB
9089ac11e28e: Loading layer [==================================================>]  1.536kB/1.536kB
9da1982b274c: Loading layer [==================================================>]   5.12kB/5.12kB
f5aefe336f9a: Loading layer [==================================================>]  238.9MB/238.9MB
16d971031a1b: Loading layer [==================================================>]  13.82kB/13.82kB
60625ac73b45: Loading layer [==================================================>]   29.7kB/29.7kB
df4a64afb207: Loading layer [==================================================>]   2.56kB/2.56kB
Loaded image: dbbackup:latest

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
dbbackup     latest    c3ed89619ecc   2 hours ago   328MB
wpbackup     latest    f04f3885701c   2 hours ago   703MB

読み込まれましたね。
ではイメージからコンテナを作成して実行してみます。

$ mkdir ~/wordpress
$ cd ~/wordpress
$ vi docker-compose.yml
----------------------------------------------------------------------
services:
   db:
     image: dbbackup:latest
     volumes:
       - ./db:/var/lib/mysql
     restart: always

   wordpress:
     depends_on:
       - db
     image: wpbackup:latest
     volumes:
       - ./web:/var/www/html
     ports:
       - "8000:80"
     restart: always
----------------------------------------------------------------------

$ docker-compose up -d
[+] Running 3/3
 ? Network wordpress_default        Created                                                                  0.1s
 ? Container wordpress-db-1         Started                                                                  0.1s
 ? Container wordpress-wordpress-1  Started

$ docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                                     NAMES
e81e858dceb4   wpbackup:latest   "docker-entrypoint.s…"   29 seconds ago   Up 29 seconds   0.0.0.0:8000->80/tcp, [::]:8000->80/tcp   wordpress-wordpress-1
50a2f011f063   dbbackup:latest   "docker-entrypoint.s…"   29 seconds ago   Up 29 seconds   3306/tcp                                  wordpress-db-1

起動したようです。
ブラウザからアクセスしてみます。

yamamoto30-dockerbackup001

あれ。。。WordPressのインストール画面になったぞ。。。。。

なぜでしょうか?
docker commitでのイメージ化の注意点として、バインドマウントやボリュームで外部領域を参照している場合、その領域はイメージに含まれないようです。なんてこった。罠過ぎです。
というわけでこのやり方では永続化されたデータが全部空になってダメでした。
回避策としては、あらかじめデータをコンテナ内にコピーしてイメージ化したり、Dockerfileを利用してイメージ化すれば良いようです。
しゃーない。Dockerfileで試してみましょう。

$ vi Dockerfile
----------------------------------------------------------------------
FROM wordpress
COPY ./web /var/www/html
----------------------------------------------------------------------

$ docker build -t wpbk .
[+] Building 1.5s (7/7) FINISHED                                                                   docker:default
 => [internal] load build definition from Dockerfile                                                         0.0s
 => => transferring dockerfile: 77B                                                                          0.0s
 => [internal] load metadata for docker.io/library/wordpress:latest                                          0.0s
 => [internal] load .dockerignore                                                                            0.0s
 => => transferring context: 2B                                                                              0.0s
 => [internal] load build context                                                                            0.8s
 => => transferring context: 80.06MB                                                                         0.7s
 => [1/2] FROM docker.io/library/wordpress:latest                                                            0.1s
 => [2/2] COPY ./web /var/www/html                                                                           0.4s
 => exporting to image                                                                                       0.3s
 => => exporting layers                                                                                      0.3s
 => => writing image sha256:2677be86f20b04f2f8231aac95d5879b1565d942c78d758684d163974885ffec                 0.0s
 => => naming to docker.io/library/wpbk                                                                      0.0s

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
wpbk         latest    2677be86f20b   28 seconds ago   783MB
dbbackup     latest    c3ed89619ecc   26 seconds ago   328MB
wpbackup     latest    f04f3885701c   44 seconds ago   703MB
wordpress    latest    630639aaf7e2   3 weeks ago      703MB
mariadb      latest    4815a3e162ea   3 months ago     328MB

$ vi Dockerfile
----------------------------------------------------------------------
FROM mariadb
COPY ./db /var/lib/mysql
----------------------------------------------------------------------

# docker build -t dbbk .

1点補足ですが、MariaDBのほうは、パーミッションの関係で一般ユーザではイメージのビルドでエラーになってしまうようだったのでroot権限で作業しています。

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
dbbk         latest    cc6b845844ff   About a minute ago   495MB
wpbk         latest    2677be86f20b   3 minutes ago        783MB
dbbackup     latest    c3ed89619ecc   26 seconds ago       328MB
wpbackup     latest    f04f3885701c   44 seconds ago       703MB
wordpress    latest    630639aaf7e2   3 weeks ago          703MB
mariadb      latest    4815a3e162ea   3 months ago         328MB

イメージができていますね。
では改めてイメージを保存します。

$ docker save wpbk > wpbk.tar
$ docker save dbbk > dbbk.tar

保存したイメージを先ほどと同様にリストア用の別サーバーへ転送して読み込みます。

$ docker load < wpbk.tar
648f4f39eac8: Loading layer [==================================================>]  82.51MB/82.51MB
Loaded image: wpbk:latest

$ docker load < dbbk.tar
0030e0cac917: Loading layer [==================================================>]  166.8MB/166.8MB
Loaded image: dbbk:latest

$ docker images
dbbk         latest    cc6b845844ff   8 minutes ago    495MB
wpbk         latest    2677be86f20b   11 minutes ago   783MB
dbbackup     latest    c3ed89619ecc   3 days ago       328MB
wpbackup     latest    f04f3885701c   4 days ago       703MB

無事イメージが読み込めました。
さて、今度こそ。

$ cd ~/wordpress
$ vi docker-compose.yml
----------------------------------------------------------------------
services:
   db:
     image: dbbk:latest
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: oRom6tsa}4R^
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wpadmin
       MYSQL_PASSWORD: 1{UFgh@bfmw4

   wordpress:
     depends_on:
       - db
     image: wpbk:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wpadmin
       WORDPRESS_DB_PASSWORD: 1{UFgh@bfmw4
----------------------------------------------------------------------

ymlを作成します。
注意点として、内部にデータを持たせたイメージを利用しているため、外部ボリュームは設定しません。設定するとデータがなくなりうまくいきませんのでお気を付けください。

$ docker-compose up -d
[+] Running 3/3
 ? Network wordpress_default        Created                                                                  0.1s
 ? Container wordpress-db-1         Started                                                                  0.8s
 ? Container wordpress-wordpress-1  Started                                                                  0.7s

$ docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS                                     NAMES
86a8932aed02   wpbk:latest   "docker-entrypoint.s…"   22 seconds ago   Up 21 seconds   0.0.0.0:8000->80/tcp, [::]:8000->80/tcp   wordpress-wordpress-1
fcb28d4787b0   dbbk:latest   "docker-entrypoint.s…"   22 seconds ago   Up 21 seconds   3306/tcp                                  wordpress-db-1

正常に起動したようです。
さて表示は。。。

yamamoto30-dockerbackup003

表示された!
画像が表示されないのはパスのせい(旧サーバーのIPアドレスがホスト名になっている)なので、WordPress設定でURLを修正すればOKです。
※データベースのwp_optionsテーブルでsiteurlとhomeを修正するのが手っ取り早いです

リストアできた・・・?

というわけで、ちょっとした罠には引っかかったものの、とりあえずはバックアップからのリストアができました。
ただ、コンテナ停止してのバックアップが必要だったり、永続化したいデータがコンテナ内データに変わってしまったりと正直これでは使いづらい。
次回は別の方法でのリストアにトライしてみましょう。

それではまた!