2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Dockerコンテナとボリュームを圧縮ファイルにバックアップする

Last updated at Posted at 2019-02-11

はじめに

AWS ECSなどのマネージド環境ではなくて、自前でDocker(およびdocker-compose)を運用している場合のバックアップの取得方法について、自分自身のメモのために残しておきます。

環境

例えば、以下のようにwordpressmysqlコンテナを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環境を使いたいところですが、仕方なく自分で運用する場合は、もしもの事態に備えてバックアップをとるようにしておきましょう。
ではでは。

  1. Use volumes | Docker Documentation #backup-a-container

  2. docker export | Docker Documentation

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?