docker container 的生命周期
当我们创建一个 container 的时候, 它的生命过程中都会经历哪几个阶段呢? 有时候明明一个 container 已经死了, 我们去创建一个同名 container 的时候, 它竟然说有一个同名的 container 存在? 明白了 container 的生命周期, 就能理解了.
container 的生命阶段
一个 docker container 从创建到彻底消亡, 可能会经过的阶段:
- created: container 被创建, 但是没有被启动
- running: container 被启动, 里面的进程在运行
- paused: container 里的所有进程被挂起, 暂停运行
- stopped: container 里面的进程被杀死, container 还存在
- deleted: container 被彻底删除
下面我们就以 nginx 做container 为例来说明这个过程.
create
创建 container
下面创建一个 nginx container, 并使用 ps -l (--latest) 来查看, 状态是 Created.
supra@suprabox:~$ docker create --name nginxServer nginx
ac301e1f4f3f3ba5631ff5d7f3276d1544610229a9e3727dac6d5f66181bfe05
supra@suprabox:~$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac301e1f4f3f nginx "/docker-entrypoint.…" 1 minutes ago Created nginxServer
start
启动 container
通过start
子命令启动 container, 然后通过ps
子命令查看状态. 通过exec
子命令写一句话到/text.txt
文件, 并且查看写入内容.
supra@suprabox:~$ docker start nginxServer
nginxServer
supra@suprabox:~$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac301e1f4f3f nginx "/docker-entrypoint.…" 25 minutes ago Up 5 seconds 80/tcp nginxServer
supra@suprabox:~$ docker exec nginxServer bash -c 'echo "this is a test" > /test.txt'
supra@suprabox:~$ docker exec nginxServer cat /test.txt
this is a test
pause
暂停 container
可以看到经过 pause 之后, 状态变为 Paused. 如果尝试进入这个 container exec, 这个时候会报错.
supra@suprabox:~$ docker pause nginxServer
nginxServer
supra@suprabox:~$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac301e1f4f3f nginx "/docker-entrypoint.…" 29 minutes ago Up 4 minutes (Paused) 80/tcp nginxServer
supra@suprabox:~$ docker exec -it nginxServer bash
Error response from daemon: Container nginxServer is paused, unpause the container before exec
unpause
继续 container
supra@suprabox:~$ docker unpause nginxServer
nginxServer
supra@suprabox:~$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac301e1f4f3f nginx "/docker-entrypoint.…" About an hour ago Up 44 minutes 80/tcp nginxServer
stop
停止 container
stop 之后, 通过docker ps -l
可以看到状态变为 Exited, 这个时候通过docker logs
仍旧能看到之前的log, 并且可以看到主进程被杀死的日志. 但是通过docker exec
已经无法进入 container.
supra@suprabox:~$ docker stop nginxServer
nginxServer
supra@suprabox:~$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac301e1f4f3f nginx "/docker-entrypoint.…" About an hour ago Exited (0) 8 seconds ago nginxServer
supra@suprabox:~$ docker logs -f nginxServer
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
...
2023/01/27 13:35:52 [notice] 1#1: signal 17 (SIGCHLD) received from 32
2023/01/27 13:35:52 [notice] 1#1: worker process 32 exited with code 0
2023/01/27 13:35:52 [notice] 1#1: worker process 37 exited with code 0
2023/01/27 13:35:52 [notice] 1#1: exit
supra@suprabox:~$ docker exec -it nginxServer bash
Error response from daemon: Container ac301e1f4f3f3ba5631ff5d7f3276d1544610229a9e3727dac6d5f66181bfe05 is not running
start
重新启动 stop 的 container
通过 start 子命令, 可以重新启动 stop 的container, 通过docker ps -l
可以看到它的状态是刚起来4秒. 这时候去查看之前写入的 /test.txt 文件, 内容还在. 但是这时候里面的进程都是新启动的, 不说 stop 之前的那个(批)进程了.
supra@suprabox:~$ docker start nginxServer
nginxServer
supra@suprabox:~$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac301e1f4f3f nginx "/docker-entrypoint.…" About an hour ago Up 4 seconds 80/tcp nginxServer
supra@suprabox:~$ docker exec nginxServer cat /test.txt
this is a test
rm
彻底删除container
可以通过rm
子命令删除任何状态的container. 如果一个container 是 stopped 或 created 状态的, 可以直接rm
, 否则就必须通过 -f
强制删除.
docker rm nginxServer
docker rm -f nginxServer
run
创建同时启动container
可以通过 run
子命令, 在创建container的同时, 启动container, 相当于同时执行了create
和start
.
supra@suprabox:~$ docker run --name nginxServer1 --rm nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
kill
杀掉一个运行的container
通过kill
杀掉一个运行的container 之后, container 进入 stopped 的状态.
supra@suprabox:~$ docker kill nginxServer
nginxServer
supra@suprabox:~$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac301e1f4f3f nginx "/docker-entrypoint.…" 2 hours ago Exited (137) 18 seconds ago nginxServer