호스트 디렉토리를 컨테이너 내부의 일부 디렉토리에 바인딩하려고 하며 컨테이너 내부에서 수행된 변경 사항이 호스트에 반영되어야 합니다.
내가 따라온 단계는 다음과 같습니다.
호스트에 /hostdir을 생성하고 권한 모드에서 우분투 컨테이너를 실행합니다.
[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
컨테이너 내부에 컨테이너_디렉터리 생성
root@76aebded3327:/# mkdir /container_dir
두 디렉터리 바인딩(성공)
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
하나의 터미널에서 실행하고 무언가를 마운트한 다음 실행하여 findmnt
'공유 해제' 프로세스 "내부"와 "외부"에서 서로 다른 결과를 보고하는지 확인할 수 있습니다.
답변2
shared
나에게 도움이 된 것은 다음에 설명된 대로 Docker 바인드 마운트를 만드는 것이었습니다.이 답변비슷한 질문 "컨테이너의 마운트 지점을 호스트에 노출하는 방법은 무엇입니까?":
-v /hostdir:/hostdir:shared
에 따르면Docker의 문서호스트 OS가 SELinux를 사용한다고 가정하면 이 z
옵션은 비슷한 결과를 얻을 수 있지만 시도하지는 않았습니다.