docker stop停止一个容器

学习停止一个正在运行的容器,要求学习者参照示例将正在运行的名为firstContainer的容器停止。

相关知识

使用docker stop停止一个容器

docker stop可以用来终止一个正在运行的容器。它的命令格式如下:

  1. docker stop [OPTIONS] Container [Container ...]

其中:

  • docker stopDocker停止容器的命令关键词;
  • 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 复制代码
  1. [root@localhost Desktop]# docker run --name testcontainer ubuntu echo 'hello docker'
  2. hello docker
  3. [root@localhost Desktop]# docker ps -a
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. da14116bf641 ubuntu "echo 'hello docker'" 6 seconds ago Exited (0) 4 seconds ago testcontainer

前面我们说过,在容器启动时,会执行容器的启动命令。而执行上述命令创建并启动容器后,由于容器的启动命令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 **********#
相关推荐
雪域迷影1 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
莹雨潇潇2 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
tangdou3690986556 小时前
Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)
docker·容器
漫无目的行走的月亮9 小时前
在Docker中运行微服务注册中心Eureka
docker
大道归简12 小时前
Docker 命令从入门到入门:从 Windows 到容器的完美类比
windows·docker·容器
zeruns80212 小时前
如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程
linux·运维·服务器·docker·网站
爱跑步的程序员~12 小时前
Docker
docker·容器
疯狂的大狗13 小时前
docker进入正在运行的容器,exit后的比较
运维·docker·容器
长天一色13 小时前
【Docker从入门到进阶】01.介绍 & 02.基础使用
运维·docker·容器
伊玛目的门徒13 小时前
docker 搭建minimalist-web-notepad
运维·docker·notepad