작성자: admin 작성일시: 2016-08-30 11:13:25 조회수: 4837 다운로드: 216
카테고리: 개발/운용 환경 태그목록: Docker

도커 초간단 사용법

도커를 사용하기 위한 핵심 명령어를 간단히 소개한다.

도커를 사용하기 위해서는 우선 이미지(Image)와 컨테이너(container)의 개념을 알아야 한다.

도커 이미지

도커 이미지는 가상 머신의 원본이 저장된 파일이라고 생각하면 이해하기 쉽다.

도커 이미지와 관련하여 많이 사용되는 명령어는 두 가지가 있다.

  • docker images : 현재 도커 이미지 목록 출력
  • docker rmi : 도커 이미지 삭제

docker images

우선 docker images 명령은 현재 파일 시스템에 저장된 도커 이미지 목록을 출력한다.

리눅스에서 도커를 사용하고 있다면 터미널을, 윈도우즈나 맥에서 도커 툴박스를 사용하고 있다면 Docker Quickstart Terminal을 시작한 후 다음과 같이 docker images 명령을 입력해 보자.

$ docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
datascienceschool/rpython   latest              758190f70e5e        6 days ago          7.711 GB
ubuntu                      latest              a1e4ed2ac65b        7 days ago          188 MB

현재 파일 시스템에 존재하는 모든 이미지의 목록을 보여준다.

이미지 관련 명령을 사용할 때는 이미지 이름이나 이미지 아이디(ID)를 명시해 주어야 한다. 이미지 이름은 REPOSITORYTAG를 콜론(:)으로 조합한 문자열이다. 태그(TAG)는 latest 의 경우에 생략 가능하다. 이미지 아이디는 IMAGE ID열에 명시되어 있다.

예를 들어 앞의 경우 datascienceschool/rpython:latest 이미지와 758190f70e5e 이미지는 같은 이미지를 가르킨다. 이미지 아이디를 사용하는 경우 중복된 아이디가 없다면 앞의 문자 일부분만 사용해도 된다. 예를 들어 758190f70e5e 대신 7581을 사용할 수도 있다. (7581로 시작하는 다른 아이디가 없는 경우)

docker rmi

만약 특정한 이미지를 삭제하고자 한다면 다음과 같이 docker rmi 뒤에 이미지 이름 문자열이나 이미지 아이디를 추가하여 입력한다.

$ docker rmi 758190f70e5e

만약 이미지를 삭제하려고 하는데 현재 해당 이미지를 복사한 컨테이너가 존재하거나 해당 이미지에 의존하는 다른 이미지가 존재하면 아래와 같이 오류 표시가 나타난다. 이 경우에는 해당 컨테이너 등을 삭제한 후 이미지를 삭제해야 한다.

$ docker rmi 758190f70e5e
Failed to remove image (758190f70e5e): Error response from daemon: conflict: unable to delete 758190f70e5e (must be forced) - image is being used by stopped container 3be34f7a1cb2

도커 컨테이너

도커 컨테이너는 이미지를 가상 파일 시스템 상에 올린 것이라고 생각하면 된다. 따라서 하나의 이미지에서 복수개의 컨테이너를 가동해도 된다. 이 경우에는 완전히 동일한 가상 컴퓨터가 복수 대 있는 것과 마찬가지가 된다.

도커 컨테이너와 관련하여 많이 사용되는 명령어는 다음과 같다.

  • docker ps -a : 현재 도커 컨테이너 목록 출력
  • docker run : 도커 컨테이너 가동
  • Ctrl+p, Ctrl+q : 가동 중인 도커 컨테이너에서 나오기
  • docker attach : 가동 중인 도커 컨테이너 안으로 들어가기
  • exit : 도커 컨테이너 중지 (컨테이너 내부에서)
  • docker stop : 도커 컨테이너 중지 (컨테이너 외부에서)
  • docker start : 도커 컨테이너 재시작 (컨테이너 외부에서)
  • docker restart : 도커 컨테이너 중지 후 재시작 (컨테이너 외부에서)
  • docker rm : 도커 컨테이너 삭제

도커 컨테이너 명령을 사용할 경우에는 컨테이너 아이디나 컨테이너 이름을 명시해야 한다.

그림: 도커 명령어 요약

docker ps -a

현재 존재하는 모든 도커 컨테이너 목록을 보려면 docker ps -a 명령을 사용한다. 만약 -a 옵션 없이 사용하면 가동중인 컨테이너만 보인다.

$ docker ps -a
CONTAINER ID IMAGE                     COMMAND         CREATED    STATUS                      PORTS    NAMES
3be34f7a1cb2 datascienceschool/rpython "/usr/bin/tini" 5 days ago Exited (137) 15 minutes ago 8787/tcp rpython

