web-dev-qa-db-ja.com

Dockerコンテナーをそのデータボリュームと一緒にバックアップするにはどうすればよいですか?

私はこのDocker-image tutum/wordpress を使ってWordpressのWebサイトを紹介してきました。最近、イメージがMySQLデータ用のボリュームを使用していることがわかりました。

だから問題はこれです:私はコンテナをバックアップして復元したい場合私はイメージをコミットし、後でコンテナを削除し、コミットしたイメージから新しいコンテナを作成しようとすることができます。しかし、そうするとボリュームが削除され、すべてのデータが消えてしまいます。

私のコンテナとそのボリュームデータをバックアップする簡単な方法があるはずですが、どこにも見つけることができません。

107
pguardiario

コンテナーを元に戻したい場合は、イメージをコミットしてから後でコンテナーを削除し、コミットしたイメージから新しいコンテナーを作成することができます。しかし、そのようにした場合、ボリュームが削除され、すべてのデータが消えてしまいます。

Dockerユーザーガイドが説明しているように、 データボリューム はコンテナファイルシステムの外にデータを保持することを意図しています。これにより、複数のコンテナ間でのデータの共有も容易になります。

Dockerがボリューム内のデータを削除することはありませんが(docker rm -vで関連付けられたコンテナーを削除しない限り)、どのdockerコンテナーによっても参照されていないボリュームはダングリングボリュームと呼ばれます。それらのダングリングボリュームは取り除くのが難しく、アクセスが難しいです。

これは、ボリュームを使用している最後のコンテナが削除されるとすぐに、データボリュームがぶら下がってその内容にアクセスするのが困難になることを意味します。

これらの未使用のボリュームを防ぐための秘訣は、残したいデータボリュームを使用して追加のdockerコンテナを作成することです。ボリュームを参照する少なくともそのdockerコンテナが常に存在するようにします。このようにして、あなたはそのデータボリュームコンテンツへのアクセスの容易さを失うことなく、ワードプレスアプリを実行しているdockerコンテナを削除することができます。

そのようなコンテナは、 データボリュームコンテナ と呼ばれます。

私のコンテナとボリュームデータをバックアップする簡単な方法があるはずですが、どこにも見つからないのです。

バックアップドッカーの画像

Dockerイメージをバックアップするには、 docker load コマンドで新しいdockerイメージを作成するために後で使用できるtarアーカイブを作成する docker save コマンドを使用します。

バックアップドッカーコンテナ

別の方法でdockerコンテナをバックアップすることができます

  • docker commit コマンドを使用して、dockerコンテナの現在の状態に基づいて新しいdockerイメージをコミットする
  • docker export コマンドを使用して、dockerコンテナファイルシステムをtarアーカイブとしてエクスポートします。あとで docker import コマンドを使って、そのtarアーカイブから新しいdockerイメージを作成することができます。

これらのコマンドはdockerコンテナ階層化ファイルシステムのみをバックアップすることに注意してください。 これはデータ量を除外します

バックアップドッカーのデータボリューム

データボリュームをバックアップするには、 docker user guide で説明されているように、バックアップしたいボリュームを使用して新しいコンテナを実行し、tarコマンドを実行してボリュームコンテンツのアーカイブを作成できます。

あなたの特定のケースでは、データボリュームはMySQLサーバーのデータを格納するために使用されます。そのため、このボリュームのtarアーカイブをエクスポートしたい場合は、まずMySQLサーバーを停止する必要があります。そうするには、ワードプレスコンテナを停止する必要があります。

mySQLデータをバックアップする

もう1つの方法は、 mysqldump コマンドを使用してMySQLサーバーにリモート接続してデータベースダンプを作成することです。ただし、これが機能するためには、MySQLサーバーがリモート接続を受け付けるように設定されている必要があります。また、リモート接続を許可されているユーザーも必要です。これはあなたが使っているwordpress dockerの画像には当てはまらないかもしれません。


編集する

Dockerは最近 Dockerボリュームプラグイン を導入しました。これにより、ボリュームの処理をベンダーによって実装されたプラグインに委任することができます。

