如何理解容器状态

时间:2019-04-12 17:19:30

标签: docker

我试图了解容器的生命周期。下载高山图像,使用“ docker container run”命令构建容器,所有这些容器均已运行且处于“已退出”状态。使用“ docker container start”命令时,某些容器处于启动状态(正在运行),而某些或立即退出。关于为什么这种行为围绕状态的差异有何想法?我观察到的一个区别是,相对于基础映像中的文件结构,修改了处于启动状态的容器。

希望我能够将场景与适当的上下文放在一起。帮助我理解概念。

1 个答案:

答案 0 :(得分:1)

长序列如下:

  1. docker create具有各种设置的容器。某些设置可能会从基础图像继承。它处于“已创建”状态;其文件系统存在,但没有任何运行。
  2. docker start容器。如果容器具有入口点(Dockerfile ENTRYPOINT指令,docker create --entrypoint选项),则该入口点将以命令作为参数运行;否则,将直接运行命令(Dockerfile CMD指令,docker create映像名称之后的任何选项)。此过程在容器中获取过程ID 1,并附带相应的权利和责任。容器处于“运行”状态。
  3. 退出主进程,或者管理员明确docker stop对其进行管理。容器处于“退出”状态。
  4. (可选)您可以重新启动已停止的容器(IME,这是不常见的);转到步骤2。
  5. docker rm已停止的容器。容器文件系统中的所有内容都会永久丢失,并且不再显示在docker ps -a或其他任何地方。

通常,您将使用docker run将这些步骤组合在一起。 docker run单独执行前两个步骤(创建一个容器,然后启动它)。如果您docker run --rm会执行上面列出的所有操作。

(所有这些命令都与docker container ...命令相同,但我习惯使用稍短的形式。)

这里的关键是容器运行着一些主要过程。通常,这是某种守护程序或服务器进程,通常在映像的Dockerfile中指定。例如,如果您是docker run ... nginx,则是its Dockerfile ends with

CMD ["nginx", "-g", "daemon off;"]

这成为主要的容器过程。

在早期探索中,仅运行一些基本分发映像(docker run --rm -it alpine)是很常见的,但这并不是很有趣:生命周期序列的结尾是删除容器,一旦这样做,容器中的所有内容都会丢失。在标准用法中,您需要使用Dockerfile来构建自定义图像,并且在主题上有pretty good Docker tutorial