web-dev-qa-db-ja.com

DockerボリュームでOverlayFSを使用する方法

一部のユースケースでは、docker volume createを使用してボリュームを作成し、それをデータで埋める可能性が必要です。次に、最初のボリュームのコピーである新しいボリュームを作成しますが、データをコピーする必要はありません。変更されたファイルのみを書き込む必要があります。

これは、Dockerがaufsまたはoverlayfsを使用してイメージとコンテナですでに行っていることです。ボリュームについてこれを解決するための戦略を知っていますか?現在Dockerボリュームで動作しない場合、Dockerホストでこのようなことを行う方法を教えていただけますか? (その後、ホストからそれらのフォルダーをマウントできます。)

今までに私はそれの2つのユースケースを持っています、多分あなたはそれを解決するために完全に異なる考えを持っています:

  1. 非常に大きなGitリポジトリ(約10GB):このリポジトリで複数のコンテナを実行する必要があります。そのうちのいくつかは変更をコミットします。したがって、他のコンテナから独立している必要があります。リモートリポジトリにコミットをプッシュすると、コピーされたボリュームが削除される可能性があります。

  2. 非常に大きなmysqlデータベース(約130GB):テスト目的やその他の移行タスクのために、データベース全体をコピーする必要はありません。

3
tabb

これに対する他の答えがないので、私は口を揃えます。今日これを達成する最良の方法は、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

これで、コンテナにアタッチできるmountpoint1mountpoint2の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内の何かに書き込みすると(ファイルの削除、ファイルへの追加、ファイルの作成など)、overlayfsupperdirへの「書き込み」のみで、myreadonlydirのデータはそのまま残されます。

コンテナーは異なるマウントポイントを使用しているため、各コンテナーの/dataへの変更は他のコンテナーに影響しません。

本当に安全にしたい場合は、データを-o roマウントして、書き込みから保護することができます。

テスト環境でスピンアップするコンテナーごとにこれを行うためのスクリプトを非常に簡単にまとめることができます。

ただし、大きなMySQLデータベースで使用した場合にoverlayfsがどの程度うまく機能するかはわかりません...内部ではworkdir内で「コピーアップ」操作を実行します。ファイルが書き込まれます。理想的には、workdirは高速ストレージ(SSD、または十分なRAMがある場合はtmpfs)に配置する必要があります。

詳細@ https://wiki.archlinux.org/index.php/Overlay_filesystem

3
Jonny