Docker 기본 사용법
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
더 자세한 내용은 가장 빨리 만나는 Docker를 참고하세요.
Docker 기본 사용법
이재홍 http://www.pyrasis.com 2014.7.7 ~ 2015.2.11
Docker는 리눅스 서버를 손쉽게 패키징하고, 배포할 수 있도록 해주는 플랫폼입니다. 이 문서는 Docker 기본 사용법 강좌입니다.
목차
가상 머신과 Docker
Docker는 지금까지 사용해왔던 VMware, Microsoft Hyper-V(Virtual PC), Xen 등의 같은 가상 머신과 비슷합니다.
가상 머신에 리눅스를 설치한 뒤 각종 서버와 DB를 설치하고, 개발한 어플리케이션이나 웹사이트를 실행했습니다. 이렇게 세팅한 가상 머신 이미지를 여러 서버에 복사해서 실행하면 이미지 하나로 서버를 계속 만들어낼 수 있었습니다.
보통 가상 머신 서버를 독자적으로 운영하거나, 서비스 형태로 제공되는 AWS, Microsoft Azure를 사용하기도 합니다.
가상 머신

출처: http://www.docker.com/whatisdocker/
가상 머신은 편하긴 하지만 성능이 좋지 못한 것이 단점이었습니다. 지금까지 CPU에 가상화를 위한 기능들이 많이 추가되었지만 아직도 가상 머신은 리얼 머신에 비해 속도가 느립니다.
느린 속도를 개선하기 위해 반가상화(Paravirtualization) 방식이 개발되었고, 현재 널리 쓰이고 있습니다.
그림에서 보는 것과 같이 가상 머신이기 때문에 항상 Guest OS를 설치해야 합니다. 그래서 이미지안에 OS가 포함되기 때문에 이미지 용량이 커집니다.
아무리 네트워크와 인터넷 속도가 빨라졌다 하더라도 가상화 이미지를 주고받는 것은 꽤 부담스럽습니다.
가상 머신은 OS를 가상화하는데 초점이 맞춰져 있습니다. 그래서 이미지를 생성하는 기능만 가지고 있을 뿐 배포와 관리 기능이 부족합니다(VMware의 비싼 제품을 사용해도 되지만…).
Docker

