Seapy's Blog


들어가면서

본 문서는 docker에 대한 이해가 아닌 맥에서 docker를 사용하는데 겪는 어려움을 해소하고자 하는 목적으로 쓰였습니다. docker에 대한 자세한 내용은 홈페이지나 nacyot님의 블로그 포스트(도커(Docker) 튜토리얼 : 깐 김에 배포까지, 도커(Docker) 튜토리얼 : 0.8 맥에서 설치하기)를 참고하시기 바랍니다.

설치

맥에서 docker를 사용하기 위해서는 boot2docker 라는 프로그램이 필요합니다. 이 프로그램은 VirtualBox에 리눅스 가상머신을 생성하고 맥과 연겷해서 맥에서 바로 docker를 사용하는것처럼 합니다.

https://github.com/boot2docker/osx-installer/releases 에서 최신버전의 맥OS 설치 파일(.pkg)을 받아서 실행 합니다.

.pkg 설치파일을 실행하면 응용프로그램 폴더에 boot2docker가 설치되고 boot2docker를 실행하면 터미널이 실행되면서 VirtualBox 설치, 초기화 작업이 진행됩니다. 설치가 완료된후 터미널 메시지를 유심히 보면 환경변수에 설정해야 할것이 하나 보입니다. 이 메시지는 그때마다 다른데 대충 이런식입니다.

export DOCKER_HOST=tcp://192.168.59.103:2375

위의 코드를 .profile, .bashrc, .zshrc 등 본인의 환경에 맞게 추가해서 환경설정변수로 등록합니다.

환경변수를 적용하기 위해 터미널에 exec $SHELL -l을 입력합니다.

정상적으로 설치되었는지 확인하기 위해 터미널에서 docker ps 를 실행하여 오류가 없는지 확인합니다.
현재 실행중인 docker 컨테이너가 없으므로 다음과 같이 제목행만 노출되면 정상입니다.

CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES

IP 접근

맥에서는 포트 매핑을 해도 127.0.0.1이나 localhost와 같은 URL로는 접근이 되지 않습니다. 이는 boot2docker에서 사용하는 VirtualBox와의 문제로 VirtualBox 가상머신의 IP를 사용해서 접근하면 포트매핑이 정상적으로 작동하는것을 확인 할 수있습니다.

VirtualBox 가상머신의 IP는 boot2docker ip 명령어를 이용해 확인할 수 있습니다.

$ boot2docker ip

The VM's Host only interface IP address is: 192.168.59.103

nginx 컨테이너를 실행했다고 했을때 브라우저에 192.168.59.103을 입력하면 nginx 시작페이지가 보이지만 127.0.0.1이나 localhost로는 보이지 않습니다.

볼륨 마운트

Docker 1.3 버전부터는 boot2docker 를 사용하는경우 맥의 /Users 폴더를 바로 마운트 할 수 있게 되었습니다. -v 옵션을 사용할때 /Users 하위의 폴더들을 명시하면됩니다.

----- 이 아래 부분은 Docker 1.3 이전 버전에서만 의미있습니다.

docker의 개념상 변하지 않는 컨테이너를 지향하므로 설정파일이나 데이터 저장소는 외부의 볼륨을 사용하는것이 일반적입니다. 이때 호스트 컴퓨터의 볼륨을 컨테이너에 마운트하면 개발하면서 데이터를 변경하는데 유리합니다. 리눅스의 경우 -v 옵션으로 매핑하면 되지만 맥에서는 VirtualBox 가상머신이라는 단계가 하나더 있어서 맥의 파일 시스템을 바로 마운트 할 수 없습니다.

맥의 파일시스템을 바로 마운트 하는 방법이 있지만 쉽지 않고 0.9 버전의 이미지이기 때문에 추천드리지 않습니다. 참고

boot2docker에서 추천하는 방법은 samba를 이용해 공유폴더를 만드는것입니다.

볼륨 컨테이너를 하나 만들고 이를 samba 서버 컨테이너에서 마운트해서 맥과 samba 서버를 연결하는 방법입니다. 맥에서는 연결한 samba 서버에 변경할 파일을 두고 신규 컨테이너는 처음에 만든 볼륨 컨테이너를 가지고 실행(--volumes-from)합니다.

Docker 맥과 마운트하기 기본

이를 사용하는 방법은 boo2docker folder sharing에 나와 있습니다.

# 볼륨 컨테이너 생성
$ docker run -v /data --name data busybox

# samba 실행. 마지막에 입력된 이름의 볼륨 컨테이너를 사용하도록 samba 내부 스크립트에 설정됨
$ docker run --rm -v /usr/local/bin/docker:/docker -v /var/run/docker.sock:/docker.sock svendowideit/samba data

