[docker] Docker 컨테이너에 호스트 디렉토리를 마운트하는 방법

호스트 디렉토리를 Docker 컨테이너에 마운트하려고 시도하여 호스트에서 수행 된 모든 업데이트가 Docker 컨테이너에 반영됩니다.

내가 뭘 잘못하고 있니? 여기 내가 한 일이 있습니다.

kishore$ cat Dockerfile

FROM ubuntu:trusty
RUN apt-get update
RUN apt-get -y install git curl vim
CMD ["/bin/bash"]
WORKDIR /test_container
VOLUME ["/test_container"]

kishore$ tree
.
├── Dockerfile
└── main_folder
    ├── tfile1.txt
    ├── tfile2.txt
    ├── tfile3.txt
    └── tfile4.txt

1 directory, 5 files kishore$ pwd /Users/kishore/tdock

kishore$ docker build --tag=k3_s3:latest .

Uploading context 7.168 kB
Uploading context
Step 0 : FROM ubuntu:trusty
 ---> 99ec81b80c55
Step 1 : RUN apt-get update
 ---> Using cache
 ---> 1c7282005040
Step 2 : RUN apt-get -y install git curl vim
 ---> Using cache
 ---> aed48634e300
Step 3 : CMD ["/bin/bash"]
 ---> Running in d081b576878d
 ---> 65db8df48595
Step 4 : WORKDIR /test_container
 ---> Running in 5b8d2ccd719d
 ---> 250369b30e1f
Step 5 : VOLUME ["/test_container"]
 ---> Running in 72ca332d9809
 ---> 163deb2b1bc5
Successfully built 163deb2b1bc5
Removing intermediate container b8bfcb071441
Removing intermediate container d081b576878d
Removing intermediate container 5b8d2ccd719d
Removing intermediate container 72ca332d9809

kishore$ docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest
c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea

kishore$ docker run -i -t k3_s3:latest /bin/bash

root@0f17e2313a46:/test_container# ls -al
total 8
drwx------  2 root root 4096 Apr 29 05:15 .
drwxr-xr-x 66 root root 4096 Apr 29 05:15 ..

root@0f17e2313a46:/test_container# exit
exit

kishore$ docker -v
Docker version 0.9.1, build 867b2a9

  • boot2docker 버전을 확인하는 방법을 모르겠습니다

질문, 직면 문제 :

  1. main_folder를 docker container 안에있는 test_container 폴더에 어떻게 연결해야합니까?
  2. 이것을 자동으로 만들어야합니다. 실제로 run -d -v명령을 사용하지 않고 어떻게해야 합니까?
  3. boot2docker가 충돌하면 어떻게됩니까? Docker 파일은 어디에 저장됩니까 (Dockerfile 제외)?


답변

이를 수행 할 수있는 몇 가지 방법이 있습니다. 가장 간단한 방법은 다음 ADD과 같이 dockerfile 명령 을 사용하는 것입니다.

ADD . /path/inside/docker/container

그러나 dockerfile을 빌드 한 후 호스트에서이 디렉토리를 변경하면 컨테이너에 표시되지 않습니다. 컨테이너를 빌드 할 때 docker는 디렉토리를 a로 압축하고 .tar해당 컨텍스트 를 컨테이너에 영구적으로 업로드하기 때문 입니다.

두 번째 방법은 볼륨을 마운트하는 방법입니다. 호스트 디렉토리는 실행중인 시스템에 따라 변경 될 수 있으므로 가능한 한 이식성을 높이려고 시도하기 때문에 호스트 디렉토리를 dockerfile 내의 docker 컨테이너 디렉토리에 맵핑 할 수 없습니다. 호스트 디렉토리를 docker 컨테이너 디렉토리에 매핑하려면 docker를 사용할 -v때 다음과 같이 플래그 를 사용해야합니다 .

docker run -v /host/directory:/container/directory -other -options image_name command_to_run


답변

이 질문의 사용자가를 사용 Docker version 0.9.1, build 867b2a9하고 있습니다. 도커 버전> = 17.06에 대한 답변을 드리겠습니다.

컨테이너 디렉토리 내에서 로컬 디렉토리를 동기화 된 상태로 유지하려면 type을 사용하여 볼륨을 마운트하십시오 bind. 소스 (시스템)와 대상 (Docker 컨테이너의) 디렉토리가 바인드됩니다. 리눅스에 디렉토리를 마운트하는 것과 거의 같습니다.

Docker 문서에 따르면 이제 마운트하는 적절한 명령이 mount대신 사용됩니다 -v. 문서는 다음과 같습니다.

  • --mount: 쉼표로 구분 된 여러 키-값 쌍으로 구성됩니다. 각 키 / 값 쌍은 <key>=<value>튜플 형태를 취합니다 . --mount구문은 이상 장황 -v하거나 --volume,하지만 키의 순서는 중요하지 않습니다, 그리고 플래그의 값이 이해하기 쉽다.

  • type될 수있는 산의 bind, volume또는 tmpfs. (우리는 bind 를 사용할 것입니다 )

  • source의 마운트. 바인드 마운트의 경우 Docker 데몬 호스트의 파일 또는 디렉토리 경로입니다. source또는 로 지정 될 수 있습니다 src.

  • destination그 값으로 파일이나 디렉토리가 컨테이너에 장착 될 경로를합니다. 로 지정 될 수 있습니다 destination, dst또는 target.

