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 탭을 보면 현재 사용할 수 있는 이미지의 버전을 볼 수 있습니다.


그림 3-1 우분투 리눅스 이미지의 태그 목록

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

# /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 공유는 허용합니다.

Published

30 November 2014