1039

Docker コンテナーの永続ストレージをどのように扱うのでしょうか?

私は現在、このアプローチを使用しています。たとえば、PostgreSQL 用のイメージをビルドしてから、コンテナーを開始します。

docker run --volumes-from c0dbc34fd631 -d app_name/postgres

IMHOには、コンテナ「c0dbc34fd631」を(偶然に)削除してはならないという欠点があります。

ホスト ボリュームを「-v」でコンテナーにマウントすることも考えられますが、コンテナー内のユーザーIDがホストからのユーザー IDと必ずしも一致するとは限らず、権限が台無しになる可能性があります。

注:代わりに、データのみのコンテナに割り当てた名前を使用する--volumes-from 'cryptic_id'こともできます(受け入れられた回答を参照)--volumes-from my-data-containermy-data-containerdocker run --name my-data-container ...

4

15 に答える 15

1004

Docker 1.9.0 以降

ボリューム APIを使用する

docker volume create --name hello
docker run -d -v hello:/container/path/for/volume container_image my_command

これは、新しいボリュームを優先して、データのみのコンテナー パターンを破棄する必要があることを意味します。

実際、ボリューム API は、データ コンテナー パターンを実現するためのより良い方法にすぎません。

Dockerでコンテナーを作成すると-v volume_name:/container/fs/path、次のことができる名前付きボリュームが自動的に作成されます。

  1. を通じてリストされるdocker volume ls
  2. を通じて識別されるdocker volume inspect volume_name
  3. 通常のディレクトリとしてバックアップ
  4. --volumes-from接続を介して以前と同様にバックアップ

新しいボリューム API には、ダングリング ボリュームを特定できる便利なコマンドが追加されています。

docker volume ls -f dangling=true

そして、その名前でそれを削除します:

docker volume rm <volume name>

@mpugach がコメントで下線を引いているように、素敵なワンライナーでぶら下がっているすべてのボリュームを取り除くことができます。

docker volume rm $(docker volume ls -f dangling=true -q)
# Or using 1.13.x
docker volume prune

Docker 1.8.x 以下

本番環境に最も適していると思われるアプローチは、データのみのコンテナーを使用することです。

データのみのコンテナーはベアボーン イメージで実行され、実際にはデータ ボリュームを公開する以外には何もしません。

次に、他のコンテナを実行して、データ コンテナ ボリュームにアクセスできます。

docker run --volumes-from data-container some-other-container command-to-execute
  • ここでは、さまざまなコンテナーを配置する方法をよく理解できます。
  • ここでは、ボリュームがどのように機能するかについての良い洞察があります。

このブログ投稿には、ボリューム パターンとしてのいわゆるコンテナの適切な説明があり、データのみのコンテナを持つことの要点を明確にしています。

Docker のドキュメントには、コンテナーの明確な説明がボリューム/秒パターンとして含まれるようになりました。

以下は、Docker 1.8.x 以下のバックアップ/復元手順です。

バックアップ:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm: 終了時にコンテナを削除します
  • --volumes-from DATA: DATA コンテナーによって共有されるボリュームに接続します
  • -v $(pwd):/backup: 現在のディレクトリをコンテナーにバインド マウントします。tarファイルを書き込む
  • busybox: 小さくシンプルなイメージ - 迅速なメンテナンスに適しています
  • tar cvf /backup/backup.tar /data: /data ディレクトリ内のすべてのファイルの圧縮されていない tar ファイルを作成します

戻す:

# Create a new data container
$ sudo docker run -v /data -name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# Compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt

これは、コンテナとデータ コンテナに同じイメージを使用することがなぜ良いのかを説明している優れた Brian Goff の素晴らしい記事です。

于 2013-12-18T07:50:09.230 に答える
82

Docker リリース v1.0では、ホスト マシン上のファイルまたはディレクトリのマウントをバインドするには、次のコマンドを使用します。

$ docker run -v /host:/container ...

上記のボリュームは、Docker を実行しているホストで永続ストレージとして使用できます。

于 2014-10-29T10:30:59.693 に答える
18

選択した回答の更新 5 から明らかでない場合、Docker 1.9 の時点で、特定のコンテナーに関連付けられていなくても存在できるボリュームを作成できるため、「データのみのコンテナー」パターンは廃止されます。

データのみのコンテナーは docker 1.9.0 で廃止されましたか? を参照してください。#17798 .

Docker のメンテナーは、データのみのコンテナー パターンが少し設計上の臭いであることに気付き、ボリュームを関連付けられたコンテナーなしで存在できる別個のエンティティにすることに決めたと思います。

于 2016-02-15T16:47:13.580 に答える
14

これはまだ作業が必要なDocker の一部ですが、別のコンテナーからボリュームをコピーする必要がないように、VOLUME 命令を使用してボリュームを Dockerfile に配置する必要があります。

これにより、コンテナーの相互依存が少なくなり、あるコンテナーの削除が別のコンテナーに影響を与えることを心配する必要がなくなります。

于 2013-09-12T19:10:35.303 に答える
8

ボリュームを移動したい場合は、Flockerも参照してください。

README から:

Flocker は、データ ボリューム マネージャーおよびマルチホスト Docker クラスター管理ツールです。これにより、Linux で ZFS の機能を活用することにより、ステートレス アプリケーションに使用するのと同じツールを使用してデータを制御できます。

これは、Docker でデータベース、キュー、およびキーと値のストアを実行し、アプリケーションの他の部分と同じように簡単に移動できることを意味します。

于 2015-04-02T11:58:59.240 に答える
0

Docker コンテナの管理およびスケジューリング ツールである Kubernetes の Persistent Volume Claim (PVC) を使用します。

永続ボリューム

この目的で Kubernetes を使用する利点は次のとおりです。

  • NFS やその他のストレージなどの任意のストレージを使用でき、ノードがダウンしている場合でも、ストレージがダウンしている必要はありません。
  • さらに、このようなボリューム内のデータは、コンテナー自体が破棄された後でも保持されるように構成できます。これにより、必要に応じて別のコンテナーによって再利用できるようになります。
于 2016-10-13T07:28:22.900 に答える