1

ローカル ホスト ディレクトリにボリュームがマウントされた実行中のコンテナーがあります。

    "Mounts": [
        {
            "Source": "/var/lib/postgresql-9.5-docker",
            "Destination": "/var/lib/postgresql/data",
            "Mode": "",
            "RW": true,
            "Propagation": "rprivate"
        }
    ],

ホストからコンテナーにデータを提供したい場合 (例えば、大きな postgres ダンプ)、ホストからホスト ディレクトリにファイルを直接書き込むのは安全ですか?

/var/lib/postgresql-9.5-docker/foo/

?

簡単なテストでは、これが機能していることを示しています (つまり、コンテナーに対して bash を実行してチェックすると、ファイルが存在します)。しかし、データの一貫性については安全ですか?

ノート:

私も使用できることを知っています

docker cp /path/to/src <containerid>:/path/to/dest

しかし、私の特定のケースでは、ボリュームが Ceph (rbd) からマウントされている場合、これは機能しません。

4

1 に答える 1

2

ホスト ディレクトリへのファイルのコピーは、ホスト ファイル システムに期待するのと同じくらい一貫性があり、docker を介して行われます。コンテナとホストの間には非常に薄い層があります。

デフォルトのドライバーを介してdocker ボリュームを使用localすると、これらのボリュームもローカル ホスト ファイルシステムを使用するため、同様のアクセスが提供されます。

docker コンテナー ファイル システムへのファイルのコピーは、dockerを実行するストレージ ドライバーによって異なります。デフォルトでは、これは AUFS (まもなく OverlayFS になる予定) であるため、標準ファイル システムの上に追加のレイヤーがあります。一貫性が低下するとは思いませんが、余分なレイヤーがあるため、問題やバグが発生する可能性が高くなり、ローカルファイルシステムほどパフォーマンスが低下します.

ホストとコンテナの両方からアクセス

コンテナーから得られる機能の 1 つは、ホストとコンテナーの間で情報が共有されることです。コンテナで行うことはすべて、実際にはホスト カーネルで行われます。したがって、ファイルをロックすると、ホストはそれを見ることができます。ファイルmmaped がある場合、ホストのグローバルmmap空間を共有します。

コンテナーとホストの両方から同じファイル システムにアクセスしたり、同じファイル システムに書き込んだりしても問題ありません。両者の間に違いや遅延はありません。

同じファイルまたはファイルの場所に書き込む複数のプロセスには、マルチプロセス システムと同じ制約があります。プロセスは、ファイルのロックまたはミューテックスを使用する必要があります。そうしないと、書き込みがインターリーブされる可能性があります。

于 2016-06-02T10:01:20.353 に答える