私はこのDocker-image tutum/wordpress を使ってWordpressのWebサイトを紹介してきました。最近、イメージがMySQLデータ用のボリュームを使用していることがわかりました。
だから問題はこれです:私はコンテナをバックアップして復元したい場合私はイメージをコミットし、後でコンテナを削除し、コミットしたイメージから新しいコンテナを作成しようとすることができます。しかし、そうするとボリュームが削除され、すべてのデータが消えてしまいます。
私のコンテナとそのボリュームデータをバックアップする簡単な方法があるはずですが、どこにも見つけることができません。
コンテナーを元に戻したい場合は、イメージをコミットしてから後でコンテナーを削除し、コミットしたイメージから新しいコンテナーを作成することができます。しかし、そのようにした場合、ボリュームが削除され、すべてのデータが消えてしまいます。
Dockerユーザーガイドが説明しているように、 データボリューム はコンテナファイルシステムの外にデータを保持することを意図しています。これにより、複数のコンテナ間でのデータの共有も容易になります。
Dockerがボリューム内のデータを削除することはありませんが(docker rm -v
で関連付けられたコンテナーを削除しない限り)、どのdockerコンテナーによっても参照されていないボリュームはダングリングボリュームと呼ばれます。それらのダングリングボリュームは取り除くのが難しく、アクセスが難しいです。
これは、ボリュームを使用している最後のコンテナが削除されるとすぐに、データボリュームがぶら下がってその内容にアクセスするのが困難になることを意味します。
これらの未使用のボリュームを防ぐための秘訣は、残したいデータボリュームを使用して追加のdockerコンテナを作成することです。ボリュームを参照する少なくともそのdockerコンテナが常に存在するようにします。このようにして、あなたはそのデータボリュームコンテンツへのアクセスの容易さを失うことなく、ワードプレスアプリを実行しているdockerコンテナを削除することができます。
そのようなコンテナは、 データボリュームコンテナ と呼ばれます。
私のコンテナとボリュームデータをバックアップする簡単な方法があるはずですが、どこにも見つからないのです。
Dockerイメージをバックアップするには、 docker load コマンドで新しいdockerイメージを作成するために後で使用できるtarアーカイブを作成する docker save コマンドを使用します。
別の方法でdockerコンテナをバックアップすることができます
これらのコマンドはdockerコンテナ階層化ファイルシステムのみをバックアップすることに注意してください。 これはデータ量を除外します。
データボリュームをバックアップするには、 docker user guide で説明されているように、バックアップしたいボリュームを使用して新しいコンテナを実行し、tarコマンドを実行してボリュームコンテンツのアーカイブを作成できます。
あなたの特定のケースでは、データボリュームはMySQLサーバーのデータを格納するために使用されます。そのため、このボリュームのtarアーカイブをエクスポートしたい場合は、まずMySQLサーバーを停止する必要があります。そうするには、ワードプレスコンテナを停止する必要があります。
もう1つの方法は、 mysqldump コマンドを使用してMySQLサーバーにリモート接続してデータベースダンプを作成することです。ただし、これが機能するためには、MySQLサーバーがリモート接続を受け付けるように設定されている必要があります。また、リモート接続を許可されているユーザーも必要です。これはあなたが使っているwordpress dockerの画像には当てはまらないかもしれません。
Dockerは最近 Dockerボリュームプラグイン を導入しました。これにより、ボリュームの処理をベンダーによって実装されたプラグインに委任することができます。
docker run
コマンドに -v
オプションの新しい動作が追加されました。ボリューム名を渡すことが可能になりました。このようにして作成されたボリュームはという名前になり、後で参照しやすくなり、ダングリングボリュームの問題が緩和されます。
Dockerはすべてのダングリングボリュームを簡単に削除するために docker volume Prune
コマンドを導入しました。
アップデート2
Rawシングルボリュームバックアップスクリプト:
#!/bin/bash
# This script allows you to backup a single volume from a container
# Data in given volume is saved in the current directory in a tar archive.
CONTAINER_NAME=$1
VOLUME_NAME=$2
usage() {
echo "Usage: $0 [container name] [volume name]"
exit 1
}
if [ -z $CONTAINER_NAME ]
then
echo "Error: missing container name parameter."
usage
fi
if [ -z $VOLUME_NAME ]
then
echo "Error: missing volume name parameter."
usage
fi
Sudo docker run -rm --volumes-from $CONTAINER_NAME -v $(pwd):/backup busybox tar cvf /backup/backup.tar $VOLUME_NAME
Rawシングルボリューム復元スクリプト:
#!/bin/bash
# This script allows you to restore a single volume from a container
# Data in restored in volume with same backupped path
NEW_CONTAINER_NAME=$1
usage() {
echo "Usage: $0 [container name]"
exit 1
}
if [ -z $NEW_CONTAINER_NAME ]
then
echo "Error: missing container name parameter."
usage
fi
Sudo docker run -rm --volumes-from $NEW_CONTAINER_NAME -v $(pwd):/backup busybox tar xvf /backup/backup.tar
使い方は次のようになります。
$ volume_backup.sh old_container /srv/www
$ Sudo docker stop old_container && Sudo docker rm old_container
$ Sudo docker run -d --name new_container myrepo/new_container
$ volume_restore.sh new_container
バックアップファイルはbackup.tarという名前で、バックアップおよび復元スクリプトと同じディレクトリにあり、ボリューム名はコンテナ間で同じです。
UPDATE
コンテナーからボリュームをバックアップすることは、データコンテナーからボリュームをバックアップすることと変わらないようです。
ボリュームはコンテナにリンクされたパスに他ならないのでプロセスは同じです。
Docker-backupが同じコンテナボリュームに対しても機能するかどうかはわかりませんが、使用できます。
Sudo docker run -rm --volumes-from yourcontainer -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
そして:
Sudo docker run -rm --volumes-from yournewcontainer -v $(pwd):/backup busybox tar xvf /backup/backup.tar
END UPDATE
Docker volumesコンテナをバックアップおよび復元するための、この素晴らしいツールがあります。
https://github.com/discordianfish/docker-backup
このようなコンテナボリュームにコンテナがリンクされているとします。
$ docker run --volumes-from=my-data-container --name my-server ...
このようにしてすべてのボリュームをバックアップできます。
$ docker-backup store my-server-backup.tar my-server
このように復元します。
$ docker-backup restore my-server-backup.tar
あるいは、公式の方法に従うこともできます。
マウントされたボリュームをバックアップするだけでよい場合は、自分のDockerhostからフォルダをコピーするだけです。
注:あなたがオンの場合bunt、Dockerhostがあなたのローカルマシンです。 Macの場合、Dockerhostが仮想マシンです。
buntuについて
ボリュームのあるフォルダはすべて/var/lib/docker/volumes/
にありますので、コピーして必要な場所にアーカイブできます。
MACの場合
Ubuntuほど簡単ではありません。 VMからファイルをコピーする必要があります。
これは、仮想マシン(Dockerサーバーが実行されている場所)からローカルコンピューターにボリュームを持つすべてのフォルダーをコピーする方法のスクリプトです。あなたのdocker-machine VMという名前がデフォルトであると仮定します。
docker-machine ssh default Sudo cp -v -R /var/lib/docker/volumes/ /home/docker/volumes
docker-machine ssh default Sudo chmod -R 777 /home/docker/volumes
docker-machine scp -R default:/home/docker/volumes ./backup_volumes
docker-machine ssh default Sudo rm -r /home/docker/volumes
現在のディレクトリにフォルダ./ backup_volumesを作成し、すべてのボリュームをこのフォルダにコピーします。
以下はローカルディレクトリ(./ backup_volumes)からDockerhostマシンにすべての保存されたボリュームをコピーする方法のスクリプトです
docker-machine scp -r ./backup_volumes default:/home/docker
docker-machine ssh default Sudo mv -f /home/docker/backup_volumes /home/docker/volumes
docker-machine ssh default Sudo chmod -R 777 /home/docker/volumes
docker-machine ssh default Sudo cp -v -R /home/docker/volumes /var/lib/docker/
docker-machine ssh default Sudo rm -r /home/docker/volumes
これで動作するかどうかを確認できます。
docker volume ls
ボリューム名をdata_volume
としましょう。以下のコマンドを使用して、data_image
という名前のdockerイメージとの間でボリュームをバックアップおよび復元できます。
バックアップする場合
docker run --rm --mount source=data_volume,destination=/data Alpine tar -c -f- data | docker run -i --name data_container Alpine tar -x -f-
docker container commit data_container data_image
docker rm data_container
復元するには
docker run --rm data_image tar -c -f- data | docker run -i --rm --mount source=data_volume,destination=/data Alpine tar -x -f-
これは古いことですが、(バックアップとして)データコンテナをdocker hubにプッシュするための十分に文書化された解決策がないことを私は認識しています。その方法についての短い例を https://dzone.com/articles/docker-backup-your-data-volumes-to-docker-hub で公開しました。
以下が最終行です
Dockerのチュートリアルでは、データボリュームをローカルにバックアップおよび復元できることをお勧めしています。私たちはこのテクニックを使用するつもりです、我々が望むどんな場所への将来の容易な回復のためにもこのバックアップをdocker hubにプッシュするためにさらに数行を追加します。それでは始めましょう。これらは続くべきステップです:
Data-container-to-backupという名前のデータコンテナからデータボリュームをバックアップします。
docker run --rm --volumes-from data-container-backup --name tmp-backup -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /folderToBackup
このtarファイルを新しいコンテナに展開して、イメージの一部としてコミットできるようにします。
docker run -d -v $(pwd):/backup --name data-backup ubuntu /bin/sh -c "cd / && tar xvf /backup/backup.tar"
目的のタグ($ VERSION)を使用して画像を確定してプッシュする
docker commit data-backup repo/data-backup:$VERSION
docker Push repo/data-backup:$VERSION
最後に、クリーンアップしましょう
docker rm data-backup
docker rmi $(docker images -f "dangling=true" -q)
現在、リポジトリにdata-backupという名前のイメージがあります。これは単にバックアップファイルとフォルダを含むファイルシステムです。このイメージ(バックアップからの復元)を使用するために、次のことを行います。
データバックアップイメージを使用してデータコンテナを実行します。
run -v /folderToBackup --entrypoint "bin/sh" --name data-container repo/data-backup:${VERSION}
データコンテナからのボリュームであなたのwhatEverイメージを実行する
docker run --volumes-from=data-container repo/whatEver
それでおしまい。
この回避策に関する文書がないことに驚きました。誰かがこれが参考になることを願っています。私はこれについて考えるのにしばらく時間がかかったことを知っています。
次のコマンドは、すべての名前付きデータボリュームをマウントしたコンテナ内でtarを実行し、出力をファイルにリダイレクトします。
docker run --rm `docker volume list -q | egrep -v '^.{64}$' | awk '{print "-v " $1 ":/mnt/" $1}'` Alpine tar -C /mnt -cj . > data-volumes.tar.bz2
問題が発生した場合に備えて、結果のアーカイブを必ずテストしてください。
tar -tjf data-volumes.tar.bz2
単純にアーカイブへの単純なバックアップが必要な場合は、私の小さなユーティリティを試すことができます。 https://github.com/loomchild/volume-backup
例
バックアップ:
docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup backup archive1
some_volume
という名前のボリュームを/tmp/archive1.tar.bz2
アーカイブファイルにアーカイブします
リストア:
docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup restore archive1
will wipeそしてsome_volume
アーカイブファイルから/tmp/archive1.tar.bz2
という名前のボリュームを復元します。
詳細情報: https://medium.com/@loomchild/backup-restore-docker-named-volumes-350397b8e362
私は単に docker-backup と呼ばれる、データとMySQLコンテナのバックアップを編成し起動するためのツールを作成しました。 docker hub上のすぐに使える画像 さえあります。
主にオーケストレーションであるため、主にBashで書かれています。実際のバックアップエンジンにはduplicity
を使用します。現在FTP(S)とAmazon S3にバックアップできます。
設定は非常に簡単です:何をバックアップするのか、どこにバックアップするのかを記述した設定ファイルをYAMLで書きましょう。
データコンテナの場合は、コンテナによって共有されているボリュームを自動的にマウントしてバックアップおよび処理します。 MySQLコンテナの場合は、それらをリンクして、コンテナにバンドルされているmysqldumpを実行して結果を処理します。
私が書いたのは、最近のdocker-engineリリースでは最新ではないDocker-Cloudを使用していて、自分のアプリケーションコンテナ内にバックアップのプロセスを含めないことでDockerの方法を採用したいからです。
コマンドラインから難解な演算子を入力したい場合は、これらの手動コンテナバックアップ技術をお勧めします。覚えておいてください、コンテナーをバックアップするためのより速くそしてより効率的な方法は同じくらい効果的です。私はここに指示を書いた: https://www.morpheusdata.com/blog/2017-03-02-how-to-create-a-docker-backup-with-morpheus
ステップ1:Dockerホストを任意のクラウドに追加するMorpheusサポートサイトのチュートリアルで説明されているように、Dockerホストを自分のクラウドに追加できます。ほんの数秒で選択。 MorpheusのメインナビゲーションバーのInfrastructureを選択することから始めます。インフラストラクチャウィンドウの上部にある[Hosts]を選択し、右上の[+ Container Hosts]ボタンをクリックします。
Morpheusを介してDockerホストをクラウドにバックアップするには、[Infrastructure]画面に移動して[+ Container Hosts]メニューを開きます。
メニューでコンテナのホストタイプを選択し、グループを選択してから、名前、説明、表示、クラウドの選択、およびタグの入力の5つのフィールドにデータを入力します(オプション)。 「次へ」をクリックしてから、サービスプランを選択して「ホスト」オプションを構成します。 [Volume]、[Memory]、および[CPU count]フィールドは、選択したプランでカスタムオプションが有効になっている場合にのみ表示されます。
ここで、ボリュームの追加とサイズ設定、メモリサイズとCPU数の設定、およびネットワークの選択を行います。 OSのユーザ名とパスワード、ドメイン名、およびホスト名を設定することもできます。デフォルトでは、以前に入力したコンテナ名です。 「次へ」をクリックしてから、任意の自動化ワークフローを追加します(オプション)。最後に、設定を確認し、「完了」をクリックしてそれらを保存します。
ステップ2:パブリックまたはプライベートクラウドへのDocker Registry統合の追加Adam Hicksは、別のMorpheusチュートリアルで、プライベートDockerレジストリと統合するのがどれほど簡単かを説明します。 (パブリックDocker APIを使用してDockerのパブリックハブでイメージをプロビジョニングするためにMorpheusを使用するために追加の構成は必要ありません。)
メインナビゲーションバーの[管理]タブで[統合]を選択し、画面右側の[+新規統合]ボタンをクリックします。表示される[統合]ウィンドウの[種類]ドロップダウンメニューで[Dockerリポジトリ]を選択し、名前を入力してプライベートレジストリAPIエンドポイントを追加します。使用しているレジストリのユーザー名とパスワードを入力して、[変更を保存]ボタンをクリックします。
Morpheusの[New Integration]ダイアログボックスを使用して、Dockerレジストリをプライベートクラウドと統合します。
作成したばかりの統合をプロビジョニングするには、Create InstanceダイアログのTypeでDockerを選択し、ConfigureタブのDocker Registryドロップダウンメニューでレジストリを選択してから、他のDockerコンテナと同様にプロビジョニングを続行します。
ステップ3:バックアップを管理するDockerホストを追加してレジストリを統合すると、プロビジョニングしたインスタンスごとにバックアップが自動的に構成され実行されます。 Morpheusのサポートでは、バックアップの表示、インスタンスバックアップの作成、およびサーバーバックアップの作成について説明しています。
あなたが私のものと同じくらい単純なケースを持っているなら、あなたは以下をすることができます:
ADD folder destination
を使ってあなたのイメージにそれらのファイル/フォルダーを追加することができますたとえば、ホームディレクトリのボリュームからのデータがあると仮定すると(たとえば/home/mydata
に)、次のように実行できます。
DOCKERFILE=/home/dockerfile.bk-myimage
docker build --rm --no-cache -t $IMAGENAME:$TAG -f $DOCKERFILE /home/pirate
あなたのDOCKERFILEがこのようなファイルを指す場所:
FROM user/myimage
MAINTAINER Danielo Rodríguez Rivero <[email protected]>
WORKDIR /opt/data
ADD mydata .
その他のものはベースイメージから継承されます。これで、その画像をdocker cloudにプッシュすることができ、ユーザーは自分のコンテナで直接データを利用できるようになります
完全バックアップが必要な場合は、いくつかの手順を実行する必要があります。
コンテナをイメージにDockerコミットするだけでは、コンテナにアタッチされているボリュームは含まれません(ref: Docker commitのドキュメント )。
"コミット操作はコンテナ内にマウントされたボリュームに含まれるデータを含みません。"
プロジェクトでdocker-composeを使用している場合は、ここにボリュームのバックアップと復元のための方法を示します。
基本的にあなたはdb-backup
とdb-restore
サービスをあなたのdocker-compose.ymlファイルに追加し、それをあなたのボリュームの名前に合わせます。この例では、私のボリュームはdbdata
です。
version: "3"
services:
db:
image: percona:5.7
volumes:
- dbdata:/var/lib/mysql
db-backup:
image: Alpine
tty: false
environment:
- TARGET=dbdata
volumes:
- ./backup:/backup
- dbdata:/volume
command: sh -c "tar -cjf /backup/$${TARGET}.tar.bz2 -C /volume ./"
db-restore:
image: Alpine
environment:
- SOURCE=dbdata
volumes:
- ./backup:/backup
- dbdata:/volume
command: sh -c "rm -rf /volume/* /volume/..?* /volume/.[!.]* ; tar -C /volume/ -xjf /backup/$${SOURCE}.tar.bz2"
データの整合性を保つために、バックアップまたは復元する前にdbコンテナを停止してください。
docker-compose stop db
デフォルトの保存先(backup/dbdata.tar.bz2
)にバックアップするには:
docker-compose run --rm db-backup
あるいは、代替ターゲット名を指定したい場合は、次のようにします。
docker-compose run --rm -e TARGET=mybackup db-backup
backup/dbdata.tar.bz2
から復元するには、次の操作を行います。
docker-compose run --rm db-restore
または特定のファイルから復元するには
docker-compose run --rm -e SOURCE=mybackup db-restore
私は https://loomchild.net/2017/03/26/backup-restore-docker-named-volumes/ からのコマンドを適応させてこのアプローチを作成しました。