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


618

호스트 디렉토리를 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 제외)?

2
참고로, 이것은이 의견으로 도커에서 수정 된 것으로 보입니다. Mac에서 boot2docker를 사용하고 있습니다. -v 옵션을 사용할 수 있고 로컬 디렉토리가 컨테이너에 완전히 마운트됩니다.
Marco

답변:


508

이를 수행 할 수있는 몇 가지 방법이 있습니다. 가장 간단한 방법은 다음 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

이 kishore $ docker -v / Users / kishore / main_folder : / test_container Docker 버전 0.9.1, 빌드 867b2a9 kishore $ docker run -v / Users / kishore / main_folder : / test_container 사용법 : docker run [OPTIONS] 이미지 [ 명령] [ARG ...] 새 컨테이너에서 명령 실행 -P, --publish-all = false : 노출 된 모든 포트를 호스트 인터페이스에 게시 -a, --attach = [] : stdin, stdout 또는 stderr. -c, --cpu-주 = 0 : CPU 점유율 (중량 기준으로)
키 쇼어 Vaishnav

2
ADD 둘 다 가질 수 있습니까? -v 볼륨 마운트와 동시에. 호스트 마운트를 지정하지 않은 경우 기본 app_dir을 사용합니까?
alexzg

@alexzg 나는 우리가 첫 번째 것만 우선권을 가질 수 있다고 생각하지 않습니다. 또한 2 포인트 기본 app_dir ... 호스트 마운트에 대해 명확하지 않습니다.
Kishore Vaishnav

35
이것은 docker-machine 및 VirtualBox가있는 mac OS x에서 나를 위해 일했습니다. 시행 착오로 발견 한 한 가지주의 사항은 호스트 디렉토리가 상대 경로가 아닌 전체 경로 여야한다는 것입니다.
jbustamovej

25
ADD실제로는 "마운팅"하지 않고 파일을 내부에 유지하는 컨테이너에 파일을 복사합니다.
kev

200

이 질문의 사용자가를 사용 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
나는 그것이이고 잘못되지 얼마나 간결하고 사랑하기 때문에 당신의 대답을 upvoted했지만, 당신은 그것을 내 대답에 비추어 비트를 업데이트 할 수 있습니다 stackoverflow.com/a/51829247/901899
rainabba

2
나는이 답변 이후로 설명서가 업데이트 된 것 같습니다. 지금은 마운트보다는 볼륨을 권장하는 것 같습니다. 무언가를 저지르기 전에 갈 가치가 있습니다.
Sipty

1
@Sipty는 다음을 참조 할 수 있습니다. " 새로운 Docker 응용 프로그램을 개발하는 경우 명명 된 볼륨을 대신 사용하십시오. Docker CLI 명령을 사용하여 바인드 마운트를 직접 관리 할 수 ​​없습니다. "
Aluthren

81

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됩니다.


1
가장 좋은 답변입니다. mount 명령 에서 (Windows의 경우) 호스트 폴더가 폴더 공유 이름을 참조하고 있음을 추가해야 합니다. Windows 터미널 (cmd) 내부에 명령으로 표시되는 것 . 그리고 그 폴더를 virtualBox GUI가있는 공유 폴더로 추가해야합니다 (내 논리를 따르는 경우 동일한 이름 사용). 공유를 생략하면 작동하지만 권한 문제와 성능 새로 고침에 직면하게됩니다. net share
Kir Kanos

mount 명령은 / boot2dockerfolder가있는 호스트를 어떻게 알 수 있습니까?
alfonsodev

오류가 발생했습니다 : mount: unknown filesystem type 'vboxsf', 우분투 게스트와 호스트를 사용하여
nnyby

