容器生命周期
容器的生命周期是容器可能处于的状态,主要有以下五种:
● created:初建状态
● running:运行状态
● stopped:停止状态
● paused:暂停状态
● deleted:删除状态
容器操作
初建启动容器
通过
docker create
命令创建的容器是处于初建状态的,需要通过docker start
命令来启动初建容器;当然我们也可以通过docker run
命令一步完成容器的初建与启动。
当使用 docker run 创建并启动容器时,Docker 后台执行的流程为:
● Docker 会检查本地是否存在 busybox 镜像,如果镜像不存在则从 Docker Hub 拉取 busybox 镜像;
● 使用 busybox 镜像创建并启动一个容器;
● 分配文件系统,并且在镜像只读层外创建一个读写层;
● 从 Docker IP 池中分配一个 IP 给容器;
● 执行用户的启动命令运行镜像。
$ docker create -it --name=mybb busybox
$ docker ps -a | grep mybb
2c2e919c2d66 busybox "sh" 33 seconds ago Created mybb
$ docker start mybb
等同于
$ docker run -it --name=mybb busybox
终止容器
容器启动后,如果我们想停止运行中的容器,可以使用
docker stop
命令,命令格式为docker stop [-t|--time[=10]]
。该命令首先会向运行中的容器发送 SIGTERM 信号,如果容器内 1 号进程接受并能够处理 SIGTERM,则等待 1 号进程处理完毕后退出,如果等待一段时间后,容器仍然没有退出,则会发送 SIGKILL 强制终止容器。
$ docker stop mybb
$ docker ps -a
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c2e919c2d66 busybox "sh" 26 minutes ago Exited (137) About a minute ago mybb
$ docker start mybb
等同于
$ docker restart mybb
进入容器
处于运行状态的容器,可以通过
docker attach
、docker exec
、nsenter
等多种方式进入容器。
●docker attach
:当我们同时使用该命令同时在多个终端运行时,所有的终端窗口将同步显示相同内容,当某个命令行窗口的命令阻塞时,其他命令行窗口同样也无法操作,而且退出不当会导致容器停止,组合键Ctrl + p + q
才能无损退出。
●docker exec
:推荐使用,该命令更加灵活方便,可以通过docker exec -it CONTAINER
方式进入运行中的容器,主要是通过在容器启多一个 sh 进程,保证每个窗口都是独立且互不干扰的,而且避免了退出不当导致容器停止的意外。
●nsenter
:生产环境上常用,当一些容器内的常规命令非常少,不利于快速分析问题时,使用该命令切换空间后就可以使用容器所在宿主机上的相关命令了;使用方式 nsenter -n -t `docker inspect --format "{{.State.Pid}}" 容器ID`。
$ docker attach 2c2e919c2d66
$ docker exec -it 2c2e919c2d66 sh
$ nsenter -n -t `docker inspect --format "{{.State.Pid}}" 2c2e919c2d66`
删除容器
删除容器的命令使用方式如下:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
。
如果要删除正在运行中的容器,需要带-f
参数,Docker 会先发送 SIGKILL 信号强制终止正在运行的容器并删除。
$ docker rm 2c2e919c2d66
$ docker rm -f 2c2e919c2d66
导出容器
可以使用
docker export CONTAINER
命令导出一个容器到文件,不管此时该容器是否处于运行中的状态。
$ docker export mybb > mybb.tar
导入容器
可以使用
docker import
命令导入并且指定导入的新镜像名称,执行完该命令后,之前导出的文件会变为本地新镜像,最后再使用 docker run 命令启动该镜像,这样就间接实现了容器的迁移。
$ docker import mybb.tar busybox:v1