it-swarm.dev

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"]

</ code></ pre>

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 $ 도커 실행 -d -v/Users/kishore/main_folder :/test_container k3_s3 : 최신 c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea</ code></ pre>

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

[email protected]:/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</ code></ pre>

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

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

문제가 직면 한 문제 :

  1. Main_folder를 도커 컨테이너 안에있는 test_container 폴더에 연결하려면 어떻게해야합니까?
  2. 이걸 자동으로 만들어야 해. run -d -v 명령을 사용하지 않고 어떻게해야합니까?
  3. Boot2docker가 충돌하면 어떻게됩니까? Docker 파일은 어디에 저장되어 있습니까 (Dockerfile과 별도)?
420
Kishore Vaishnav

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

ADD . /path/inside/docker/container

그러나 dockerfile을 작성한 후 호스트에서이 디렉토리에 대한 변경 사항은 컨테이너에 표시되지 않습니다. 이것은 컨테이너를 만들 때 디렉토리가 .tar로 압축되고 그 context 를 컨테이너에 영구적으로 업로드하기 때문입니다.

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

docker run -v /Host/directory:/container/directory -other -options image_name command_to_run
347
nhjk

이 질문의 사용자는 Docker version 0.9.1, build 867b2a9를 사용하고 있었고, 176보다 큰 docker 버전에 대한 대답을 드릴 것입니다.

원하는대로, 컨테이너 디렉토리 내에 동기화 된 로컬 디렉토리를 유지하려면 bind 유형으로 볼륨을 마운트하여 수행하십시오. 이렇게하면 소스 (시스템)와 대상 (도커 컨테이너에 있음) 디렉토리가 바인드됩니다. 그것은 리눅스에 디렉토리를 마운트하는 것과 거의 같습니다.

Docker 설명서 에 따라 적절한 마운트 명령은 -v 대신 mount입니다. 설명서는 다음과 같습니다.

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

  • 마운트의 typebind, volume 또는 tmpfs 일 수 있습니다. (우리는 bind 를 사용하려고합니다} _

  • 마운트의 source. 바인드 마운트의 경우, 이것은 Docker 디먼 호스트의 파일 또는 디렉토리 경로입니다. source 또는 src으로 지정할 수 있습니다.

  • destination은 파일 또는 디렉토리가 컨테이너에 마운트 될 경로를 값으로 취합니다. destination, dst 또는 target으로 지정할 수 있습니다.

따라서 /test_container (target)을 사용하여 현재 디렉토리 (source)를 마운트하려면 다음을 사용하십시오 :

    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

또한 파일 사용 권한을 처리해야합니다 - 이 기사 를 참조하십시오.

130
Eduardo Santana

2 연속 마운트 : 여기에 여러 게시물이 두 boot2docker를 사용하는 것 같아요. 호스트가 아닌 boot2docker에서 디렉토리를 마운트하기 때문에 아무 것도 보이지 않는 이유가 있습니다.

기본적으로 호스트에서 시스템으로 디렉토리를 마운트하는 첫 번째 마운트와 boot2docker에서 새 디렉토리를 다음과 같이 컨테이너에 마운트하는 두 번째 연속 마운트가 필요합니다.

1. boot2docker에 로컬 시스템 마운트

Sudo mount -t vboxsf hostfolder /boot2dockerfolder

2. 리눅스 컨테이너에 boot2docker 파일을 마운트하십시오.

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

그런 다음 컨테이너 폴더 안에 ls을 입력하면 호스트 폴더의 내용이 표시됩니다.

62
louis V

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

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

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

Host 권한이있는 호스트 컴퓨터에서 Host_dir을 변경하면 컨테이너에 표시되고 그 반대의 경우도 마찬가지입니다. 

49
rgaut

boot2docker 또는 비슷한 것을 통해 OS X에서 도커를 사용할 수 있습니까? 

나는 같은 경험을했습니다. 명령은 정확하지만 어쨌든 컨테이너에는 아무 것도 없습니다.

그것이 밝혀 졌을 때 이미 도커 문서 에서 설명했습니다. docker run -v /var/logs/on/Host:/var/logs/in/container ...를 입력하면 /var/logs/on/Host는 실제로 Mac이 아닌 boot2docker VM 이미지에서 매핑됩니다. 

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

31
user3680997

[UPDATE] 2017 년 6 월 현재, Mac 용 Docker 는 VirtualBox를 망쳐 놓아야하는이 모든 귀찮은 부분을 처리합니다. /private 접두어를 사용하여 로컬 호스트의 모든 것을 기본적으로 매핑 할 수 있습니다. 추가 정보 여기 . [/ UPDATE]