"vboxsf"는 VirtualBox 공유 폴더 "파일 시스템"드라이버입니다. VirtualBox 확장을 설치하여 VM에 구성해야합니다. boot2docker 이미지에는 이러한 이미지가 설치되어 있지 않아야합니다. VirtualBox에는 VirtualBox Additions ISO 이미지를 가상 볼륨으로 "삽입"하는 "장치"기능이 있습니다. 일반적으로 mount / dev / cdrom / mnt를 사용하여 / mnt로 이동하여 bash VBoxLinuxAdditions를 실행하여 마운트시 마운트 할 수 있습니다. gcc, 커널 또는 기타 종속성의 설치가 필요할 수 있습니다.
앤드류 울프

mount.vboxsf : 오류로 마운트 실패 : 해당 파일 또는 디렉토리가 없습니다. 마운트 : / boot2dockerfolder에서 mymapfoldername 마운트 실패 : 해당 파일 또는 디렉토리가 없습니다
vee

71

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

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

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

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


6
호스트 마운트 옵션을 설명하기위한 훌륭하고 깨끗하며 완벽한 예제입니다. 실제 디렉토리를 사용하여 향상시킬 수 있습니다 docker run -t -i -v /tmp:/tmp ubuntu /bin/bash. 호스트 /tmp가 컨테이너에 마운트됩니다 /tmp. 이제 touch /tmp/hello-world컨테이너에서 파일을 볼 수 있고 파일이 호스트에 나타나는 것을 볼 수 있습니다 .
Stephan Henningsen

3
완벽하게 작동합니다. 그러나이 방법으로 마운트하면 디렉토리 소유자가 루트로 설정되고 컨테이너도 루트로 실행됩니다. 컨테이너가 비 루트로 실행될 때 dir을 비 루트로 마운트하는 방법은 무엇입니까?
Arun

33

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

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

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

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


1
감사! 이것은 먼 관련 문제에 도움이되었습니다. Docker 내부에서 실행되는 Postgres는 OS X에서 실행되지 않을 경우 로컬 호스트가 아닌 VBox IP에 바인딩되었습니다.
Peter Becich

2
도커 문서에 대한 해당 URL은 더 이상 유효하지 않습니다
digitaldavenyc

하하 최고의 농담 .. 그들은 실제로 힌트를 만들 수있었습니다.
user2834172

2
문서 링크는 404
Factor Mystic

3
VM을 통해 공유 폴더를 실제 호스트로 파이핑하는 예가 궁금합니다.
Derek

28

[업데이트] ~ 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에서 테스트되었습니다.


1
+1. 내 머리를 두드리는 몇 시간 후에, 당신의 대답은 효과가있었습니다. 이것은 docker-machine문서의 일부 여야합니다 .
Abhijit Sarkar

-v깃발을 사용하지 않습니까?
igracia

1
@igracia -v국기가 OS X (또는 Windows)에서 예상대로 작동하지 않습니다. Docker는 VM에서 실행되므로 참조 -v되는 폴더는 루트 OS가 아닌 VM의 폴더를 가리 킵니다. 이 기술은 VM 폴더를 루트 OS로 다시 매핑하는 다음 단계를 수행합니다.
Patrick Gunderson

1
@PatrickGunderson 내 경우 (OS X) 폴더는 VM이 ​​아닌 호스트에 있으며 제대로 작동합니다. Docker Tolls는 VM으로, 컨테이너에서 컨테이너로 내 보냅니다.
igracia

