- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
Docker 좀더 활용하기
이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20
Docker 안에서 Docker 실행하기
Docker 컨테이너 안에서 Docker를 실행하는 방법입니다. 복잡하게 왜 Docker 컨테이너 안에서 Docker를 실행할까요? 예를 들면 Jenkins나 CruiseControl과 같은 빌드 자동화 시스템을 이용해서 Docker 이미지를 생성할 때 활용할 수 있습니다. Jenkins, CruiseControl 환경 자체도 Docker 이미지로 만들면 Docker 컨테이너 안에서 Docker를 실행할 수 있어야 합니다.
먼저 GitHub에서 Dockerfile과 Bash 스크립트를 받습니다.
$ git clone https://github.com/pyrasis/dind.git
dind 디렉터리로 이동한 뒤 docker build
명령으로 이미지를 생성합니다.
~$ cd dind
~/dind$ sudo docker build --tag dind .
잠시 기다리면 이미지가 생성됩니다. 다음 명령을 실행하여 dind 이미지로 컨테이너를 생성합니다.
~/dind$ sudo docker run -i -t --privileged dind
root@ee112b504b98:/# 2014/08/16 17:20:23 docker daemon: 1.1.2 d84a070; execdriver: native; graphdriver:
[48756c49] +job initserver()
[48756c49.initserver()] Creating server
[48756c49] +job serveapi(unix:///var/run/docker.sock)
2014/08/16 17:20:23 Listening for HTTP on unix (/var/run/docker.sock)
[48756c49] +job init_networkdriver()
[48756c49.init_networkdriver()] creating new bridge for docker0
[48756c49.init_networkdriver()] getting iface addr
[48756c49] -job init_networkdriver() = OK (0)
2014/08/16 17:20:23 WARNING: Your kernel does not support cgroup swap limit.
Loading containers: : done.
[48756c49.initserver()] Creating pidfile
[48756c49.initserver()] Setting up signal traps
[48756c49] -job initserver() = OK (0)
[48756c49] +job acceptconnections()
[48756c49] -job acceptconnections() = OK (0)
root@ee112b504b98:/#
여기서 --privileged
옵션이 중요합니다. 이 옵션은 컨테이너 안에서 호스트의 리눅스 커널 기능을 모두 사용할 수 있도록 해줍니다.
Docker in Docker는 실험적인 기능이기 때문에 로그를 출력하도록 설정되어 있습니다. 로그를 출력하지 않으려면 다음과 같이 -e LOG=file
옵션을 사용하면 됩니다.
$ sudo docker run -i -t --privileged -e LOG=file dind
이제 Docker 컨테이너 안에서 Docker를 실행해보겠습니다. 다음 명령을 입력하여 busybox를 실행해봅니다.
root@ee112b504b98:/# sudo docker run -i -t busybox:latest /bin/sh
Unable to find image 'busybox:latest' locally
Pulling repository busybox
a9eb17255234: Download complete
511136ea3c5a: Download complete
42eed7f1bf2a: Download complete
120e218dd395: Download complete
/ #
이렇게 호스트 → dind 컨테이너 → busybox 컨테이너 순서로 실행이 되었습니다.
Docker in Docker와 리눅스 배포판
Docker in Docker는 호스트의 리눅스 커널 버전에 영향을 받습니다. 따라서 리눅스 배포판에 따라 정상적으로 동작하지 않을 수 있습니다.
- 우분투 14.04: 정상 동작
- CentOS 6.5: 커널 버전이 낮아서 커널 패닉 발생
- CentOS 7: 루프백 장치 마운트 실패가 자주 발생
Docker 버전도 1.1.2 이상 권장합니다. 1.0.x 버전에서는 실행이 되지 않습니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.