内容摘要

  • 运行容器
  • 查询容器
  • 停止/启动/重启容器

运行容器

在容器环境安装好后,可以运行容器,先体验下容器的基本功能。

使用Xshell登陆阿里云上安装好的虚拟机。

首先检验容器是否正常,命令为:

systemctl status docker




docker pip 使用 docker pwd_docker


如果出现图中红框内容,那么说明docker运行正常。

下面运行一个简单的容器,命令为:

docker run centos pwd


docker pip 使用 docker pwd_docker_02


说明:

1、运行容器命令格式为:docker run 镜像名 命令,上面的容器镜像为centos,容器执行命令为pwd;

注意:容器镜像后面再介绍,现在大家可以认为镜像就是一个应用,比如centos,mysql;

2、操作是说在容器运行时执行的指令,该指令在容器中运行,这里只是简单的运行pwd,获取当前目录;

3、“/”是pwd命令运行的结果,说明该容器当前的工作目录为根目录;


查看刚才运行的容器,命令:

docker ps


docker pip 使用 docker pwd_centos_03


没有看到任何运行的容器。

新增参数 -a,再次查询容器,命令:

docker ps -a


docker pip 使用 docker pwd_docker pip 使用_04


这次可以看到刚才运行的容器了,那么为什么 docker ps 无法查询呢?

请大家看下 STATUS 列,状态为 Exited ,可见 docker ps无法查询状态为 Exited 的容器。

-a ,就是 all 的简写,意思就是查询所有容器。


问题:centos容器运行感觉很快,执行完 pwd 命令后,就退出了,那么如何才能让 centos 容器一直运行,不退出呢?

容器运行时间长短取决于启动时执行的命令,只要命令没有执行完,容器就不会退出。比如 centos 容器执行的 pwd 命令执行的就很快,所以容器很快就结束了。

下面我们重新运行该容器,修改容器执行命令,让容器一直运行下去,命令为:

docker run centos /bin/bash -c "while true; do sleep 5; echo hello docker; done"


docker pip 使用 docker pwd_docker_05


命令为while循环的脚本,每隔5秒打印“hello docker”字段。重新打开一个终端,查询容器:


docker pip 使用 docker pwd_centos_06


可以看到STATUS列变为“Up”。


不过上面运行的容器有一个缺点:占用了一个终端

可以使用 -d 参数运行容器,-d 就是daemon,以后台方式运行容器,命令为:

docker run -d centos /bin/bash -c "while true; do sleep 5; echo hello docker; done"


docker pip 使用 docker pwd_docker pip 使用_07


使用docker ps -a 查询容器


docker pip 使用 docker pwd_重启_08


查询信息说明:

CONTAINER ID:容器的短ID,长ID为上面倒数第2个图中输出的结果,即:0c359919ff481a03a035c10c96db7d79ea8ebf2c35860f5fcd51b8367e867e00

短ID为长ID前12个字符。

IMAGE:容器镜像名称;

COMMAND:容器启动执行的命令,这里就是while循环;

CREATED:创建时间;

STATUS:容器状态,后面在容器生命周期一节介绍;

PORTS:容器端口,在容器网络章节中介绍;

NAMES:容器名称,随机生成,注意容器名称和容器镜像名称不一样;


可以在容器运行时指定名称,使用 --name 参数,命令为:

docker run -d --name mycentos centos /bin/bash -c "while true; do sleep 5; echo hello docker; done"


docker pip 使用 docker pwd_重启_09


可见在NAMES列,名称变为自己设置的 "mycentos"。


查询容器

上面已经使用了docker ps 命令查询容器,输出的是简要的信息,那么如何查询容器的详细信息呢?

命令:

docker inspect 容器ID/容器名


docker pip 使用 docker pwd_docker pip 使用_10


查询出来的信息相当多,这里就不完全展示了,大家可以在实验中进行观察。


停止/启动/重启容器

停止容器,命令为:

docker stop 容器ID/容器名


docker pip 使用 docker pwd_docker pip 使用_11


容器停止后,状态变为"Exited"。

docker stop无法立即停止容器,容器相当于一个进程,stop命令本质是向该进程发送了一个SIGTERM信号。如果想立即停止容器,可以使用docker kill 命令,其本质是向容器进程发送SIGKILL信号。


docker pip 使用 docker pwd_五分钟没有操作自动退出_12



容器停止后,启动容器 ,命令为:

docker start 容器ID/容器名


docker pip 使用 docker pwd_docker pip 使用_13


可以看到,刚才停止的容器又启动了,状态变为“Up”。


重启状态为“Up”的容器,重启操作相当于stop + start,命令为:

docker restart 容器ID/容器名


docker pip 使用 docker pwd_docker_14


注意:可以观察下start和restart操作后,查询容器结果的COMMAND列以及NAMES等列,可以发现这两个操作保留了第一次启动容器的所有参数。


问题:容器如果发生错误会停止运行,那么如何才能保证容器自动重启呢?

使用 --restart=always 运行容器,命令为:

docker run -d --restart=always centos /bin/bash -c "sleep5"


docker pip 使用 docker pwd_docker_15


容器运行 "sleep 5" 命令,每隔5秒重启。大家可以观察STATUS列,容器启动了4次,睡眠5秒后,又不断重启。

容器每次退出都是执行完 sleep 5命令后执行的,是正常退出。这也意味着:

--restart=always 参数表示容器无论是否正常退出,都会重启。


问题:对于自动重启的容器使用 docker stop 命令会如何表现呢?


docker pip 使用 docker pwd_centos_16


可以看到 docker stop 命令是有效的,观察STATUS列,可以看到容器没有重启了,状态一直为“Exited”。


问题:能否限制容器重启次数呢?

使用 --restart=on-failure:3参数,表示如果启动进程退出代码非0,则重启,最多重启3次,反之,不重启,命令为:

docker run -d --restart=on-failure:3 centos /bin/bash -c "sleep5"


docker pip 使用 docker pwd_五分钟没有操作自动退出_17


可以看到,容器运行完后,没有重启,这是因为退出代码为0,正常退出,所以没有重启。


如果容器运行指令退出码非0,修改命令为:

docker run -d --restart=on-failure:3 centos /bin/bash -c "sleep5; exit 1"


docker pip 使用 docker pwd_centos_18


将容器执行命令变为:sleep5; exit 1,这样该命令退出码变为1。

结合CREATED和STATUS两列可以看出容器在重启3次后,就没有重启了,状态变为"Exited"了。


这节就讲到这里了,请大家按照本节的内容,在阿里云ECS服务器上做实验。


实验

  • 运行容器
  • 查询容器
  • 停止/启动/重启容器