222

この Docker イメージtutum/wordpressを使用して、Wordpress Web サイトのデモを行いました。最近、イメージが MySQL データにボリュームを使用していることがわかりました。

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

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

4

16 に答える 16

182

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

docker ユーザー ガイドで説明されているように、データ ボリュームはコンテナー ファイルシステムの外部にデータを永続化するためのものです。これにより、複数のコンテナ間でのデータの共有も容易になります。

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

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

これらのダングリング ボリュームを防ぐための秘訣は、永続化するデータ ボリュームを使用して追加の Docker コンテナーを作成し、少なくともそのボリュームを参照する Docker コンテナーが常に存在するようにすることです。このようにして、そのデータ ボリューム コンテンツへのアクセスのしやすさを失うことなく、wordpress アプリを実行している Docker コンテナーを削除できます。

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

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

Docker イメージのバックアップ

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

Docker コンテナーのバックアップ

さまざまな方法で Docker コンテナをバックアップできます

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

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

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

データ ボリュームをバックアップするには、バックアップするボリュームを使用して新しいコンテナーを実行し、tar コマンドを実行してボリューム コンテンツのアーカイブを作成します ( docker ユーザー ガイドを参照) 。

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

MySQL データのバックアップ

もう 1 つの方法は、mysqldumpコマンドを使用して MySQL サーバーにリモート接続し、データベース ダンプを生成することです。ただし、これを機能させるには、MySQL サーバーがリモート接続を受け入れるように構成され、リモート接続を許可されたユーザーが必要です。これは、使用している wordpress docker イメージには当てはまらない場合があります。


編集

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

このdocker runコマンドには、オプションの新しい動作があり-vます。ボリューム名を渡すことができるようになりました。この方法で作成されたボリュームには名前が付けられ、後で簡単に参照できるため、ダングリング ボリュームの問題が緩和されます。

編集 2

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

于 2014-10-13T12:18:35.203 に答える
45

更新 2

raw 単一ボリューム バックアップの bash スクリプト:

#!/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 単一ボリュームの復元 bash スクリプト:

#!/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 という名前で、バックアップおよび復元スクリプトと同じディレクトリに存在し、ボリューム名はコンテナ間で同じです。

アップデート

コンテナーからのボリュームのバックアップは、データ コンテナーからのボリュームのバックアップと変わらないように思えます。

ボリュームはコンテナーにリンクされたパスに他ならないため、プロセスは同じです。

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

更新を終了

docker ボリューム コンテナーをバックアップおよび復元できる便利なツールがあります。

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

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

あるホストから別のホストにデータのみのボリュームを移植する方法は?

于 2014-10-13T12:19:52.660 に答える
9

これが古いことは知っていますが、データ コンテナーを (バックアップとして) Docker ハブにプッシュするための十分に文書化された解決策がないことに気付きました。https://dzone.com/articles/docker-backup-your-data-volumes-to-docker-hubで、その方法に関する短い例を公開しました

以下は結論です

docker チュートリアルでは、データ ボリュームをローカルでバックアップおよび復元できることが示唆されています。この手法を使用して、さらに数行を追加して、このバックアップを docker ハブにプッシュし、将来、必要な場所に簡単に復元できるようにします。それでは、始めましょう。手順は次のとおりです。

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}

data-conainter のボリュームを使用して whatEver イメージを実行します

docker run --volumes-from=data-container repo/whatEver

それでおしまい。

この回避策に関するドキュメントがないことに驚きました。誰かがこれを役に立てば幸いです。これについて考えるのに時間がかかったのはわかっています。

于 2016-12-22T09:31:37.593 に答える
6

次のコマンドは、すべての名前付きデータ ボリュームがマウントされたコンテナーで 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
于 2016-10-31T20:14:58.963 に答える
0

コマンド ラインから難解なオペレーターを入力するのが好きな場合は、これらの手動コンテナー バックアップ手法が気に入るはずです。コンテナーをバックアップするためのより高速で効率的な方法があり、それは同様に効果的です。ここに手順を書きました: https://www.morpheusdata.com/blog/2017-03-02-how-to-create-a-docker-backup-with-morpheus

ステップ 1: 任意のクラウドに Docker ホストを追加する Morpheus サポート サイトのチュートリアルで説明されているように、選択したクラウドに Docker ホストを数秒で追加できます。メインの Morpheus ナビゲーション バーで [インフラストラクチャ] を選択することから始めます。インフラストラクチャ ウィンドウの上部にある [ホスト] を選択し、右上の [+コンテナ ホスト] ボタンをクリックします。

Morpheus 経由で Docker ホストをクラウドにバックアップするには、[インフラストラクチャ] 画面に移動し、[+Container Hosts] メニューを開きます。

メニューでコンテナー ホスト タイプを選択し、グループを選択してから、名前、説明、可視性、クラウドの選択、タグの入力 (オプション) の 5 つのフィールドにデータを入力します。[次へ] をクリックし、サービス プランを選択してホスト オプションを構成します。[ボリューム]、[メモリ]、および [CPU カウント] フィールドは、選択したプランでカスタム オプションが有効になっている場合にのみ表示されることに注意してください。

ここで、ボリュームの追加とサイズ設定、メモリ サイズと CPU 数の設定、およびネットワークの選択を行います。OS のユーザー名とパスワード、ドメイン名、およびホスト名を構成することもできます。デフォルトでは、以前に入力したコンテナー名です。[次へ] をクリックし、自動化ワークフローを追加します (オプション)。最後に、設定を確認し、[完了] をクリックして保存します。

ステップ 2: Docker レジストリ統合をパブリックまたはプライベート クラウドに追加する Adam Hicks は、別の Morpheus チュートリアルで、プライベート Docker レジストリとの統合がいかに簡単であるかを説明しています。(Morpheus を使用して、パブリック Docker API を使用して Docker のパブリック ハブでイメージをプロビジョニングするために追加の構成は必要ありません。)

メイン ナビゲーション バーの [管理] タブで [統合] を選択し、画面の右側にある [+ 新しい統合] ボタンを選択します。表示される統合ウィンドウで、[タイプ] ドロップダウン メニューから [Docker リポジトリ] を選択し、名前を入力してプライベート レジストリ API エンドポイントを追加します。使用しているレジストリのユーザー名とパスワードを入力し、[変更を保存] ボタンをクリックします。

Morpheus の [新しい統合] ダイアログ ボックスを使用して、Docker レジストリをプライベート クラウドと統合します。

作成したばかりの統合をプロビジョニングするには、[インスタンスの作成] ダイアログの [タイプ] で [Docker] を選択し、[構成] タブの [Docker レジストリ] ドロップダウン メニューでレジストリを選択してから、Docker コンテナーと同様にプロビジョニングを続けます。

ステップ 3: バックアップ を管理する Docker ホストを追加してレジストリを統合すると、プロビジョニングするインスタンスごとにバックアップが構成され、自動的に実行されます。Morpheus サポートは、バックアップの表示、インスタンス バックアップの作成、およびサーバー バックアップの作成に関する手順を提供します。

于 2017-03-03T15:38:36.990 に答える