一部のユースケースでは、docker volume create
を使用してボリュームを作成し、それをデータで埋める可能性が必要です。次に、最初のボリュームのコピーである新しいボリュームを作成しますが、データをコピーする必要はありません。変更されたファイルのみを書き込む必要があります。
これは、Dockerがaufsまたはoverlayfsを使用してイメージとコンテナですでに行っていることです。ボリュームについてこれを解決するための戦略を知っていますか?現在Dockerボリュームで動作しない場合、Dockerホストでこのようなことを行う方法を教えていただけますか? (その後、ホストからそれらのフォルダーをマウントできます。)
今までに私はそれの2つのユースケースを持っています、多分あなたはそれを解決するために完全に異なる考えを持っています:
非常に大きなGitリポジトリ(約10GB):このリポジトリで複数のコンテナを実行する必要があります。そのうちのいくつかは変更をコミットします。したがって、他のコンテナから独立している必要があります。リモートリポジトリにコミットをプッシュすると、コピーされたボリュームが削除される可能性があります。
非常に大きなmysqlデータベース(約130GB):テスト目的やその他の移行タスクのために、データベース全体をコピーする必要はありません。
これに対する他の答えがないので、私は口を揃えます。今日これを達成する最良の方法は、overlayfs
を使用してこれを自分で行うことです。最近のLinuxカーネルに含まれているため、追加のパッケージやモジュールなしで作業を進めることができます(3.18以降を使用している場合)。
overlayfs
を使用するには、変更したくない既存のディレクトリに加えて、作業ディレクトリ、「上位」ディレクトリ、およびマウントポイントが必要です。
myreadonlydir
にコンテナーを変更したくないデータがあるとすると、次のように2つのオーバーレイを作成できます。
mkdir upperdir1 workdir1 mountpoint1 upperdir2 workdir2 mountpoint2
Sudo mount -t overlay overlay -o lowerdir=myreadonlydir,upperdir=upperdir1,workdir=workdir1 mountpoint1
Sudo mount -t overlay overlay -o lowerdir=myreadonlydir,upperdir=upperdir2,workdir=workdir2 mountpoint2
これで、コンテナにアタッチできるmountpoint1
とmountpoint2
の2つのマウントポイントができました。
docker run -v $PWD/mountpoint1:/data Alpine:3.6 # first container
docker run -v $PWD/mountpoint2:/data Alpine:3.6 # second container
そして、各コンテナは/data
内のmyreadonlydir
の内容を参照します。 /data
内の何かに書き込みすると(ファイルの削除、ファイルへの追加、ファイルの作成など)、overlayfs
はupperdir
への「書き込み」のみで、myreadonlydir
のデータはそのまま残されます。
コンテナーは異なるマウントポイントを使用しているため、各コンテナーの/data
への変更は他のコンテナーに影響しません。
本当に安全にしたい場合は、データを-o ro
マウントして、書き込みから保護することができます。
テスト環境でスピンアップするコンテナーごとにこれを行うためのスクリプトを非常に簡単にまとめることができます。
ただし、大きなMySQLデータベースで使用した場合にoverlayfs
がどの程度うまく機能するかはわかりません...内部ではworkdir
内で「コピーアップ」操作を実行します。ファイルが書き込まれます。理想的には、workdir
は高速ストレージ(SSD、または十分なRAMがある場合はtmpfs
)に配置する必要があります。
詳細@ https://wiki.archlinux.org/index.php/Overlay_filesystem 。