赞
踩
在日常的Docker工作学习中,有些时候需要停止某个容器。例如有一个运行着Java程序的容器,它占用的资源过多了,那么如何停止一个容器呢?
本关的任务是学习停止一个正在运行的容器,要求学习者参照示例将正在运行的名为firstContainer的容器停止。
docker stop可以用来终止一个正在运行的容器。它的命令格式如下:
docker stop [OPTIONS] Container [Container …]
其中:
例如想要停止一个名为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容器是处于终止状态的,如下图所示:
前面我们说过,在容器启动时,会执行容器的启动命令。而执行上述命令创建并启动容器后,由于容器的启动命令echo 'hello docker’会立刻执行完毕,所以容器也随之终止,因此使用docker ps -a查看该容器的状态是终止状态。
现在你应该明白上一关中,为什么docker start ee826f1d58ff去启动第一个实例的容器,然后使用docker ps查看,会看不到该容器了吧?
之前我们介绍过Docker容器是一个进程,实际上它以sh作为主进程。如果主进程停止了,那么容器也就停止了。而如果容器的“启动命令”执行完之后,由于主进程没有命令继续执行,所以主进程会停止,容器也就因此而停止了。
如果容器的sh主进程不停止,是不是以为这容器就不会停止?答案是肯定的。因此,如果使启动命令不能执行完毕,或者在执行完启动命令后,容器的sh主进程不停止,那么容器在启动后就不会立即终止了!
下面举两个能使容器启动后不立即停止的例子:
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不会停止,因此容器也将不会停止。但是这样的做的话,无法正常的操作容器,而且它会占据资源,所以这种做法在实际的工作中意义并不大。
docker run --name first_container -it ubuntu /bin/bash。
执行完这条命令后,创建并启动容器之后,执行/bin/bash,会启动一个子进程,此时父进程(也就是容器的主进程sh)会进入sleep状态,由于sleep状态不是终止状态,所以容器会继续运行。
为什么在容器中输入exit或者执行ctrl D后,容器将会终止呢,这是因为exit会退出(结束)当前进程,也就是/bin/bash,由于子进程结束,sh主进程恢复到运行态,然而由于没有命令需要继续执行,所以sh主进程结,因此容器终止。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。