출처: http://www.docker.com/whatisdocker/
Docker는 반가상화보다 좀더 경량화된 방식입니다. 그림에서 보는 것과 같이 Geust OS를 설치하지 않습니다. Docker 이미지에 서버 운영에 필요한 프로그램과 라이브러리만 격리해서 설치할 수 있고, OS 자원은 호스트와 공유합니다. 이렇게 되면서 이미지 용량이 크게 줄어들었습니다. 그리고 가상화 레이어가 없기 때문에 파일시스템, 네트워크 속도도 가상 머신에 비해 월등히 빠릅니다(호스트와 거의 동일한 속도).
최근까지 Docker는 lxc(Linux Container) 드라이버 기반으로 동작했지만 0.9x 버전부터는 libcontainer를 사용합니다.
Docker는 가상 머신과는 달리 이미지 생성과 배포에 특화된 기능을 제공합니다.
Git에서 소스를 관리하는 것처럼 이미지 버전 관리 기능을 제공합니다. 그리고 중앙 관리를 위해 저장소에 이미지를 올리고, 받을 수 있습니다(Push/Pull). 게다가 GitHub처럼 Docker 이미지를 공유할 수 있는 Docker Hub도 제공합니다(GitHub처럼 개인 저장소도 제공합니다).
다양한 API를 제공하기 때문에 원하는 만큼 자동화를 할 수 있어 개발과 서버 운영에 매우 유용합니다.
리눅스 컨테이너
리눅스는 운영체제 레벨에서 가상화를 제공했습니다. OS를 통째로 가상화하는 것이 아닌 리눅스 커널 레벨에서 제공하는 일종의 격리(Isolate)된 가상 공간입니다.
OS가 설치되지 않기 때문에 가상 머신이라고 하지 않고, 컨테이너라고 부릅니다.
리눅스 컨테이너는 격리된 공간만 제공할 뿐 개발 및 서버 운영에 필요한 부가기능이 부족했습니다. Docker는 리눅스 컨테이너를 기반으로 하여 편리하게 이미지를 관리하고 배포할 수 있도록 해줍니다.
Docker 이미지와 컨테이너
Docker는 이미지와 컨테이너라는 개념이 있습니다.
이미지는 필요한 프로그램과 라이브러리, 소스를 설치한 뒤 파일로 만든 것입니다. 이 이미지를 저장소에 올리고, 받을 수 있습니다.
컨테이너는 이미지를 실행한 상태입니다. 이미지로 여러개의 컨테이너를 만들 수 있습니다. 운영체제로 보면 이미지는 실행파일이고 컨테이너는 프로세스입니다.
Docker는 특정 실행파일 또는 스크립트를 위한 실행 환경이라 보면 됩니다. 리눅스/유닉스 계열은 파일 실행에 필요한 모든 구성요소가 잘게 쪼개어져 있습니다. 시스템 구조가 단순해지고 명확해지는 장점이 있지만 의존성 관계를 해결하기가 어려워지는 단점이 있습니다. 그래서 리눅스 배포판 별로 미리 컴파일된 패키지(rpm, deb 등)라는 시스템이 나왔습니다. 하지만 서버를 실행할 때마다 일일이 소스를 컴파일하거나 패키지를 설치하고, 설정하려면 상당히 귀찮습니다.
서버가 한 두대라면 큰 어려움이 없겠지만 클라우드 환경에서는 서버를 몇 십, 몇 백개를 생성해야 합니다. 서버 구성을 미리 해놓은 Docker 이미지를 사용하면 실행할 서버가 몇개가 되든 손쉽게 해결할 수 있습니다.
설치하기
이제 Docker를 설치해보겠습니다. Docker는 소스를 컴파일해서 설치하려면 준비해야할 것이 많습니다. 따라서 이 문서에서는 자동 설치 스크립트와 각 리눅스 배포판의 패키지로 설치하는 방법을 설명하겠습니다.
리눅스
자동 설치 스크립트
Docker는 리눅스 배포판 종류를 자동으로 인식하여 패키지를 설치해주는 스크립트를 제공합니다.
$ sudo wget -qO- https://get.docker.com/ | sh
get.docker.com 스크립트로 Docker를 설치하면 hello-world 이미지도 자동으로 설치됩니다.
hello-world 이미지는 사용하지 않을 것이므로 모두 삭제합니다.
$ sudo docker rm `sudo docker ps -aq`
$ sudo docker rmi hello-world
우분투
자동 설치 스크립트를 사용하지 않고 우분투에서 패키지로 직접 설치하는 방법입니다.
우분투 14.04 LTS 64비트를 기준으로 하겠습니다.
$ sudo apt-get update
$ sudo apt-get install docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
/usr/bin/docker.io
실행파일을 /usr/local/bin/docker
로 링크해서 사용합니다.
RedHat Enterprise Linux, CentOS
자동 설치 스크립트를 사용하지 않고, 레드햇 엔터프라이즈 리눅스(RHEL)와 CentOS에서 패키지로 직접 설치하는 방법입니다. RHEL과 CentOS 패키지 저장소에는 docker-io가 없으므로 EPEL(Fedora Extra Packages For Enterprise Linux) 저장소를 사용할 수 있도록 설정합니다.
CentOS 6
$ sudo yum install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum install docker-io
AWS EC2에 설치되는 Amazon Linux(CentOS 기반)는 EPEL 저장소를 바로 사용할 수 있으므로 epel-release-6-8.noarch.rpm은 설치하지 않아도 됩니다.
CentOS 7에서는 docker 패키지를 설치하면 됩니다.
CentOS 7
$ sudo yum install docker
Docker 서비스 실행
$ sudo service docker start
부팅했을 때 자동으로 실행하기
$ sudo chkconfig docker on
Mac OS X
맥에서는 Boot2Docker를 이용하여 Docker를 사용할 수 있습니다.
https://github.com/boot2docker/osx-installer/releases에서 Boot2Docker-1.x.x.pkg를 받은 뒤 설치합니다.
설치는 특별한 것이 없으므로 따로 설명하지 않겠습니다(내부적으로 VirtualBox가 함께 설치됩니다).
설치가 끝난 뒤에 응용 프로그램(Applications)에서 boot2docker
를 실행합니다.
잠시 기다리면 자동으로 boot2docker.iso를 이용하여 가상 머신이 생성되고, 가상 머신에 접속됩니다.
윈도우
윈도우에서는 Boot2Docker를 이용하여 Docker를 사용할 수 있습니다.
https://github.com/boot2docker/windows-installer/releases에서 docker-install.exe를 받은 뒤 설치합니다.
- VirtualBox를 설치하지 않았다면 VirtualBox에 체크합니다.
- 윈도우용 Git을 설치하지 않았다면 MSYS-git UNIX tools에 체크합니다.
설치가 끝난 뒤에 바탕 화면에 생성된 Boot2Docker Start
을 실행합니다. 만약 실행 파일 선택 창이 뜨면 Git Bash의 sh.exe를 선택합니다.
잠시 기다리면 자동으로 boot2docker.iso를 이용하여 가상 머신이 생성되고, 가상 머신에 접속됩니다.
사용하기
Docker의 명령은 docker run
, docker push
와 같이 docker <명령>
형식입니다. 그리고 항상 root 권한으로 실행해야 합니다.
먼저 Docker의 기본적인 사용법을 알아보기 위해 Docker Hub에서 제공하는 이미지를 받아서 실행해보겠습니다.
search
Docker는 Docker Hub를 통해 이미지를 공유하는 생태계가 구축되어 있습니다. search
명령으로 Docker Hub에서 이미지를 검색할 수 있습니다.
$ sudo docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Official Ubuntu base image 383
stackbrew/ubuntu Official Ubuntu base image 40
crashsystems/gitlab-docker A trusted, regularly updated build of GitL... 19 [OK]
dockerfile/ubuntu Trusted Ubuntu (http://www.ubuntu.com/) Bu... 15 [OK]
ubuntu-upstart Upstart is an event-based replacement for ... 7
cmfatih/phantomjs PhantomJS [ phantomjs 1.9.7, casperjs 1.1.... 5 [OK]
dockerfile/ubuntu-desktop Trusted Ubuntu Desktop (LXDE) (http://lxde... 5 [OK]
lukasz/docker-scala Dockerfile for installing Scala 2.10.3, Ja... 5 [OK]
litaio/ruby Ubuntu 14.04 with Ruby 2.1.2 compiled from... 5 [OK]
엄청나게 많은 이미지가 검색될 것입니다. 보통 ubuntu, centos, redis 등 OS나 프로그램 이름을 가진 이미지가 공식 이미지입니다. 나머지는 사용자들이 만들어 공개한 이미지입니다.
Docker Hub에서 이미지를 검색한 뒤 해당 이미지의 Tags 탭을 보면 현재 사용할 수 있는 이미지의 버전을 볼 수 있습니다.
Official Ubuntu base image Tags
pull
우분투 이미지를 받아보겠습니다.
$ sudo docker pull ubuntu:latest
docker pull <이미지 이름>:<태그>
형식입니다. latest를 설정하면 최신 버전을 받습니다. ubuntu:14.04, ubuntu:12.10처럼 태그를 지정해 줄 수도 있습니다.
이미지 이름에서 pyrasis/ubuntu처럼 / 앞에 사용자명을 지정하면 Docker Hub에서 해당 사용자가 올린 이미지를 받습니다. 공식 이미지는 사용자명이 붙지 않습니다.