どうも、やまもとやまです。
前回の記事では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
起動したようです。
ブラウザからアクセスしてみます。
あれ。。。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
正常に起動したようです。
さて表示は。。。
表示された!
画像が表示されないのはパスのせい(旧サーバーのIPアドレスがホスト名になっている)なので、WordPress設定でURLを修正すればOKです。
※データベースのwp_optionsテーブルでsiteurlとhomeを修正するのが手っ取り早いです
リストアできた・・・?
というわけで、ちょっとした罠には引っかかったものの、とりあえずはバックアップからのリストアができました。
ただ、コンテナ停止してのバックアップが必要だったり、永続化したいデータがコンテナ内データに変わってしまったりと正直これでは使いづらい。
次回は別の方法でのリストアにトライしてみましょう。
それではまた!