web-dev-qa-db-ja.com

Dockerコンテナーのコンテンツをホストファイルシステムにマウントする

Dockerコンテナーの内容を検査できるようにしたい(読み取り専用)。これを行うエレガントな方法は、コンテナのコンテンツをディレクトリにマウントすることです。コンテナーの内容をホストにマウントすることについて話しているのではなく、コンテナー内のホストにフォルダーをマウントすることについて話しているのではありません。

現在、Dockerにはaufsとbtrfsの2つのストレージドライバーがあることがわかります。私のDockerインストールではbtrfsを使用しており、/ var/lib/docker/btrfs/subvolumesを参照すると、システムのDockerコンテナーごとに1つのディレクトリが表示されます。ただし、これはDockerの実装の詳細であり、これらのディレクトリを他の場所にマウント-バインドするのは間違っていると感じています。

これを行う適切な方法はありますか、またはこれらの種類のマウントをサポートするためにDockerにパッチを適用する必要がありますか?

26
dflemstr

を見てみましょう docker export

コンテナ内のファイルをすばやく一覧表示するには:

docker export CONTAINER|tar -t

輸出する:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

または、ファイルを確認するには:

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile

Docker 1.8はcpをサポートしています:

https://docs.docker.com/reference/commandline/cp/

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

更新:これを実行するときは、DockerマシンにSSHで接続する必要があります。

14
laktak

docker commit を使用して、コンテナーの現在の状態を新しいイメージに永続化し、このイメージからインタラクティブコンテナーを起動して内容を検査できます。

ドキュメントから:

コンテナのファイルの変更や設定を新しいイメージにコミットすると便利です。これにより、インタラクティブシェルを実行してコンテナをデバッグしたり、作業中のデータセットを別のサーバーにエクスポートしたりできます。

お役に立てれば。

3
Eric Citaire

Nsenterを使用して、コンテナー/名前空間内で検査プログラム(おそらくコンテナーに既に含まれている必要があります)を実行できます。しかし、コンテナーファイルシステムをマウントするには、コンテナーファイルシステムをマウントするには、元のイメージとすべてのレイヤーをaufsである場合、またはデバイスマッパー、btrfs、および使用される他の(将来の)ストレージエンジンで同等のアクションをマウントする必要があります。おそらく、Dockerがあなたに代わって実際に行うべき作業を行い、nsenterを使用してコンテナー内の検査を行う方が効率的です。

他のアプローチがあります。 docker diffは、元の画像にあったものではなく、何が変更されたかを確認したい場合に、そのコンテナで変更されたファイルを表示します。

そして、永続的で検査可能でなければならないデータの場合、おそらくより良いパターンは、それをコンテナー内のボリュームに入れて、実際のファイルシステム、または純粋なデータコンテナー、または同じコンテナーにマウントすることですが、これらのボリュームをマウントした検査プログラムで別のコンテナーを起動できます。

2
gmuslera

編集:私は以下の解決策を試しましたが、残念ながら実際にはうまくいきませんでした。マウントされたファイルシステムは、コンテナのファイルシステムを正確に反映していませんでした(cache=noを使用した場合でも)。これが根本的な問題なのか、何か間違っているのかはわかりません。

Dockerイメージにsshdをインストールし、docker execを使用してDockerコンテナーでsshサービス(/usr/sbin/sshd -D)を実行できます(DockerコンテナーのSSHポート22を公開する必要があることに注意してください)。

次に、docker cpを使用して、公開sshキーをDockerコンテナーの/root/.ssh/authorized_keysディレクトリにコピーします。

最後に、docker inspectを使用してコンテナのIPアドレスを検索し、次のコマンドを使用してコンテナのファイルシステムをマウントします

Sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  [email protected]:/ /mnt/my_container

実際にこの作業を快適に行うには、スクリプトを作成する必要があります。

1
mnieber