我试图了解容器的生命周期。下载高山图像,使用“ docker container run”命令构建容器,所有这些容器均已运行且处于“已退出”状态。使用“ docker container start”命令时,某些容器处于启动状态(正在运行),而某些或立即退出。关于为什么这种行为围绕状态的差异有何想法?我观察到的一个区别是,相对于基础映像中的文件结构,修改了处于启动状态的容器。
希望我能够将场景与适当的上下文放在一起。帮助我理解概念。
答案 0 :(得分:1)
长序列如下:
docker create
具有各种设置的容器。某些设置可能会从基础图像继承。它处于“已创建”状态;其文件系统存在,但没有任何运行。docker start
容器。如果容器具有入口点(Dockerfile ENTRYPOINT
指令,docker create --entrypoint
选项),则该入口点将以命令作为参数运行;否则,将直接运行命令(Dockerfile CMD
指令,docker create
映像名称之后的任何选项)。此过程在容器中获取过程ID 1,并附带相应的权利和责任。容器处于“运行”状态。docker stop
对其进行管理。容器处于“退出”状态。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。