민서네집

Windows Docker Toolbox에서 Host PC와 폴더 공유하기 본문

머신러닝

Windows Docker Toolbox에서 Host PC와 폴더 공유하기

브라이언7 2016. 8. 10. 14:08

[2016-08-12]


Docker Toolbox가 Windows에서도 Mac에서와 마찬가지로 C드라이브의 Users 폴더 이하는 자동으로 공유되더군요. (Mac에서는 /Users 폴더 이하)


$ docker run -it --name test1 -v /c/Users/{자신의 Windows 계정 폴더}/{공유할 디렉터리명}:{Docker Image에서 공유폴더와 Mount할 폴더 경로} {Docker Image 이름}


Example))

$ docker run -it --name test1 -v /c/Users/Heeseok/shared:/root/shared ubuntu


( /c/Users 대소문자 구분하므로 주의! )


Docker Quick Start 터미널로 들어가서 Docker Container에 접속해서 ll 해서 공유된 폴더를 보면 폴더 이름이 녹색 바탕으로 보입니다.

이렇게 보이면 공유 설정은 정상적으로 된것이고, 쓰기 권한이 없으면 Protocol Error 가 납니다. 

(Users 밑에 자기 계정 폴더 밑으로 들어가면 따로 쓰기 권한을 줄 필요는 없습니다.)




[2016-08-11]


Mac 용 Docker Toolbox로 테스트 결과


Mac은 -v 옵션만 주면 자동으로 폴더 공유가 되긴 되는데, /Users 폴더 밖을 공유폴더로 하려면 -v 옵션만 줘서는 폴더 공유가 안되더군요. 

Windows 처럼 다른 설정이 필요할것 같습니다.


Mac에서는 /Users 밖의 폴더를 쓸 일이 거의 없고,

Mac 사용자 계정으로, 도커 컨테이너를 실행시키는거니까 당연히 유저 경로내의 볼륨에 자동 연동되도록 하는게 맞을것 같다는 의견.


사실 웹에서 검색해보면 Windows 도 C:\Users 폴더는 자동 공유된다고 하는데 실제로는 안되네요.

http://stackoverflow.com/questions/33245036/docker-toolbox-is-there-a-way-to-mount-other-folders-than-from-c-users-windows


아시는 분은 댓글 부탁드려요.


사실.. 제가 Windows에서는 Docker for Windows를 설치할 수 있는 조건이 되지만 굳이 Docker Toolbox를 설치하려는 이유는... PyCharm 으로 Docker 안으로 Remote Debugging을 하려고 합니다. PyCharm 에서 Docker for Windows로는 아직 Remote Debugging 을 접속 지원 못하는것 같아요.




( C드라이브의 Users 폴더 이하는 자동으로 공유되고, 아래 글은 그 외의 디렉터리를 Host PC와 공유하고자 할 때 사용하는 방법이라고 이해하시면 되겠습니다. )


[2016-08-10]


Windows Docker Toolbox에서 Host PC와 폴더 공유하는 것을 해결은 했는데, 생각보다 꾀 복잡하군요. 


Docker for Windows 에서는 Settings 메뉴에서 Shared Drives 항목에서 공유하고자 하는 Drive를 체크만 해주고 Docker run 시킬때 -v 옵션으로 폴더 경로만 지정해 주면 되었는데...


Windows용의 Docker Toolbox에서는 default VM에서 공유 폴더 설정을 해 주고, 다시 default VM으로 들어가서 마운트 해 주고, Docker Image를 Container로 띄울 때 마운트 해 준 경로 이름으로 -v 옵션을 줘야 폴더 공유가 됩니다. 이것 때문에 반나절 이상 삽질을... ㅠㅠ 


하는 방법을 간단히 공유하면...


Docker Toolbox 쓰면 VirtualBox 가 기본으로 설치되면서 default 라는 VM 이 자동으로 생깁니다.


VirtualBox에서 설정 버튼을 눌러서 공유폴더 설정해주고, default VM에 ssh에 접속해서 설정한 공유폴더의 이름으로 mount 해줍니다.


$ docker-machine ssh default


docker@default:~$ sudo mount -t vboxsf shared /root/shared


이렇게 하면 default VM과 Windows Host PC 간에 서로 폴더 공유가 되어야 하므로 잘 되는지 체크. (그래야 나중에 Docker Image에서도 폴더 공유가 됨.)


그 mount 해준 경로 이름으로 docker run 시킬 때 -v 옵션 줘야 공유가 됩니다.


그래서 결국 아래와 같이 Host PC가 Windows 임에도 불구하고 -v 옵션 줄때 Host 경로가 default VM에서 mount 해준 경로로 들어갑니다.


$ docker run -it --name {CONTAINER_이름} -p 8888:8888 -p 6006:6006 -v /root/shared:/root/shared gcr.io/tensorflow/tensorflow:latest-devel







Host PC를 재부팅하거나 default VM을 재부팅하는 경우
docker-machine ssh default 로 들어가서 다시 mount 를 해줘야 합니다.

이것을 자동으로 해주기 위해서는

$ docker-machine ssh default

docker@default:~$ cd /var/lib/boot2docker/

docker@default:/mnt/sda1/var/lib/boot2docker$ sudo vi bootlocal.sh

파일 내용을 다음과 같이 입력합니다.

#!/bin/sh
mkdir /root/shared
mount -t vboxsf shared /root/shared

docker@default:/mnt/sda1/var/lib/boot2docker$ sudo chmod +x bootlocal.sh

default VM이 재부팅되면 파일 내용이 초기화 되는데, 위 경로에 넣어야지만 초기화가 안되고 보존됩니다.  재부팅되면 /root/shared 디렉터리도 사라지기 때문에 mkdir 로 폴더를 만들어줘야 합니다. 

exit 로 default VM 에서 나오고, Oracle VM VirtualBox에서 default VM을 종료한 후에 Docker Quickstart Terminal을 다시 실행해줘야지 적용됩니다.

다음과 같이 Docker Terminal 창에서 종료했다가 다시 시작해줘도 됩니다.
docker-machine stop
$ docker-machine start

[참고] http://stackoverflow.com/questions/26639968/boot2docker-startup-script-to-mount-local-shared-folder-with-host

/var/lib/boot2docker/bootlocal.sh fits your need probably, it will be run by initial script /opt/bootscripts.sh

And bootscripts.sh will also put the output into the /var/log/bootlocal.log, see segment below (boot2docker 1.3.1 version)

# Allow local HD customisation
if [ -e /var/lib/boot2docker/bootlocal.sh ]; then
   /var/lib/boot2docker/bootlocal.sh > /var/log/bootlocal.log 2>&1 &
fi 



[참조]


What's the best way to share files from Windows to Boot2docker VM



Comments