1
내가 언급 한 규칙의 한 가지 예외는 VM이 /Usersdocker와 공유하기 위해 자동으로 마운트된다는 것 입니다. 즉, 작업 파일이 들어 ~/*있으면 잘 갈 수 있습니다. 개발 환경이 부족 /development하거나 다른 환경 /Users부족한 경우 docs.docker.com/engine/userguide/containers/dockervolumes
Patrick Gunderson

27

물리적 시스템을 깨끗하게 유지하기 위해 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

5
Dockerfile에서 어떻게 할 수 있습니까?
orad

23
docker run -v /host/directory:/container/directory -t IMAGE-NAME /bin/bash

docker run -v /root/shareData:/home/shareData -t kylemanna/openvpn /bin/bash

내 시스템에서 nhjk의 답변을 수정했습니다 -t. 플래그 를 추가하면 완벽하게 작동합니다 .


로컬 FS에서 파일을 작성 / 업데이트하고 docker 컨테이너 내부의 변경 사항을 볼 수 있습니까?
Avi Mehenwal

14

호스트가 창 10 인 경우 슬래시 대신 백 슬래시를 사용하십시오.

docker run -it -p 12001:80 -v c:\Users\C\Desktop\dockerStorage:/root/sketches

호스트 드라이브가 공유되어 있는지 확인하십시오 (이 경우 C). 제 경우에는 위의 명령을 실행 한 후 공유 권한을 묻는 메시지가 나타납니다.


13

Mac OS에서 /Users/<name>/projects/컨테이너의 루트에있는 Mac 의 폴더를 마운트 하려면

docker run -it -v /Users/<name>/projects/:/projects <container_name> bash

ls /projects


11

2015 년 7 월 업데이트-boot2docker는 이제 직접 마운트를 지원합니다. -v /var/logs/on/host:/var/logs/in/container이중 마운트없이 Mac 프롬프트에서 직접 사용할 수 있습니다


11

들어 윈도우 10 사용자,이 내부에 탑재 지점을하는 것이 중요합니다 C:/Users/디렉토리. 나는 이것을 작동시키기 위해 몇 시간 동안 노력했다. 이 게시물은 도움이되었지만 Windows 10 용 솔루션이 허용되는 답변에 대한 주석이므로 처음에는 명확하지 않았습니다. 이것이 내가 한 방법입니다.

docker run -it -p 12001:80 -v //c/Users/C/Desktop/dockerStorage:/root/sketches \
<your-image-here> /bin/bash

그런 다음 테스트하기 echo TEST > hostTest.txt위해 이미지 내부 를 수행 할 수 있습니다 . 이 로컬 파일은의 로컬 호스트 폴더에서 볼 수 있어야합니다 C:/Users/C/Desktop/dockerStorage/.


경로의 이중 슬래시가 나를 위해 일한 것입니다. 내가 -v $(pwd):/var/xx처음 사용했기 때문에 혼란스럽고 작동했지만 빈 디렉토리가되었습니다. 나는 babun을 통해 cyg를 실행 중입니다.
kenchilada

/ c / data /를 사용하는 동안 Windows 7에서 동일한 문제가 발생하여 호스트 디렉토리를 / c / Users / <user> / 아래로 이동하면 해결되었습니다. 감사.
user8675309

1
문제 해결에 도움이되는 게시물에 대한 링크가 있습니까?
PBo

11

나는 같은 문제를 겪고있다. 내 명령 줄은 다음과 같습니다.

docker run --rm -i --name $NAME -v `pwd`:/sources:z $NAME

문제는 'pwd'에있었습니다. 그래서 나는 이것을 $ (pwd)로 변경했습니다 :

docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME

1
무엇입니까 z?
hhh

2
z 옵션은 바인드 마운트 컨텐츠가 여러 컨테이너간에 공유됨을 나타냅니다.
Jason

10

Docker 18-CE부터 docker run -v /src/path:/container/path호스트 폴더의 양방향 바인딩을 수행 하는 데 사용할 수 있습니다 .

Windows 10 / WSL로 작업하고 Docker-CE for Windows를 호스트로 사용하고 WSL에서 docker-ce 클라이언트 도구를 사용하는 경우 큰 문제가 있습니다. WSL은 전체 / 파일 시스템에 대해 알고 있으며 Windows 호스트는 드라이브에 대해서만 알고 있습니다. WSL에서 / mnt / c / projectpath를 사용할 수 있지만, 시도 docker run -v ${PWD}:/projectpath하면 호스트에서 / projectpath /가 비어 있다는 것을 호스트에서 찾을 수 있습니다.

그래도 / c / projectpath에서 작업 docker run -v ${PWD}:/projectpath하고 컨테이너에서 찾은 경우 / projectpath는 / c / projectpath를 실시간으로 반영합니다. 게스트 내부에 빈 마운트를 보는 것 외에는이 문제를 감지 할 수있는 오류나 다른 방법이 없습니다.

Docker for Windows 설정에서 "드라이브 공유"도해야합니다.


Win10 / WSL 및 Docker-CE / docker-ce 에서이 문제가 있습니다. / projectpath /를 비 웁니다. "/ c / projectpath에서 작업"이란 무엇입니까? / c /를 / mnt / c에 연결하고 실행하려고 시도했지만 /c/projectpath오류가 발생 bind mount source path does not exist: /host_mnt/c/projectpath합니다.
Steven T. Snyder

:이 링크는 내 문제 해결 support.divio.com/local-development/docker/... (Windows의 도커는 기본적으로 / / 사용자로부터 장착 할 수 있습니다)
스티븐 T. 스나이더를

7

내가 좋아하는 시스템의 지시 아래 누워있는 디렉토리가 발견 /var, /usr, /etc용기 아래에 마운트 할 수 없습니다.

지시문은 사용자의 공간 -v스위치에 있어야합니다. 도커 데몬이 로컬 디렉토리를 컨테이너에 마운트하도록 지시합니다. 예를 들면 다음과 같습니다.

docker run -t -d -v /{local}/{path}:/{container}/{path} --name {container_name} {imagename}

5

VirtualBox Guest 추가와 함께 boot2docker
/ bootsdocker에 / Users를 마운트하는 방법

https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c

tl; dr VirtualBox Guest Additions ( 링크 참조 )로 사용자 정의 boot2docker.iso를 빌드 하거나 http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso를 다운로드 하여 저장하십시오 ~ / .boot2docker / boot2docker.iso로


나는 그 iso를 사용해 보았지만 여전히 같은 문제가 발생했습니다 ... 그 게시물에 설명 된 지시 사항을 사용하면 정렬하는 데 도움이되었지만 기본적으로 공유 폴더를 강제로 사용해야했습니다.
Jaco Pretorius

나는 iso를 사용했는데, 'VBoxManage sharedfolder add ...'cmd를 호출하기 전에 Virtual Box VM을 중지하지 않았다는 문제가 발생했습니다. 마침내 모든 것이 정말 고마웠지만 작동했습니다.
Emile

참고 : -v arg가 boot2docker를 통해 작동하지 않는 이유는 실제 호스트가 아닌 boot2docker-vm에 마운트하는 것과 관련이있는 것 같습니다. 그렇기 때문에 Vboxmanage 부분이 작동하는 데 도움이되는 것 같습니다.
Emile

5

main_folder를 docker container 안에있는 test_container 폴더에 어떻게 연결합니까?

boot2docker (향후 업데이트에 따라 다름)를 사용하는 Mac에서 폴더가 비어있는 경우가 아니면 아래 명령이 정확합니다. 이 문제를 해결하기위한 튜토리얼은 매트 답변을 참조하십시오.

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

run -d -v 명령을 실제로 사용하지 않고이 작업을 수행하는 방법을 자동으로 실행해야합니다.

이러한 명령을 사용하지 않고도 커가 작동하는 방식에 내재되어 있습니다. 반복해서 작성하는 것을 저장하기 위해 쉘 스크립트에 넣는 것이 가장 좋습니다.

boot2docker가 충돌하면 어떻게됩니까? 도커 파일은 어디에 저장됩니까?

-v arg를 사용하고 호스트 시스템을 참조하면 파일이 호스트에서 안전합니다.

'docker build -t myimage'를 사용한 경우 Dockerfile을 사용하면 파일이 이미지에 구워집니다.

도커 이미지는 boot2docker-vm에 저장되어 있다고 생각합니다. VirtualBox에서 vm을 삭제할 때 이미지가 사라지면이 사실을 알았습니다. (참고로, Virtualbox의 작동 방식을 모르므로 이미지가 다른 곳에 숨겨져 도커에게는 보이지 않을 수 있습니다).


5

같은 문제가 있었다. docker documentation 에서 이것을 찾았습니다 .

참고 : 호스트 디렉토리는 특성상 호스트에 따라 다릅니다. 이러한 이유로 Dockerfile에서 호스트 디렉토리를 마운트 할 수 없습니다. 빌드 된 이미지는 이식 가능해야하므로 VOLUME 명령어는 호스트 디렉토리 전달을 지원하지 않습니다. 모든 잠재적 호스트에서 호스트 디렉토리를 사용할 수있는 것은 아닙니다.

따라서 읽기 / 쓰기 호스트 디렉토리 마운트는 다른 응답이 올바르게 지적하기 -v때문에 docker run명령 의 매개 변수 로만 가능 합니다.


호스트 디렉토리는 정확히 무엇입니까?
Nicolas S.Xu

@ NicolasS.Xu 실제 도커 호스트 시스템의 모든 경로입니다.
J. Scott Elblein

5

다음은 Windows 경로가 포함 된 예입니다.

docker run -P -it --name organizr --mount src="/c/Users/MyUserName/AppData/Roaming/DockerConfigs/Organizr",dst=/config,type=bind organizrtools/organizr-v2:latest

부수적으로,이 모든 머리를 당기고, 알아 내고, 반복해서 경로를 다시 입력 해야하는 동안 AutoHotkeyWindows 경로를 "Docker Windows "형식 경로 로 변환하는 작은 스크립트를 작성하기로 결정했습니다. . 이 방법으로 내가 마운트 지점으로 사용하려는 Windows 경로를 클립 보드에 복사하고 키보드에서 "Apps Key"를 누르면 Docker가 인식하는 경로 형식으로 형식이 지정됩니다.

예를 들면 다음과 같습니다.

이것을 클립 보드에 복사하십시오 :

C:\Users\My PC\AppData\Roaming\DockerConfigs\Organizr

Apps Key커서가 명령 행에서 원하는 위치에 있는 동안을 누르면 여기에 붙여 넣습니다.

"/c/Users/My PC/AppData/Roaming/DockerConfigs/Organizr"

나를 위해 많은 시간을 절약합니다. 여기에 유용한 다른 사람을위한 것입니다.

; --------------------------------------------------------------------------------------------------------------
;
; Docker Utility: Convert a Windows Formatted Path to a Docker Formatter Path
;                   Useful for (example) when mounting Windows volumes via the command-line.
;
; By:       J. Scott Elblein
; Version:  1.0
; Date:     2/5/2019
;
; Usage:    Cut or Copy the Windows formatted path to the clipboard, press the AppsKey on your keyboard
;           (usually right next to the Windows Key), it'll format it into a 'docker path' and enter it
;           into the active window. Easy example usage would be to copy your intended volume path via
;           Explorer, place the cursor after the "-v" in your Docker command, press the Apps Key and
;           then it'll place the formatted path onto the line for you.
;
; TODO::    I may or may not add anything to this depending on needs. Some ideas are:
;           
;           - Add a tray menu with the ability to do some things, like just replace the unformatted path
;               on the clipboard with the formatted one rather than enter it automatically.
;           - Add 'smarter' handling so the it first confirms that the clipboard text is even a path in
;               the first place. (would need to be able to handle Win + Mac + Linux)
;           - Add command-line handling so the script doesn't need to always be in the tray, you could
;               just pass the Windows path to the script, have it format it, then paste and close.
;               Also, could have it just check for a path on the clipboard upon script startup, if found
;               do it's job, then exit the script.
;           - Add an 'all-in-one' action, to copy the selected Windows path, and then output the result.
;           - Whatever else comes to mind.
;
; --------------------------------------------------------------------------------------------------------------

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

AppsKey::

    ; Create a new var, store the current clipboard contents (should be a Windows path)
    NewStr := Clipboard

    ; Rip out the first 2 chars (should be a drive letter and colon) & convert the letter to lowercase
    ; NOTE: I could probably replace the following 3 lines with a regexreplace, but atm I'm lazy and in a rush.
    tmpVar := SubStr(NewStr, 1, 2)
    StringLower, tmpVar, tmpVar

    ; Replace the uppercase drive letter and colon with the lowercase drive letter and colon
    NewStr := StrReplace(NewStr, SubStr(NewStr, 1, 2), tmpVar)

    ; Replace backslashes with forward slashes
    NewStr := StrReplace(NewStr,  "\", "/")

    ; Replace all colons with nothing
    NewStr := StrReplace(NewStr, ":", "")

    ; Remove the last char if it's a trailing forward slash
    NewStr :=  RegExReplace(NewStr, "/$")

    ; Append a leading forward slash if not already there
    if RegExMatch(NewStr, "^/") == 0
        NewStr :=  "/" . NewStr

    ; If there are any spaces in the path ... wrap in double quotes
    if RegExMatch(NewStr, " ") > 0
        NewStr :=  """" . NewStr . """"

    ; Send the result to the active window
    SendInput % NewStr 

4

Windows 10 에서이 작업을 수행하려면 시스템 트레이에서 Docker Settings 창을 열고 공유 드라이브 로 이동해야했습니다 섹션으로 .

그런 다음 옆의 확인란을 선택했습니다. C . Docker는 내 사용자 자격 증명을 얻기 위해 내 데스크톱 자격 증명을 요청했습니다.

그런 다음 위의 예제와 해당 설정 페이지의 예제에 따라 도커 컨테이너를 실행하여 컨테이너에 연결했습니다 /data.

docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options

3

Windows에서는 절대 경로를 제공해야합니다.

아래는 나를 위해 일했습니다.

docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash

3

나는 C 마운트하려고했다, 같은 문제가 있었 : \ 사용자 \ 폴더를 고정 표시기에
이 내가 도커 도구 상자 명령 행 그것을 어떻게입니다

 $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>

2

컨테이너에서 호스트 디렉토리를 마운트하는 것과 동일한 요구 사항이 있었고 volume mount 명령을 사용했습니다. 그러나 테스트 중에 컨테이너 내부에서도 파일을 생성하는 것으로 나타 났지만 일부 파기 후에는 심볼릭 링크이며 실제 파일 시스템은 호스트 시스템에서 사용되는 것으로 나타났습니다.


2

다른 시각적 경험을 위해 Portainer 웹 애플리케이션 으로이 작업을 수행 할 수도 있습니다.

먼저 Portainer 이미지를 당깁니다 :

docker pull portainer/portainer

그런 다음 Portainer의 볼륨을 작성하십시오.

docker volume create portainer_data

또한 Portainer 컨테이너를 생성하십시오 :

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

" http : // localhost : 9000 " URL에서 브라우저를 사용하여 웹앱에 액세스 할 수 있습니다 . 처음 로그인하면 Portainer 관리자 자격 증명을 설정하라는 메시지가 표시됩니다.

웹앱에서 다음 메뉴와 버튼을 따릅니다 (컨테이너> 컨테이너 추가> 채우기 설정 > 컨테이너 배포).

Portainer로 "마운트"볼륨을 생성하는 데 문제가 있었고 컨테이너 볼륨을 생성 할 때 "바인드"를 클릭해야한다는 것을 깨달았습니다. 아래는 마운트 된 볼륨이 호스트에 바인드 된 컨테이너 작성에 사용 된 볼륨 바인딩 설정의 그림입니다.

볼륨 바인딩 설정

추신 : Docker 19.035와 Portainer 1.23.1을 사용하고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.