도커 이미지와 마찬가지로 도커 컨테이너도 NAMES 열에 보인 컨테이너 이름 문자열과 CONTAINER ID 열에 보인 컨테이너 아이디로 특정 컨테이너를 지정할 수 있다. 컨테이너를 멈추거나 삭제하는 경우에 사용한다.

출력에서 주의해야 할 것은 STATUS 항목이다. STATUS 항목이 Up 이면 해당 컨테이너가 현재 작동중이라는 뜻이고 웹 브라우저를 통해 Jupyter Notebook을 사용할 수 있다. 만약 STATUS 항목이 위의 예처럼 Exited 이면 현재 동작이 멈추어 있다는 의미이다. 따라서 Jupyter Notebook을 사용하려면 docker start 를 시키거나 docker rm 명령으로 삭제한 뒤에 다시 docker run 을 해야 한다.

docker run

도커 컨테이너를 시작하려면 docker run 명령을 사용한다. 이 명령에는 많은 옵션이 오게 되는데 대표적인 옵션은 다음과 같다.

  • -it : 터미널을 가진 대화형으로 도커 컨테이너를 시작한다.
  • -d : 데몬(daemon)으로 도커 컨테이너를 시작한다.
  • --name : 컨테이너에 이름을 지정한다.
  • -p : 컨테이너와 호스트간의 포트 포워딩
  • -v : 컨테이너와 호스트간의 폴더 공유

옵션 다음에는 가동할 이미지의 이름과 수행할 명령을 추가한다.

예를 들어 datascienceschool/rpython 이미지를 대화형 컨테이너로 가동하는 경우 다음과 같이 입력할 수 있다.

docker run -Pit --name rpython -p 8888:8888 -p 8787:8787 -p 6006:6006 datascienceschool/rpython

위 명령은 datascienceschool/rpython 이미지를 rpython이란 컨테이너 이름으로 가동시키며 터미널을 가진 대화형 컨테이너를 사용하고 컨테이의 8888 포트와 8787포트를 호스트의 8888 포트 및 8787 포트와 연결하라는 의미이다.

-Pit 옵션은 모든 포트를 열고 상호 대화적 셸 사용이 가능하게 하라는 옵션이다.

원래 docker run 명령은 마지막에 /bin/bash 등의 명령을 주지만 datascienceschool/rpython 이미지의 경우 아무런 명령이 없을 경우 자동으로 /bin/bash를 수행하도록 만들어져 있다. docker run 으로 /bin/bash 를 수행한 경우 다음과 같이 프롬프트가 바뀌며 도커 컨테이너 안으로 들어갔음을 보여준다.

$ docker run -Pit --name rpython -p 8888:8888 -p 8787:8787 -p 6006:6006 datascienceschool/rpython
dockeruser@377ad03459bf:~$

앞의 프롬프트에서 dockeruser는 도커 컨테이너상의 사용자 아이디를, 377ad03459bf는 도커 컨테이너 아이디를 가리킨다.

Ctrl+p, Ctrl+q

도커 컨테이너 안에서 작업을 하다가 도커 컨테이너는 정지시키지 않고 잠시 컨테이너에서 호스트로 빠져나오고 싶은 경우에는 Ctrl+p, Ctrl+q 버튼을 누른다. (이 때 호스트 컴퓨터의 프롬프트가 바로 나타나지 않으면 Enter키를 몇 번 친다.)

dockeruser@377ad03459bf:~$ Ctrl+p, Ctrl+q

user@user-PC MINGW64 ~

$

docker attach

호스트 컴퓨터에서 작업을 끝낸 후 다시 빠져나왔던 도커 컨테이너로 들어가려면 docker attach 명령을 입력한다. 물론 명령어 뒤에 컨테이너 아이디나 이름을 인수로 입력해야 한다. (마찬가지로 컨테이너의 프롬프트가 바로 나타나지 않으면 Enter키를 몇 번 친다.)

$ docker attach rpython
dockeruser@377ad03459bf:~$

exit

만약 컨테이너 사용을 완전히 마치고 싶으면 컨테이너 안에서 exit 명령을 입력한다. 컨테이너를 중지하고 호스트 컴퓨터로 빠져나온다.

dockeruser@377ad03459bf:~$ exit
exit
user@user-PC MINGW64 ~
$

docker stop

컨테이너를 중지하지 않고 빠져나온 경우에 외부에서 컨테이너를 중지하고 싶으면 docker stop 명령을 사용한다.

