도커를 사용하기 위한 핵심 명령어를 간단히 소개한다.
도커를 사용하기 위해서는 우선 이미지(Image)와 컨테이너(container)의 개념을 알아야 한다.
도커 이미지는 가상 머신의 원본이 저장된 파일이라고 생각하면 이해하기 쉽다.
도커 이미지와 관련하여 많이 사용되는 명령어는 두 가지가 있다.
docker images
: 현재 도커 이미지 목록 출력docker rmi
: 도커 이미지 삭제우선 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)를 명시해 주어야 한다. 이미지 이름은 REPOSITORY
와 TAG
를 콜론(:)으로 조합한 문자열이다. 태그(TAG)는 latest 의 경우에 생략 가능하다. 이미지 아이디는 IMAGE ID열에 명시되어 있다.
예를 들어 앞의 경우 datascienceschool/rpython:latest
이미지와 758190f70e5e
이미지는 같은 이미지를 가르킨다. 이미지 아이디를 사용하는 경우 중복된 아이디가 없다면 앞의 문자 일부분만 사용해도 된다. 예를 들어 758190f70e5e
대신 7581
을 사용할 수도 있다. (7581
로 시작하는 다른 아이디가 없는 경우)
만약 특정한 이미지를 삭제하고자 한다면 다음과 같이 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
: 도커 컨테이너 가동docker attach
: 가동 중인 도커 컨테이너 안으로 들어가기exit
: 도커 컨테이너 중지 (컨테이너 내부에서)docker stop
: 도커 컨테이너 중지 (컨테이너 외부에서)docker start
: 도커 컨테이너 재시작 (컨테이너 외부에서)docker restart
: 도커 컨테이너 중지 후 재시작 (컨테이너 외부에서)docker rm
: 도커 컨테이너 삭제도커 컨테이너 명령을 사용할 경우에는 컨테이너 아이디나 컨테이너 이름을 명시해야 한다.
그림: 도커 명령어 요약
현재 존재하는 모든 도커 컨테이너 목록을 보려면 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
명령을 사용한다. 이 명령에는 많은 옵션이 오게 되는데 대표적인 옵션은 다음과 같다.
-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 버튼을 누른다. (이 때 호스트 컴퓨터의 프롬프트가 바로 나타나지 않으면 Enter키를 몇 번 친다.)
dockeruser@377ad03459bf:~$
Ctrl+p, Ctrl+q
user@user-PC MINGW64 ~
$
호스트 컴퓨터에서 작업을 끝낸 후 다시 빠져나왔던 도커 컨테이너로 들어가려면 docker attach
명령을 입력한다. 물론 명령어 뒤에 컨테이너 아이디나 이름을 인수로 입력해야 한다. (마찬가지로 컨테이너의 프롬프트가 바로 나타나지 않으면 Enter키를 몇 번 친다.)
$ docker attach rpython
dockeruser@377ad03459bf:~$
만약 컨테이너 사용을 완전히 마치고 싶으면 컨테이너 안에서 exit
명령을 입력한다. 컨테이너를 중지하고 호스트 컴퓨터로 빠져나온다.
dockeruser@377ad03459bf:~$ exit
exit
user@user-PC MINGW64 ~
$
컨테이너를 중지하지 않고 빠져나온 경우에 외부에서 컨테이너를 중지하고 싶으면 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
명령을 사용한다.
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
명령을 사용한다.
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
명령을 사용한다.
user@user-PC MINGW64 ~
$ docker rm rpython
rpython
user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
datascienceschool/rpython
도커 이미지와 컨테이너를 사용하여 다음과 같이 실행해 본다.
ps
명령)stop
명령)ps
명령)start
명령)ps
명령)attach
명령)ctrl-p ctrl-q
명령)stop
명령)ps
명령)rm
명령)ps
명령)image
명령)run
명령)