docker - 如何理解容器状态

标签 docker

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

希望我能够在适当的情况下提出方案。帮助我理解概念。

最佳答案

长序列如下:

  • docker create 具有各种设置的容器。某些设置可能是从基础图像继承的。它处于“已创建”状态;它的文件系统存在,但没有任何运行。
  • docker start 容器。如果容器有一个入口点(Dockerfile ENTRYPOINT指令,docker create --entrypoint选项),则该入口点将以命令作为参数运行;否则,将直接运行命令(Dockerfile CMD指令,docker create镜像名称后的任何选项)。此过程在容器中获取过程ID 1,并附带相应的权利和责任。容器处于“运行”状态。
  • 主进程退出,或管理员显式 docker stop 退出。容器处于“退出”状态。
  • (可选)您可以重新启动已停止的容器(IME,这是不常见的);转到步骤2。
  • 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

    关于docker - 如何理解容器状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55656753/

    相关文章:

    javascript - 如何在nodeJS应用程序中访问docker ENV变量

    java - Docker - 在 Java 应用程序中获取绑定(bind)端口

    docker - 在Windows 7上升级docker-compose版本

    docker - gitlab-ci 构建 asp.net core docker

    docker - ARG 或 ENV,在这种情况下使用哪一个?

    docker - 为什么我的 docker-cmd 不能用 sh 执行?

    amazon-web-services - 将实例注册到 AWS ECS 集群

    linux - docker restart,exit命令,重启宿主机

    azure - docker 图像和图层如何工作?

    docker - 如何创建具有自定义根卷大小的 docker 容器?