호스트 디렉토리를 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
exitkishore$ docker -v Docker version 0.9.1, build 867b2a9
- boot2docker 버전을 확인하는 방법을 모르겠습니다
질문, 직면 문제 :
- main_folder를 docker container 안에있는 test_container 폴더에 어떻게 연결해야합니까?
- 이것을 자동으로 만들어야합니다. 실제로
run -d -v
명령을 사용하지 않고 어떻게해야 합니까? - 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
실제로에서 매핑 된 boot2docker
VM 이미지가 아닌 맥.
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