현재의 모든 대답은 Boot2docker에 관한 것입니다. 이제 docker-machine에 찬성하여 사용되지 않으므로 docker-machine에서이 기능을 사용할 수 있습니다.

먼저 sock을 docker-machine VM에 넣고 매핑 할 폴더를 만듭니다.

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에서 테스트되었습니다.

25
Eli

Docker 컨테이너에서 실행되는 SailsJS 앱을 사용하여 실제 컴퓨터를 깨끗하게 유지하는 방법을 실험하고 있습니다.

/ app 아래에 SailsJS/NodeJS 응용 프로그램을 마운트하려면 다음 명령을 사용하고 있습니다.

 cd my_source_code_folder 
 도커 실행 -it -p 1337 : 1337 -v $ (pwd) :/app my_docker/image_with_nodejs_etc 
24
Sven
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 플래그를 추가하면 완벽하게 작동합니다.

16
Ali

2015 년 7 월 업데이트 - 이제 boot2docker가 직접 마운트를 지원합니다. Mac 프롬프트에서 직접 -v /var/logs/on/Host:/var/logs/in/container를 사용할 수 있으며 이중으로 마운트하지 않아도됩니다.

10
Tal

나는 같은 문제를 겪어왔다. 내 명령 줄은 다음과 같이 보였다.

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

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

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

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

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

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

7
Duke79

나는 /var, /usr, /etc와 같은 시스템 지시문 아래에있는 모든 디렉토리가 컨테이너 아래에 마운트 될 수 없다는 것을 발견했습니다.

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

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

main_folder를 도커 컨테이너 안에있는 test_container 폴더에 어떻게 연결합니까?

Boot2docker를 사용하는 Mac (향후 업데이트에 따라 다름)에서 폴더를 비었을 경우를 제외하고 아래 명령은 정확합니다. 이 문제를 해결하는 방법에 대한 자습서는 mattes 대답을 참조하십시오.

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가 작동하는 방법을 모르므로 이미지가 여전히 다른 곳에 숨겨져있을 수도 있으며, 도커에게는 보이지 않을 수도 있습니다.).

4
Emile

같은 문제가있었습니다. 도커 문서에서 이것을 발견했습니다

참고 : 호스트 디렉토리는 본질 상 호스트에 따라 다릅니다. 이러한 이유로 Dockerfile에서 Host 디렉토리를 마운트 할 수 없으며 VOLUME 명령어는 내장 이미지가 이식 가능해야하므로 Host-dir 전달을 지원하지 않습니다. 호스트 디렉토리는 모든 잠재적 호스트에서 사용할 수 없습니다.

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

4
matthaeus

VirtualBox 게스트 추가 기능과 함께 boot2docker
boot2docker에/users를 마운트하는 방법

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

virtualBox Guest 추가 ( 링크 참조) 또는 다운로드 http://static.dockerfiles.io/boot2docker-v1로 자신 만의 맞춤 boot2docker.iso를 작성하십시오. 0.1-virtualbox-guest-additions-v4.3.12.iso 그리고 ~/.boot2docker/boot2docker.iso에 저장하십시오.

4
mattes

Windows 10 users의 경우 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/의 로컬 호스트 폴더에서이 새 파일을 볼 수 있어야합니다. 

3
K F

다음은 Windows 경로가있는 예입니다.

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

부수적으로,이 모든 머리카락을 당기는 동안, 알아내는 데 어려움을 겪고 반복적으로 경로를 다시 타이핑하면서 작은 AutoHotkey 스크립트를 사용하여 Windows 경로를 "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 
3
J. Scott Elblein

Docker 18-CE에서 docker run -v /src/path:/container/path를 사용하여 Host 폴더의 양방향 바인딩을 수행 할 수 있습니다.

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

/ c/projectpath에서 작업하고 docker run -v ${PWD}:/projectpath을 수행하면 해당 컨테이너에서/projectpath가/c/projectpath를 실시간으로 반영합니다. 게스트 내부에서 빈 마운트를 보는 것 이외에는이 문제를 감지하는 데 오류가 있거나 다른 방법이 없습니다.

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

3
rainabba

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

아래는 나를 위해 일했다.

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

나는 같은 문제가 있었는데, 나는 C :\Users\폴더를 도커에 올려 놓으려고했다. 
이게 내가 Docker Toolbox 커맨드 라인을 만든 방법입니다.

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

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

0
Sunil Chauraha