user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE                     COMMAND         CREATED        STATUS       PORTS                  NAMES
a181562ac4d8 datascienceschool/rpython "/usr/bin/tini" 15 seconds ago Up 5 seconds 0.0.0.0:8787->8787/tcp rpython

user@user-PC MINGW64 ~
$ docker stop rpython
rpython

user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE                     COMMAND         CREATED        STATUS                     PORTS NAMES
a181562ac4d8 datascienceschool/rpython "/usr/bin/tini" 25 seconds ago Exited (143) 7 seconds ago       rpython

docker start

컨테이너가 중지가 중지된 상태에서 다시 시작하고 싶으면 docker start 명령을 사용한다.

user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE                     COMMAND         CREATED        STATUS                     PORTS NAMES
a181562ac4d8 datascienceschool/rpython "/usr/bin/tini" 45 seconds ago Exited (143) 6 seconds ago       rpython

user@user-PC MINGW64 ~
$ docker start rpython
rpython

user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE                     COMMAND         CREATED        STATUS       PORTS                  NAMES
a181562ac4d8 datascienceschool/rpython "/usr/bin/tini" 57 seconds ago Up 5 seconds 0.0.0.0:8787->8787/tcp rpython

docker restart

컨테이너의 상태에 관계없이 (동작 중에도) 중지한 후에 다시 시작하고 싶으면 docker restart 명령을 사용한다.

user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE                     COMMAND         CREATED        STATUS                     PORTS NAMES
a181562ac4d8 datascienceschool/rpython "/usr/bin/tini" 53 seconds ago Up 6 seconds                     rpython

user@user-PC MINGW64 ~
$ docker restart rpython
rpython

user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE                     COMMAND         CREATED        STATUS       PORTS                  NAMES
a181562ac4d8 datascienceschool/rpython "/usr/bin/tini" 54 seconds ago Up 6 seconds 0.0.0.0:8787->8787/tcp rpython

docker rm

컨테이너가 중지되었어도 컨테이너 자체는 계속 남아있기 때문에 같은 이름으로 컨테이너를 다시 생성하기 위해서는 해당 이름을 가진 컨테이너를 삭제해야 한다. 이 때 docker rm 명령을 사용한다.

user@user-PC MINGW64 ~
$ docker rm rpython
rpython

user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

연습 문제 1

datascienceschool/rpython 도커 이미지와 컨테이너를 사용하여 다음과 같이 실행해 본다.

  1. 컨테이너가 현재 가동 중인지 확인한다. (ps 명령)
  2. 만약 가동 중이면 컨테이너를 중지한다. (stop 명령)
  3. 컨테이너가 중지되었는지 확인한다. (ps 명령)
  4. 컨테이너를 다시 시작한다. (start 명령)
  5. 컨테이너가 현재 가동 중인지 확인한다. (ps 명령)
  6. 컨테이너 셸 안으로 들어간다. (attach 명령)
  7. 컨테이너를 중지하지 않고 나온다. (ctrl-p ctrl-q 명령)
  8. 컨테이너를 중지한다. (stop 명령)
  9. 컨테이너가 현재 가동 중인지 확인한다. (ps 명령)
  10. 컨테이너를 삭제한다. (rm 명령)
  11. 컨테이너가 현재 가동 중인지 확인한다. (ps 명령)
  12. 이미지 목록을 살펴본다. (image 명령)
  13. 컨테이너를 가동한다. (run 명령)

참고 문헌

여기에서는 도커를 사용하기 위한 최소한의 내용을 설명하였다. 도커에 대해 보다 자세히 알고싶으면 다음 문헌을 참고 한다.

질문/덧글

docker restart rpython (과거에 실행시킨 컨테이너 다시쓰기) minj*** 2016년 6월 18일 11:29 오전

docker ps -a 로 과거에 Exit된 rpython이라는 컨테이너가 확인하고
docker restart rpython을 쓰면 다시 해당 컨테이너를 사용할 수 있다고 수업에서 들었습니다.
그런데 아래와 같이 해당구문을 치면, 'rpython'이라고 뜨고 앞의 계정이 계속default로 유지되며
변하지 않는 것 같습니다. 매번 rpython이름을 stop, rm구문등을 통해 지우고, 다시 실행시켜야하는지 궁금합니다.

[해당구문입력]
docker@default:~$docker restart rpython
[결과화면]
rpython
docker@default:~$

답변: docker restart rpython (과거에 실행시킨 컨테이너 다시쓰기) 관리자 2016년 6월 18일 8:16 오후

docker restart rpython
명령을 사용한 후에는
docker attach rpython
명령으로 셸에 들어가실 수 있습니다.