ホスト ディレクトリをコンテナー内のいくつかのディレクトリにバインドしようとしており、コンテナー内で行われた変更がホストに反映されることを期待しています。
私が従った手順は次のとおりです
ホストに /hostdir を作成し、Ubuntu コンテナを特権モードで実行します。
[root@nhbdlin03 ~]# mkdir /hostdir
[root@nhbdlin03 ~]# docker run -itd --privileged --name ubuntu -v /hostdir:/hostdir:z ubuntu
76aebded33274e95a6f569d0831aee4df27e9f200a8fd0401448239bd6f5bf80
[root@nhbdlin03 ~]# docker exec -it ubuntu bash
コンテナ内にcontainer_dirを作成する
root@76aebded3327:/# mkdir /container_dir
2つのディレクトリをバインドする(成功)
root@76aebded3327:/# mount --bind /container_dir /hostdir
/container_dir 内に hello.txt というファイルを作成する
root@76aebded3327:/# cd container_dir/
root@76aebded3327:/container_dir# touch hello.txt
/container_dirにバインドマウントされるため、/hostdir内に反映されます。
root@76aebded3327:/container_dir# ls /hostdir/
hello.txt
コンテナを終了してホストをチェックすると、同じことが反映されているか
root@76aebded3327:/container_dir# exit
[root@nhbdlin03 ~]# ls /hostdir/
[root@nhbdlin03 ~]# ls /hostdir/ | wc -l
0
[root@nhbdlin03 ~]#
コンテンツが反映されません。
何かが足りないか、完全に間違っています。正しい方向に導いてください。
答え1
これは設計によるものです。コンテナ内で行われたマウントは、いくつかの理由により外部からは見えません。
コンテナは別のマウント名前空間 (単純な chroot ではない) で実行され、Docker は新しい名前空間を「プライベート」モードで構成する可能性が高くなります。これは、コンテナのさまざまなマウントがホストの を乱雑にするのを防ぐためfindmnt
と、コンテナの終了時にすべてのマウントを簡単に分解できるようにするためです。
(すべてのマウントが名前空間内からのみ見える場合は、すべてのプロセスを強制終了するだけで十分です。その後、マウントはカーネルによって自動的に破棄されます。ただし、マウントの一部が外部から見える場合は、「ホスト OS」プロセスによってマウントが「使用中」のままになる可能性があります。)
内部マウントを外部から見えるようにするには、適切なタイミングで何かが必要になるかもしれませんmount --make-[r]shared /
。今のところ、より正確な答えはありません。
unshare
およびnsenter
ツールを使用して、Docker を介さずに名前空間を試すことができます。たとえば、 unshare --mount --propagation=private
1 つのターミナルで実行し、何かをマウントしてから実行し、findmnt
'unshare' プロセスの「内部」と「外部」で異なる結果が報告されるかどうかを確認します。
答え2
私の場合は、Dockerをバインドマウントする方法がshared
うまくいきました。この答え同様の質問「コンテナのマウント ポイントをホストに公開するにはどうすればよいですか?」:
-v /hostdir:/hostdir:shared
によるとDockerのドキュメントこのz
オプションは、ホスト OS が SELinux を使用していると仮定すると、同様の結果を実現するはずですが、私は試していません。