Programming

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

procodes 2020. 2. 10. 22:32
반응형

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 container 디렉토리에 매핑하려면 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에서 디렉토리를 마운트하기 때문입니다.

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

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

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

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

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


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

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. 플래그 를 추가하면 완벽하게 작동합니다 .


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


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

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

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

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

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

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

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


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 설정에서 "드라이브 공유"도해야합니다.


들어 윈도우 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/.


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

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

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

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로


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의 작동 방식을 모르므로 이미지가 다른 곳에 숨겨져 도커에게는 보이지 않을 수 있습니다).


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

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

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


다음은 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 

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

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

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

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

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

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


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

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

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

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

참고 URL : https://stackoverflow.com/questions/23439126/how-to-mount-a-host-directory-in-a-docker-container



반응형