容器生命周期

容器的生命周期是容器可能处于的状态,主要有以下五种:
● created:初建状态
● running:运行状态
● stopped:停止状态
● paused:暂停状态
● deleted:删除状态

docker volume create参数详解 docker created_2d


容器操作

初建启动容器

通过 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 attachdocker execnsenter 等多种方式进入容器。
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