도커 컨테이너의 생명주기

Created
February 6, 2021
Created by
D
DaEun Kim
Tags
Docker
Property

도커 컨테이너의 생명주기는 5단계로 구분한다.

image

1. 생성 (create)

mysql 이미지로 컨테이너를 생성해보았다.

생성된 컨테이너에 exec 명령어로 bash를 실행하려고 하면 컨테이너는 아직 running 상태가 아니기 때문에 Error response from daemon: Container 44bd0e9bd9... is not running 이라는 메세지를 출력한다.

$ docker create <이미지이름>
➜  docker create mysql
44bd0e9bd9b85a4cbdece60abc201c4fd4e6b249b2d49a4611be61bc6ffe7ef6

➜  docker ps -a | grep 44bd0e9bd9b8
44bd0e9bd9b8        mysql               "docker-entrypoint.s…"   16 seconds ago      Created                                                            sharp_keldysh

➜  docker exec 44bd0e9bd9b8 -it bash
Error response from daemon: Container 44bd0e9bd9b85a4cbdece60abc201c4fd4e6b249b2d49a4611be61bc6ffe7ef6 is not running

2. 시작 (start)

생성된 컨테이너는 start 명령어를 통해 running 상태가 된다.

$ docker start <컨테이너ID 또는 이름>
➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                 NAMES
07c50f2b35da        mysql:latest        "docker-entrypoint.s…"   2 months ago        Up 2 seconds        127.0.0.1:3306->3306/tcp, 33060/tcp   sharp_keldysh

run 명령어는 도커 컨테이너를 생성(create)하고 시작(start)한다.

$ docker run <이미지이름>
➜  docker run redis
1:C 11 Feb 2021 04:31:04.746 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 11 Feb 2021 04:31:04.746 # Redis version=6.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 11 Feb 2021 04:31:04.746 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 11 Feb 2021 04:31:04.747 * Running mode=standalone, port=6379.
1:M 11 Feb 2021 04:31:04.747 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 11 Feb 2021 04:31:04.747 # Server initialized
1:M 11 Feb 2021 04:31:04.747 * Ready to accept connections 

➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                                 NAMES
8f4c822f95ba        redis               "docker-entrypoint.s…"   11 seconds ago      Up 10 seconds                 6379/tcp                              serene_buck

3. 중지 (stopped)

컨테이너를 중지시키는 방법은 2가지가 있다.

$ docker stop <컨테이너ID 또는 이름>
➜ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                                 NAMES
8f4c822f95ba        redis               "docker-entrypoint.s…"   36 minutes ago      Up 36 minutes                 6379/tcp                              serene_buck

➜ docker stop 8f4c822f95ba
8f4c822f95ba

➜ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                                 NAMES
8f4c822f95ba        redis               "docker-entrypoint.s…"   36 minutes ago      Exited (0) 6 seconds ago                                            serene_buck
$ docker kill <컨테이너ID 또는 이름>
➜ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                                 NAMES
8f4c822f95ba        redis               "docker-entrypoint.s…"   36 minutes ago      Up 36 minutes                 6379/tcp                              serene_buck

➜ docker kill 8f4c822f95ba
8f4c822f95ba

➜ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                                 NAMES
8f4c822f95ba        redis               "docker-entrypoint.s…"   36 minutes ago      Exited (0) 6 seconds ago                                            serene_buck

stop 명령어는 컨테이너에게 SIGTERM 이라는 시그널을 먼저 보낸 뒤에 SIGKILL 시그널을 보낸다.

kill 명령어는 컨테이너에게 SIGTERM을 보내지 않고 바로 SIGKILL 시그널을 보낸다.

SIGTERM은 프로세스가 자신이 하던 일을 정리하고(파일, 소켓, 자식 프로세스 등을 정리하거나 임시파일 삭제)종료할 수 있도록 하는 시그널이다. 반면에 SIGKILL 시그널은 프로세스를 무조건 강제종료 시킨다.

image
image

4. 삭제 (deleted)

실행(running) 상태인 컨테이너를 삭제할 수는 없다. 컨테이너를 삭제하려면 stop 이나 kill 명령어로 먼저 컨테이너를 멈춰야 한다.

➜  docker start 8f4c822f95ba
8f4c822f95ba

➜  docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                                 NAMES
8f4c822f95ba        redis               "docker-entrypoint.s…"   40 minutes ago      Up 1 second                   6379/tcp                              serene_buck

➜  docker rm 8f4c822f95ba
Error response from daemon: You cannot remove a running container 8f4c822f95ba78b747a848cb41f4b5e999bf3ca1f0f814f98953ab0706199497. Stop the container before attempting removal or force remove

➜  docker stop 8f4c822f95ba
8f4c822f95ba

➜  docker rm 8f4c822f95ba
8f4c822f95ba

➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                 NAMES

실행(running)상태가 아닌 모든 컨테이너를 삭제하려면 아래와 같은 명령어를 사용한다. ps-q 옵션은 컨테이너 아이디 목록을 불러온다.

$ docker rm `docker ps -a -q`
➜  docker stop `docker ps -a -q`
44bd0e9bd9b8
07c50f2b35da
94dec09b8e34
999c55f53435
ee2ae07ba493
84ad43699b9a
7d7d05246025

사용하지 않는 모든 리소스를 없애려면 아래 명령어를 사용한다. 실행(running) 상태의 컨테이너가 사용하는 리소스는 삭제하지 않는다.

$ docker system prune
➜  docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
44bd0e9bd9b85a4cbdece60abc201c4fd4e6b249b2d49a4611be61bc6ffe7ef6
999c55f534356c243ce2c3d6a4b418ddca267d90931148c69402d8f31f7fef0a

Total reclaimed space: 0

출처

인프런 [따라하며 배우는 도커와 CI환경]