- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
Docker 사용해보기
이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20
Docker의 명령은 docker run
, docker push
와 같이 docker <명령>
형식이며, 항상 root 권한으로 실행해야 합니다.
먼저 Docker의 기본적인 사용 방법을 알아보기 위해 Docker Hub에서 제공하는 이미지를 받아서 실행해보겠습니다.
search 명령으로 이미지 검색하기
Docker는 Docker Hub(https://registry.hub.docker.com)를 통해 이미지를 공유하는 생태계가 구축되어 있습니다. 유명 리눅스 배포판과 오픈 소스 프로젝트(Redis, Nginx 등)의 Docker 이미지는 모두 Docker Hub에서 구할 수 있습니다. 특히 이미지와 관련된 모든 명령은 기본적으로 Docker Hub를 이용하도록 설정되어 있습니다.
docker 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 탭을 보면 현재 사용할 수 있는 이미지의 버전을 볼 수 있습니다.
sudo 입력하지 않기
docker 명령은 root 권한으로 실행해야 하기 때문에 일반 계정에서는 항상 sudo를 사용합니다. sudo를 매번 입력하기 귀찮기도 하고 빠뜨릴 때도 많습니다. sudo를 입력하지 않는 방법은 두 가지가 있습니다.
- 처음부터 root 계정으로 로그인하거나
sudo su
명령을 사용하여 root 계정으로 전환
$ sudo su
#
- 현재 계정을 docker 그룹에 포함(docker 그룹은 root 권한과 동일하므로 꼭 필요한 계정만 포함시킵니다).
$ sudo usermod -aG docker ${USER}
$ sudo service docker restart
현재 계정에서 로그아웃한 뒤 다시 로그인합니다.
pull 명령으로 이미지 받기
Docker Hub에서 우분투 리눅스 이미지를 받아보겠습니다.
$ sudo docker pull ubuntu:latest
docker pull <이미지 이름>:<태그>
형식입니다. latest를 설정하면 최신 버전을 받습니다. ubuntu:14.04, ubuntu:12.10처럼 태그를 지정해 줄 수도 있습니다.
이미지 이름에서 pyrasis/ubuntu처럼 / 앞에 사용자명을 지정하면 Docker Hub에서 해당 사용자가 올린 이미지를 받습니다. 공식 이미지는 사용자명이 붙지 않습니다.
참고
호스트에 설치된 리눅스 배포판과 Docker 이미지의 배포판의 종류가 달라도 됩니다. CentOS에서 우분투 컨테이너를 실행할 수 있습니다.
images 명령으로 이미지 목록 출력하기
이제 받은 이미지의 목록을 출력해보겠습니다.
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest e54ca5efa2e9 Less than a second ago 276.1 MB
docker images
명령은 모든 이미지 목록을 출력합니다. docker images ubuntu
처럼 이미지 이름을 설정하면 이름은 같지만 태그가 다른 이미지가 출력됩니다.
run 명령으로 컨테이너 생성하기
이미지를 컨테이너로 생성한 뒤 Bash 셸을 실행해보겠습니다.
$ sudo docker run -i -t --name hello ubuntu /bin/bash
docker run <옵션> <이미지 이름> <실행할 파일>
형식입니다. 여기서는 ubunbu 이미지를 컨테이너로 생성한 뒤 ubuntu 이미지 안의 /bin/bash를 실행합니다. 이미지 이름 대신 이미지 ID를 사용해도 됩니다.
-i
(interactive),-t
(Pseudo-tty) 옵션을 사용하면 실행된 Bash 셸에 입력 및 출력을 할 수 있습니다.--name
옵션으로 컨테이너의 이름을 지정할 수 있습니다. 이름을 지정하지 않으면 Docker가 자동으로 이름을 생성하여 지정합니다.
이제 호스트 OS와 완전히 격리된 공간이 생성되었습니다. cd, ls 명령으로 컨테이너 내부를 한번 둘러봅니다. 호스트 OS와는 다르다는 것을 알 수 있습니다. exit를 입력하여 Bash 셸에서 빠져나옵니다. 우분투 이미지에서 /bin/bash 실행 파일을 직접 실행했기 때문에 여기서 빠져나오면 컨테이너가 정지(stop)됩니다.
참고
CentOS에서 다음과 같은 에러가 발생한다면
unable to remount sys readonly: unable to mount sys as readonly max retries reached
/etc/sysconfig/docker 파일에서 다음과 같이 --exec-driver=lxc
를 추가합니다.
# /etc/sysconfig/docker
#
# Other arguments to pass to the docker daemon process
# These will be parsed by the sysv initscript and appended
# to the arguments list passed to docker -d
other_args="--selinux-enabled --exec-driver=lxc"
Docker 서비스를 재시작합니다.
$ sudo service docker restart
ps 명령으로 컨테이너 목록 확인하기
다음 명령을 입력하여 모든 컨테이너 목록을 출력합니다.
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6338ce52d07c ubuntu:latest /bin/bash 4 seconds ago Exited (0) Less than a second ago hello
docker ps
형식입니다. -a
옵션을 사용하면 정지된 컨테이너까지 모두 출력하고, 옵션을 사용하지 않으면 실행되고 있는 컨테이너만 출력합니다.
우리는 앞에서 컨테이너를 생성할 때 이름을 hello로 지정했으므로 컨테이너 목록에서도 hello로 표시됩니다.
start 명령으로 컨테이너 시작하기
방금 정지한 컨테이너를 다시금 시작해보겠습니다.
$ sudo docker start hello
docker start <컨테이너 이름>
형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.
다음 명령을 입력하여 실행된 컨테이너 목록을 출력합니다.
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6338ce52d07c ubuntu:latest /bin/bash 15 minutes ago Up 3 seconds hello
hello 컨테이너가 시작되었습니다.
restart 명령으로 컨테이너 재시작하기
OS 재부팅처럼 컨테이너를 재시작해보겠습니다.
$ sudo docker restart hello
docker restart <컨테이너 이름>
형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.
attach 명령으로 컨테이너에 접속하기
이제 시작한 컨테이너에 접속해보겠습니다. 다음 명령을 실행한 뒤 엔터를 한번 더 입력하면 Bash 셸이 표시됩니다.
$ sudo docker attach hello
root@6338ce52d07c:/#
docker attach <컨테이너 이름>
형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.
우리는 /bin/bash를 실행했기 때문에 명령을 자유롭게 입력할 수 있지만, DB나 서버 애플리케이션을 실행하면 입력은 할 수 없고 출력만 보게 됩니다.
Bash 셸에서 exit 또는 Ctrl+D를 입력하면 컨테이너가 정지됩니다. 여기서는 Ctrl+P, Ctrl+Q를 차례대로 입력하여 컨테이너를 정지하지 않고, 컨테이너에서 빠져나옵니다.
exec 명령으로 외부에서 컨테이너 안의 명령 실행하기
현재 컨테이너가 /bin/bash로 실행된 상태입니다. 이번에는 /bin/bash를 통하지 않고 외부에서 컨테이너 안의 명령을 실행해보겠습니다.
$ sudo docker exec hello echo "Hello World"
Hello World
docker exec <컨테이너 이름> <명령> <매개 변수>
형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다. 컨테이너가 실행되고 있는 상태에서만 사용할 수 있으며 정지된 상태에서는 사용할 수 없습니다.
컨테이너 안의 echo
명령을 실행하고 매개 변수로 "Hello World"를 지정했기 때문에 Hello World가 출력됩니다. docker exec
명령은 이미 실행된 컨테이너에 apt-get
, yum
명령으로 패키지를 설치하거나, 각종 데몬을 실행할 때 활용할 수 있습니다.
stop 명령으로 컨테이너 정지하기
이번에는 컨테이너를 정지해보겠습니다. 먼저 실행된 컨테이너 목록을 출력합니다.
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6338ce52d07c ubuntu:latest /bin/bash 51 minutes ago Up 2 minutes hello
다음 명령으로 컨테이너를 정지합니다.
$ sudo docker stop hello
docker stop <컨테이너 이름>
형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.
실행된 컨테이너 목록을 출력합니다.
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
hello 컨테이너를 정지했기 때문에 아무것도 안 나옵니다.
rm 명령으로 컨테이너 삭제하기
생성된 컨테이너를 삭제해보겠습니다.
$ sudo docker rm hello
docker rm <컨테이너 이름>
형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.
모든 컨테이너 목록을 출력합니다.
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
hello 컨테이너를 삭제했기 때문에 아무것도 안 나옵니다.
rmi 명령으로 이미지 삭제하기
이번에는 이미지를 삭제해보겠습니다.
$ sudo docker rmi ubuntu:latest
docker rmi <이미지 이름>:<태그>
형식입니다. 이미지 이름 대신 이미지 ID를 사용해도 됩니다. docker rmi ubuntu
처럼 이미지 이름만 지정하면 태그는 다르지만 ubuntu 이름을 가진 모든 이미지가 삭제됩니다.
이미지 목록을 출력합니다.
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 이미지를 삭제했기 때문에 아무것도 안 나옵니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.