我试图了解容器的生命周期。下载 alpine 镜像,使用“docker container run”命令构建容器,所有这些容器都运行并处于“Exited”状态。在使用“docker container start”命令时,一些容器处于启动状态(正在运行),一些容器或立即退出。关于为什么围绕状态的这种行为存在差异的任何想法?我观察到的一个区别是,保持启动状态的容器根据基本映像的文件结构进行了修改。
希望我能够将场景与适当的背景联系起来。帮助我理解这个概念。
我试图了解容器的生命周期。下载 alpine 镜像,使用“docker container run”命令构建容器,所有这些容器都运行并处于“Exited”状态。在使用“docker container start”命令时,一些容器处于启动状态(正在运行),一些容器或立即退出。关于为什么围绕状态的这种行为存在差异的任何想法?我观察到的一个区别是,保持启动状态的容器根据基本映像的文件结构进行了修改。
希望我能够将场景与适当的背景联系起来。帮助我理解这个概念。
长序列如下:
docker create
是一个具有各种设置的容器。某些设置可能继承自底层图像。它处于“已创建”状态;它的文件系统存在,但没有运行。docker start
是容器。如果容器有一个入口点(DockerfileENTRYPOINT
指令,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
,则其 Dockerfile 以
CMD ["nginx", "-g", "daemon off;"]
这成为主要的容器进程。
docker run --rm -it alpine
在早期的探索中,只运行一些基本的分发镜像(在标准使用中,您希望使用Dockerfile来构建自定义映像,并且有一个关于该主题的非常好的 Docker 教程。