docker runコマンドに -v オプションの新しい動作が追加されました。ボリューム名を渡すことが可能になりました。このようにして作成されたボリュームはという名前になり、後で参照しやすくなり、ダングリングボリュームの問題が緩和されます。

編集2

Dockerはすべてのダングリングボリュームを簡単に削除するために docker volume Prune コマンドを導入しました。

107
Thomasleveil

アップデート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

あるいは、公式の方法に従うこともできます。

データ専用ボリュームをあるホストから別のホストに移植するにはどうすればいいですか?

23
tommasop

マウントされたボリュームをバックアップするだけでよい場合は、自分のDockerhostからフォルダをコピーするだけです。

注:あなたがオンの場合buntDockerhostがあなたのローカルマシンです。 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
12
Andrii Dvoiak

ボリューム名を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-
9
Sahil Ahuja

これは古いことですが、(バックアップとして)データコンテナを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

それでおしまい。

この回避策に関する文書がないことに驚きました。誰かがこれが参考になることを願っています。私はこれについて考えるのにしばらく時間がかかったことを知っています。

7
z-star

次のコマンドは、すべての名前付きデータボリュームをマウントしたコンテナ内で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
4
konrad

単純にアーカイブへの単純なバックアップが必要な場合は、私の小さなユーティリティを試すことができます。 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

3
loomchild

私は単に docker-backup と呼ばれる、データとMySQLコンテナのバックアップを編成し起動するためのツールを作成しました。 docker hub上のすぐに使える画像 さえあります。

主にオーケストレーションであるため、主にBashで書かれています。実際のバックアップエンジンにはduplicityを使用します。現在FTP(S)とAmazon S3にバックアップできます。

設定は非常に簡単です:何をバックアップするのか、どこにバックアップするのかを記述した設定ファイルをYAMLで書きましょう。

データコンテナの場合は、コンテナによって共有されているボリュームを自動的にマウントしてバックアップおよび処理します。 MySQLコンテナの場合は、それらをリンクして、コンテナにバンドルされているmysqldumpを実行して結果を処理します。

私が書いたのは、最近のdocker-engineリリースでは最新ではないDocker-Cloudを使用していて、自分のアプリケーションコンテナ内にバックアップのプロセスを含めないことでDockerの方法を採用したいからです。

2
Arnaud de Mouhy

コマンドラインから難解な演算子を入力したい場合は、これらの手動コンテナバックアップ技術をお勧めします。覚えておいてください、コンテナーをバックアップするためのより速くそしてより効率的な方法は同じくらい効果的です。私はここに指示を書いた: 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のサポートでは、バックアップの表示、インスタンスバックアップの作成、およびサーバーバックアップの作成について説明しています。

1
thelefty07

あなたが私のものと同じくらい単純なケースを持っているなら、あなたは以下をすることができます:

  1. コンテナーの基本イメージを拡張するDockerfileを作成します。
  2. 私はあなたのボリュームがあなたのファイルシステムにマッピングされていると仮定します、それであなたはADD folder destinationを使ってあなたのイメージにそれらのファイル/フォルダーを追加することができます
  3. 完了しました。

たとえば、ホームディレクトリのボリュームからのデータがあると仮定すると(たとえば/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にプッシュすることができ、ユーザーは自分のコンテナで直接データを利用できるようになります

0
Danielo515

完全バックアップが必要な場合は、いくつかの手順を実行する必要があります。

  1. コンテナを画像にコミットする
  2. 画像を保存する
  3. コンテナのボリュームのマウントポイントのtarファイルを作成して、コンテナのボリュームをバックアップします。
  4. データベースコンテナに対しても手順1〜3を繰り返します。

コンテナをイメージにDockerコミットするだけでは、コンテナにアタッチされているボリュームは含まれません(ref: Docker commitのドキュメント )。

"コミット操作はコンテナ内にマウントされたボリュームに含まれるデータを含みません。"

0
eaglet3d

プロジェクトでdocker-composeを使用している場合は、ここにボリュームのバックアップと復元のための方法を示します。

docker-compose.yml

基本的にあなたはdb-backupdb-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/ からのコマンドを適応させてこのアプローチを作成しました。

0
jdhildeb