提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


文章目录

  • 前言
  • 1.任务详情
  • 2.相关知识
  • 使用docker stop停止一个容器
  • 在什么情况下容器启动后会立即终止?
  • 如何才能使容器启动后不立即终止?
  • 将启动命令设置为死循环
  • 将启动命令设置为“启动一直运行的子进程”
  • 3.任务要求
  • 4.笔者答案
  • 总结



前言

Docker基础实战教程一:入门
四、 停止一个容器


提示:以下是本篇文章正文内容,下面案例可供参考

1.任务详情

在日常的Docker工作学习中,有些时候需要停止某个容器。例如有一个运行着Java程序的容器,它占用的资源过多了,那么如何停止一个容器呢?

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

2.相关知识

使用docker stop停止一个容器

docker stop可以用来终止一个正在运行的容器。

例如想要停止一个名为firstContainer 的容器,可以这么执行
docker stop firstContainer。该命令执行完之后,firstContainer将会处于终止状态。而上一节我们谈到过,终止状态的容器,可以使用docker ps –a查看到。

在什么情况下容器启动后会立即终止?

实际情况中,除了使用docker stop命令来强制地终止一个容器以外,当容器的启动命令终结时,容器也自动会终止。

docker run --name testcontainer ubuntu echo 'hello docker'为例,echo 'hello docker'就是该容器的启动命令。实际上执行完这条命令后,执行docker ps -a,可以发现testcontainer容器是处于终止状态的,如下图所示:

[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'"    6 seconds ago       Exited (0) 4 seconds ago                       testcontainer

前面我们说过,在容器启动时,会执行容器的启动命令。而执行上述命令创建并启动容器后,由于容器的启动命令echo 'hello docker'会立刻执行完毕,所以容器也随之终止,因此使用docker ps -a查看该容器的状态是终止状态。

如何才能使容器启动后不立即终止?

如果容器的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主进程结,因此容器终止。

3.任务要求

本关的编程任务是补全step4/stopcontainer.sh文件中的内容,要求停止一个正在运行的的容器。具体要求如下:

  • 将一个正在运行的名为“firstContainer”的容器停止;

4.笔者答案

#!/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 **********#

核心代码

service docker start
docker pull ubuntu
docker run -itd --name firstContainer ubuntu /bin/bash
#将firstContainer容器停止!
docker stop firstContainer

运行截图

DOCKER 停止 自启动 docker停止container_ubuntu

总结

Docker基础实战教程一:入门
四、 停止一个容器