Logo

Docker 컨테이너 관련 커맨드 사용법

Docker CLI 도구는 Docker 컨테이너(container)의 효과적인 관리를 위해서 다양한 커맨드(command)를 제공합니다. 이번 포스팅에서는 자주 쓰이는 커맨드 위주로 어떻게 Docker 컨테이너를 효과적으로 제어할 수 있는지 알아보도록 하겠습니다.

컨테이너 조회

가장 먼저 살펴볼 docker ps 커맨드는 Docker 컨테이너를 조회를 위해 사용되며 기본적으로 실행 중인 컨테이너 목록이 출력됩니다.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b1bae952f7a6        python:alpine       "python -m http.serv…"   8 seconds ago       Up 7 seconds                            amazing_chatelet

-a 옵션을 사용하면 현재 중지되어 있는 컨테이너까지 함께 출력됩니다.

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
b1bae952f7a6        python:alpine       "python -m http.serv…"   20 seconds ago      Up 19 seconds                                  amazing_chatelet
3722f14f4d2a        node:alpine         "docker-entrypoint.s…"   3 minutes ago       Exited (0) 3 minutes ago                       elated_khorana
419c12be535d        alpine              "/bin/sh"                4 minutes ago       Exited (0) 4 minutes ago                       laughing_khorana
518d8bb6afaf        python:alpine       "python3"                5 minutes ago       Exited (0) 5 minutes ago                       focused_gauss

-s 옵션을 사용하면 각 컨테이너의 디스크 사용량까지 볼 수 있습니다.

$ docker ps -s
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES               SIZE
b1bae952f7a6        python:alpine       "python -m http.serv…"   6 minutes ago       Up 6 minutes                            amazing_chatelet    1.3MB (virtual 109MB)

-f 옵션을 사용하면 조회 결과를 특정 조건에 따라 필터링해서 볼 수 있습니다. 예를 들어, 특정 이미지로 부터 만들어진 컨테이어만 보고 싶다면 ancestor 필터를 사용하면 됩니다.

$ docker ps -af "ancestor=python:alpine"
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS               NAMES
b1bae952f7a6        python:alpine       "python -m http.serv…"   About an hour ago   Exited (137) 3 minutes ago                         amazing_chatelet
518d8bb6afaf        python:alpine       "python3"                About an hour ago   Exited (0) About an hour ago                       focused_gauss

컨테이너 실행

Docker 컨테이너 실행은 docker run 커맨드를 사용하는데요. 이 커맨드는 특히 중요하고 옵션이 많아서 제가 아래 포스팅에 별도로 정리하였으니 참고바라겠습니다.

컨테이너 중지

실행 중인 Docker 컨테이너를 중지하려면 docker stop 커맨드를 사용합니다. 중지하고 싶은 컨테이너의 아이디나 이름을 인자로 넘기면 됩니다.

$ docker stop amazing_chatelet
amazing_chatelet
$ docker ps -af "name=amazing_chatelet"
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
b1bae952f7a6        python:alpine       "python -m http.serv…"   About an hour ago   Exited (137) 32 seconds ago                       amazing_chatelet

컨테이너 시작

중지된 Docker 컨테이너를 다시 시작하려면 docker start 커맨드를 사용합니다. 마찬가지로 재시작하고 싶은 컨테이너의 아이디나 이름을 인자로 넘기면 됩니다.

$ docker start b1bae952f7a6
b1bae952f7a6
$ docker ps -af "id=b1bae952f7a6"
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b1bae952f7a6        python:alpine       "python -m http.serv…"   About an hour ago   Up About a minute                       amazing_chatelet

컨테이너 상대로 명령어 실행

실행 중인 컨테이너 상대로 명령어를 날리고 싶다면 docker exec 커맨드를 사용합니다.

예를 들어, 어떤 컨테이너를 상대로 ls 커맨드를 실행하고 싶다면 다음과 같이 하면 됩니다.

$ docker exec b1bae952f7a6 ls
bin
dev
etc
home
lib
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

-it 옵션을 사용하면 해당 컨테이너의 쉘(shell)과 작접 상호작용하면서 연속으로 명령어를 실행할 수 있습니다.

$ docker exec -it amazing_chatelet /bin/sh
/ # ls
bin    etc    lib    mnt    proc   run    srv    tmp    var
dev    home   media  opt    root   sbin   sys    usr
/ # touch test.txt
/ # ls test.txt
test.txt
/ #

컨테이너 로그 확인

컨테이너의 로그를 확인하려면 docker logs 커맨드를 사용하면 됩니다.

$ docker logs b1bae952f7a6

-f 옵션을 사용하면 실시간 로그를 확인할 수 있습니다.

$ docker logs -f amazing_chatelet

컨테이너에 터미널 붙이기

컨테이너를 -d 옵션으로 백그라운드에서 실행시킨 경우, 터미널을 다시 해당 컨테이너에 붙이고 싶을 때가 있습니다. 이럴 때는 docker attach 커맨드를 사용하면 해당 컨테이너 상에서 ENTRYPOINT 또는 CMD 명령어로 실행되었던 프로세스에 터미널이 붙습니다.

$ docker run -d -it alpine
daa8f0eee030bb9fcb8b217899563d14d21f452087240a76f3d6910710680127
$ docker attach daa8f0eee030
/ # ls
bin    etc    lib    mnt    proc   run    srv    tmp    var
dev    home   media  opt    root   sbin   sys    usr

컨테이너 상세 정보

특정 컨테이너의 상세 정보를 확인하고 싶다면, docker inspect 커맨드를 사용하면 됩니다.

$ docker inspect 8c27a672e23c
[
    {
        "Id": "8c27a672e23c1c48aaaa0d2e65325aefb36db2934f724634dd4f5684397014ba",
        "Created": "2020-04-25T18:23:24.651490253Z",
        "Path": "/bin/sh",
        "Args": [],
        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-04-25T18:23:25.300618082Z",
            "FinishedAt": "2020-04-25T18:23:25.347690066Z"
        },
        "Image": "sha256:f70734b6a266dcb5f44c383274821207885b549b75c8e119404917a61335981a",
(...생략...)

컨테이너 제거

마지막으로 컨테이너를 제거하고 싶을 때는 docker rm 커맨드를 사용합니다.

중지되어 있는 컨테이너는 아무 옵션없이 제거할 수 있습니다.

$ docker rm 3722f14f4d2a
3722f14f4d2a

실행 중인 컨테이너는 다음과 같이 바로 제거가 허용되지 않습니다.

$ docker rm d2f83048485e
Error response from daemon: You cannot remove a running container d2f83048485e4fe694dac374be152906e4e20da400305e5095bbb476bcaf718d. Stop the container before attempting removal or force remove

이 때는, -f 옵션을 사용하면 해당 컨테이너를 먼저 정지시킨 다음에 제거해줍니다.

$ docker rm -f d2f83048485e
d2f83048485e

실행 중인 컨테이너는 건들지 않고 중지되어 있는 모든 컨테이너를 제거하고 싶다면 다음과 같이 하면 됩니다.

$ docker rm $(docker ps -a -q)

마치면서

지금까지 Docker 컨테이너 제어를 위해서 자주 쓰이는 CLI 커맨드에서 대해서 알아보았습니다. 각 커맨드에 대한 좀 더 자세한 내용은 아래 Docekr CLI 레퍼런스를 참고바라겠습니다.