学习停止一个正在运行的容器,要求学习者参照示例将正在运行的名为firstContainer
的容器停止。
相关知识
使用docker stop停止一个容器
docker stop
可以用来终止一个正在运行的容器。它的命令格式如下:
- docker stop [OPTIONS]
其中:
docker stop
:Docker
停止容器的命令关键词;OPTIONS
:命令选项,其中-t
指定等待多少秒后如果容器还没终止,就强行停止,默认等待10
秒;Container
:需要启动的容器,该容器用"容器ID
"或"容器名"表示,如果指定了多个容器,那么就将这些容器都启动。
例如想要停止一个名为firstContainer
的容器,可以这么执行docker stop firstContainer
。该命令执行完之后,firstContainer
将会处于终止状态。而上一节我们谈到过,终止状态的容器,可以使用docker ps --a
查看到。
实际工作中,执行docker stop
可能并不会立即终止容器,而是需要等待一段时间。前面我们说过,容器实际上是一个进程。而执行docker stop
之后,首先会向容器的主进程发送一个SIGTERM
信号,让主进程释放资源保存状态,尝试自己终止。但当等待时间超过了-t
设置的时间后,会向容器的主进程发送一个SIGKILL
信号,使容器立即终止。
在什么情况下容器启动后会立即终止?
实际情况中,除了使用docker stop
命令来强制地终止一个容器以外,当容器的启动命令终结时,容器也自动会终止。
以docker run --name testcontainer ubuntu echo 'hello docker'
为例,echo 'hello docker'
就是该容器的启动命令。实际上执行完这条命令后,执行docker ps -a
,可以发现testcontainer
容器是处于终止状态的,如下图所示:
linenums
- [root@localhost Desktop]# docker run --name testcontainer ubuntu echo 'hello docker'
- hello docker
- [root@localhost Desktop]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- da14116bf641 ubuntu "echo 'hello docker'"
前面我们说过,在容器启动时,会执行容器的启动命令。而执行上述命令创建并启动容器后,由于容器的启动命令echo 'hello docker'
会立刻执行完毕,所以容器也随之终止,因此使用docker ps -a
查看该容器的状态是终止状态。
现在你应该明白上一关中,为什么docker start ee826f1d58ff
去启动第一个实例的容器,然后使用docker ps
查看,会看不到该容器了吧?
之前我们介绍过Docker
容器是一个进程,实际上它以sh
作为主进程。如果主进程停止了,那么容器也就停止了。而如果容器的"启动命令"执行完之后,由于主进程没有命令继续执行,所以主进程会停止,容器也就因此而停止了。
如何才能使容器启动后不立即终止?
如果容器的sh
主进程不停止,是不是以为这容器就不会停止?答案是肯定的。因此,如果使启动命令不能执行完毕,或者在执行完启动命令后,容器的sh
主进程不停止,那么容器在启动后就不会立即终止了!
下面举两个能使容器启动后不立即停止的例子:
将启动命令设置为死循环
1. docker run ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
这条命令在创建并启动容器之后,会执行/bin/sh -c "while true; do echo hello world; sleep 1; done"
,由于该命令永远都不会执行完毕,除非强行终止,所以容器的主进程sh
不会停止,因此容器也将不会停止。但是这样的做的话,无法正常的操作容器,而且它会占据资源,所以这种做法在实际的工作中意义并不大。
将启动命令设置为"启动一直运行的子进程"
2. docker run --name first_container -it ubuntu /bin/bash
。
执行完这条命令后,创建并启动容器之后,执行/bin/bash
,会启动一个子进程,此时父进程(也就是容器的主进程sh
)会进入sleep
状态,由于sleep
状态不是终止状态,所以容器会继续运行。
为什么在容器中输入exit
或者执行ctrl D
后,容器将会终止呢,这是因为exit
会退出(结束)当前进程,也就是/bin/bash
,由于子进程结束,sh
主进程恢复到运行态,然而由于没有命令需要继续执行,所以sh
主进程结,因此容器终止。
任务要求
本关的编程任务是补全step4/stopcontainer.sh
文件中的内容,要求停止一个正在运行的的容器。具体要求如下:
- 将一个正在运行的名为"
firstContainer
"的容器停止;
本关涉及的代码文件step4/stopcontainer.sh
的代码框架如下:
#!/bin/bash
#注意如果想在右侧使用命令行模拟操作,请先输入
#service docker start
#否则将不能执行docker命令
#以ubuntu镜像为基础,创建并在后台启动了一个名为firstContainer的容器(-d看不懂没关系,下一关会介绍的)
#拉取ubutun 最新镜像,实际生产中,docker pull ubutun可以省略,docker run的时候会自己去拉取。
docker pull ubuntu
docker run -itd --name firstContainer ubuntu /bin/bash
#将firstContainer容器停止!
#********** Begin *********#
docker stop firstContainer
#********** End **********#