はじめに
AWS ECS
などのマネージド環境ではなくて、自前でDocker
(およびdocker-compose
)を運用している場合のバックアップの取得方法について、自分自身のメモのために残しておきます。
環境
例えば、以下のようにwordpress
とmysql
コンテナをdocker-compose
で管理しているとします。
version: '3.2'
services:
wordpress:
image: wordpress
restart: always
ports:
- 80:80
mysql:
image: mysql:5.7
restart: always
volumes:
- /var/lib/mysql
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
ports:
- 3306:3306
そして、以下のようなディレクトリ構造をもっているとします。
-
backup
:Docker
コンテナとボリュームのバックアップが格納される -
bin
: バックアップ用のスクリプトが配置されている
$ tree -d -L 3
.
├── app
├── backup
│ ├── containers
│ │ └── YYYY-MM-DD
│ └── volumes
│ └── YYYY-MM-DD
├── bin
...
ボリュームのバックアップ
最終的に以下のようなスクリプトになりました。
バックアップをとるために、docker
の公式ドキュメント1ではubuntu
コンテナを使っていますが、tar
コマンドを使えればいいので、より軽量なalpine
コンテナを使うようにしました。
#!/usr/bin/env bash
# bin/backup_volumes.sh
CURRENT_DIRECTORY=$(dirname "$0")
BACKUP_DIR="backup/volumes"
cd "$CURRENT_DIRECTORY"/../
LOCAL_BACKUP_PATH="$(pwd)/$BACKUP_DIR/$(date '+%Y-%m-%d')"
rm -rf "$LOCAL_BACKUP_PATH"
mkdir -p "$LOCAL_BACKUP_PATH"
CONTAINER_PREFIX=$(basename $(pwd))
docker run --rm --volumes-from $(docker ps -q -f name="$CONTAINER_PREFIX"_mysql) -v "$LOCAL_BACKUP_PATH":/backup alpine tar cvf /backup/mysql_volumes.tar /var/lib/mysql
docker run --rm --volumes-from $(docker ps -q -f name="$CONTAINER_PREFIX"_wordpress) -v "$LOCAL_BACKUP_PATH":/backup alpine tar cvf /backup/wordpress_volumes.tar /var/www/html
bin/backup_volumes.sh
を実行すると、backup/volumes/YYYY-MM-DD
配下にバックアップファイルが作成されます。
$ bin/backup_volumes.sh
$ ls backup/volumes/YYYY-MM-DD
mysql_volumes.tar wordpress_volumes.tar
コンテナのバックアップ
最終的に以下のようなスクリプトになりました。
ほぼほぼ、Docker
の公式ドキュメント2のとおりとなりました。
#!/usr/bin/env bash
# bin/backup_containers.sh
CURRENT_DIRECTORY=$(dirname "$0")
BACKUP_DIR="backup/containers"
cd "$CURRENT_DIRECTORY"/../
LOCAL_BACKUP_PATH="$(pwd)/$BACKUP_DIR/$(date '+%Y-%m-%d')"
rm -rf "$LOCAL_BACKUP_PATH"
mkdir -p "$LOCAL_BACKUP_PATH"
CONTAINER_PREFIX=$(basename $(pwd))
docker export $(docker ps -q -f name="$CONTAINER_PREFIX"_mysql) > "$LOCAL_BACKUP_PATH/mysql_container.tar"
docker export $(docker ps -q -f name="$CONTAINER_PREFIX"_wordpress) > "$LOCAL_BACKUP_PATH/wordpress_container.tar"
bin/backup_containers.sh
を実行すると、backup/containers/YYYY-MM-DD
配下にバックアップファイルが作成されます。
$ bin/backup_containers.sh
$ ls backup/volumes/YYYY-MM-DD
mysql_container.tar wordpress_container.tar
おわりに
これで、mysql
データベースとwordpress
のソースコード、設定ファイル、プラグイン、添付ファイルをバックアップすることができました。
できれば、マネージドなDocker
環境を使いたいところですが、仕方なく自分で運用する場合は、もしもの事態に備えてバックアップをとるようにしておきましょう。
ではでは。