따라서 현재 디렉토리 (소스)를 /test_container(target) 으로 마운트하려면 다음 을 사용합니다.

    docker run -it --mount src="$(pwd)",target=/test_container,type=bind k3_s3

이러한 마운트 매개 변수에 공백이 있으면 따옴표로 묶어야합니다. 내가 모르는 것을 알면 `pwd`대신 사용 합니다.

    docker run -it --mount src=`pwd`,target=/test_container,type=bind k3_s3

또한 파일 권한을 다루어야합니다 ( 이 기사 참조) .


답변

2 개의 연속 마운트 : 여기에 많은 게시물이 두 개의 boot2docker를 사용하고 있다고 생각합니다. 아무 것도 보이지 않는 이유는 호스트가 아닌 boot2docker에서 디렉토리를 마운트하기 때문입니다.

기본적으로 2 개의 연속 마운트가 필요합니다.

호스트에서 시스템으로 디렉토리를 마운트하는 첫 번째 디렉토리

두 번째는 다음과 같이 boot2docker에서 컨테이너로 새 디렉토리를 마운트합니다.

  • 1) 로컬 시스템을 마운트 boot2docker

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  • 2) boot2docker리눅스 컨테이너에 파일 마운트

    docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
    

그런 다음 ls안에 containerfolder있으면의 내용이 표시 hostfolder됩니다.


답변

cli에서 -v 옵션을 사용할 수 있습니다.이 기능은 Dockerfile을 통해 사용할 수 없습니다

docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash

여기서 host_dir은 마운트하려는 호스트의 디렉토리입니다. 컨테이너의 디렉토리가 존재하지 않으면 디렉토리의 디렉토리에 대해 걱정할 필요가 없습니다.

호스트 시스템 (루트 권한 하에서)에서 host_dir을 변경하면 컨테이너에 표시 될 수 있으며 그 반대도 마찬가지입니다.


답변

OS X boot2docker또는 이와 유사한 것을 통해 docker를 사용할 수 있습니까?

나는 똑같은 경험을했습니다. 명령은 정확하지만 컨테이너에 아무 것도 (상식적으로) 장착되어 있지 않습니다.

그것은 이미 docker documentation에 설명되어 있습니다 . 때 사용자가 입력 docker run -v /var/logs/on/host:/var/logs/in/container ...한 다음 /var/logs/on/host실제로에서 매핑 된 boot2dockerVM 이미지가 아닌 맥.

VM을 통해 공유 폴더를 실제 호스트 (필자의 경우 Mac)로 파이프해야합니다.


답변

[업데이트] ~ 2017 년 6 월 현재, Docker for Mac 은 VirtualBox를 망쳐 놓아야하는 모든 성가신 부분을 처리합니다. /private접두사를 사용하여 기본적으로 로컬 호스트의 모든 것을 매핑 할 수 있습니다 . 자세한 내용은 여기를 참조하십시오 . [/최신 정보]

모든 현재 답변은 Boot2docker에 대해 이야기합니다. 이제 docker-machine을 위해 더 이상 사용되지 않으므로 docker-machine에서 작동합니다.

먼저 docker-machine vm에 ssh하고 매핑 할 폴더를 만듭니다.

docker-machine ssh $MACHINE_NAME "sudo mkdir -p \"$VOL_DIR\""

이제 폴더를 VirtualBox에 공유하십시오.

WORKDIR=$(basename "$VOL_DIR")
vboxmanage sharedfolder add "$MACHINE_NAME" --name "$WORKDIR" --hostpath "$VOL_DIR" --transient

마지막으로 docker-machine에 ssh를 다시 넣고 방금 공유 한 폴더를 마운트하십시오.

docker-machine ssh $MACHINE_NAME "sudo mount -t vboxsf -o uid=\"$U\",gid=\"$G\" \"$WORKDIR\" \"$VOL_DIR\""

참고 : UID 및 GID의 경우 기본적으로 정수를 사용하지 않는 한 기본적으로 모든 정수를 사용할 수 있습니다.

OS X El Capitan의 docker-machine 0.4.1 및 docker 1.8.3에서 테스트되었습니다.


답변

물리적 시스템을 깨끗하게 유지하기 위해 Docker 컨테이너 내에서 SailsJS 앱을 실행하는 실험을하고 있습니다.

다음 명령을 사용하여 SailsJS / NodeJS 응용 프로그램을 / app 아래에 마운트합니다.

cd my_source_code_folder
docker run -it -p 1337 : 1337 -v $ (pwd) : / app my_docker / image_with_nodejs_etc