이제 맥의 파인더에서 CMD + K 혹은 이동 > 서버에 연결을 눌러 연결할 서버명에 cifs://192.168.59.103/data를 입력(192.168.59.103은 boot2docker ip 실행해서 나온값으로 변경)하고 방문자로 로그인 하면 맥과 볼륨컨테이너가 연결됩니다.

제가 처음에 생각하기로는 samba 서버의 인증이 없기 때문에 보안에 취약하지 않나 싶었는데 생각해보니 내부의 가상네트워크와만 연결하는거라서 외부에서 접근을 못하니 상관없는것이었습니다.

samba 서버를 이용해서 연결하는것까지는 좋았는데 문제는 새로운 컨테이너를 실행할때 해당 컨테이너에서 미리 지정한 폴더가 있을경우 볼륨 컨테이너도 이와 동일한 경로로 만들어야 된다는것입니다.

예를 들어 nginx 이미지를 이용해 컨테이너를 실행하는경우 기본 경로인 /usr/local/nginx/html에 있는 파일이 사용되는데 이 경로에 파일을 두기 위해서는 볼륨 컨테이너 생성시 /usr이나 /usr/local/nginx/html 와 같이 맞춰주어야 합니다. 또한 /etc/nginx/test.conf와 같이 추가로 다른 설정 파일도 마운트 하려면 /etc/nginx 볼륨 컨테이너를 추가로 생성후 연결해야하는 번거로움이 발생합니다.

# nginx 웹페이지용 볼륨 컨테이너 생성
docker run -v /usr/local/nginx/html --name nginx-html busybox

# nginx 테스트 설정파일용 볼륨 컨테이너 생성
docker run -v /etc/nginx --name nginx-conf busybox

# nginx-data, nginx-conf 두개의 볼륨컨테이너를 마운트 하는 볼륨 컨테이너 생성
docker run --name nginx-data --volumes-from nginx-html --volumes-from nginx-conf busybox

# samba 서버 실행. nginx-data, nginx-conf 두개의 볼륨 컨테이너 사용
$ docker run --rm -v /usr/local/bin/docker:/docker -v /var/run/docker.sock:/docker.sock svendowideit/samba nginx-data

# samba 서버의 이름은 samba-server로 기본 지정되며 해당 볼륨을 사용하면 nginx-html, nginx-conf 사용가능
docker run --name some-nginx -p 80:80 --volumes-from samba-server -d nginx

~~번잡하기 이를데 없습니다. 이런식으로 무한대로 늘어나는 볼륨 컨테이너라니요 ㅜㅜ ~~

이제 stackoverflow에서 알게된 주옥같은 팁을 알려드리겠습니다. samba 서버를 사용하는것은 동일하지만 --volume-from옵션이 경로를 변경하지 못하니 -v 옵션으로 볼륨 컨테이너의 실제 저장공간과 매핑하면 된다는 아이디어입니다. 볼륨 컨테이너는 프로세스에서 종료상태이더라도 저장된 파일은 지워지지 않는데 이는 VirtualBox 가상머신의 어딘가와 볼륨 컨테이너가 마운트 되어 있기 때문입니다. 여기서 실제 저장된 가상머신의 파일시스템 경로만 알면 -v 옵션으로 자유롭게 매핑이 가능합니다.

볼륨 컨테이너가 저장된 가상머신상의 경로는 다음 명령어로 확인 합니다.

$ docker inspect nginx-html | grep "vfs/dir"
        "/usr/local/nginx/html": "/mnt/sda1/var/lib/docker/vfs/dir/아주긴문자열"

이제 docker를 실행할때 -v 옵션의 : 앞부분에는 /mnt로 시작하는 가상머신의 경로를 적어주고 뒷부분에는 마운트하고자 하는 경로를 자유롭게 설정할 수 있습니다.

Docker 맥과 마운트하기 최종

nginx 를 실행하는 예제는 다음과 같이 변경됩니다.

# 맥과 연결할 공용 볼륨 컨테이너 생성
docker run -v /data --name data busybox

# samba 서버 실행. data 볼륨 컨테이너 사용
$ docker run --rm -v /usr/local/bin/docker:/docker -v /var/run/docker.sock:/docker.sock svendowideit/samba data

# 가상머신의 실제 마운트 경로가 길어서 이를 변수로 저장
$ SRV1=$(docker inspect data | grep "vfs/dir" | awk '/"(.*)"/ { gsub(/"/,"",$2); print $2 }')

# 테스트 설정 파일과 html 폴더를 각각 지정
$ docker run --name some-nginx -p 80:80 -v $SRV1/html:/usr/local/nginx/html:ro -v $SRV1/etc:/etc/nginx:ro -d nginx

이제 nginx 뿐만 아니라 그 어떤 것에서 사용하는 파일 시스템 경로라도 data 하나의 볼륨 컨테이너로 연결할 수 있게 되었습니다.

참고자료