我看到这个问题是关于docker run imagename
命令的。
简而言之:您没有看到Docker容器,因为Docker容器已经创建、启动,然后立即退出。为什么?因为这完全取决于在用于构建您正在尝试运行的Docker镜像(在本例中为ubuntu
Docker镜像)的Dockerfile
中给出的CMD
命令。
关于Docker和
docker run
命令的一些背景信息:-
在您的情况下,当您运行
docker run ubuntu
命令时,Docker容器被创建并启动,然后立即退出,因此您无法在
docker ps
容器列表中看到它,但是您可以在
docker ps -a
命令结果中看到具有
exited
状态。
这是因为容器旨在运行特定的任务或进程,例如托管Web服务器或应用程序服务器或数据库的实例,或仅执行某种计算或分析。
完成任务后,容器将退出。容器只在其中的进程存活期间存在。如果容器内的WebService停止或崩溃,那么容器将退出。
那么是谁定义了在容器内运行什么进程呢?
如果我们查看像nginx这样的流行Docker镜像的dockerfile,我们会看到一个称为
CMD
的指令,该指令代表在容器启动时将运行哪个程序。
对于nginx镜像,它是nginx命令,对于mysql镜像,它是mysqld命令。
早些时候你尝试运行一个带有Ubuntu镜像的容器,如果我们查看该镜像的dockerfile(
Ubuntu Docker image's dockerfile),就会看到它在
CMD
行中使用
bash
作为默认命令。现在
bash
并不像Web服务器或数据库服务器一样是一个进程。它是一个监听来自终端的输入的shell,如果找不到终端,它就会退出。因此,当您先前运行镜像时,Docker从镜像创建了一个容器并启动了bash程序。默认情况下,当Docker运行容器时,它不会连接终端,因此bash程序找不到终端,就会退出。由于在创建容器时启动的进程已经结束,所以容器也会退出。
那么我们该如何指定启动容器的不同命令呢?
一种方法是在 docker run 命令中附加一个命令,这样就可以覆盖镜像中指定的默认命令。例如:docker run ubuntu sleep 5
,将 sleep 5 命令添加为选项。这样,当容器启动时,它将运行 sleep 程序,等待 5 秒钟,然后退出。但是我们如何使此更改永久化呢?假设我们希望镜像在启动时始终运行 sleep 命令。那么我们应该从基础的 ubuntu 镜像创建自己的镜像,并指定一个新的命令。
Dockerfile 中使用 CMD
指令。
FROM Ubuntu
CMD sleep 5
使用Entrypoint
和CMD
指令哪个更好?
FROM Ubuntu
ENTRYPOINT ["sleep"]
CMD ["5"]
现在我们可以使用docker build
命令构建新的镜像,并将其命名为ubuntu-sleeper或类似的名称。现在,我们只需运行docker run ubuntu-sleeper
命令,就可以获得相同的结果,它总是会睡眠5秒钟然后退出。
ls
命令,但该容器会立即关闭。 - daniuls /
,然后立即关闭docker容器? - firstpostcommenterdocker ps -a
列出所有容器。现在你只能得到“正在运行”的容器。@daniu 是正确的,因为只要 PID=1 的进程在运行,容器就会一直运行。ls
运行然后退出,这使得容器进入“已退出”状态。更多信息请参见:https://dev59.com/vlwY5IYBdhLWcg3wnYx3 - tgogosdocker run
命令始终与 ImageID 有关,而不是 containerID,这意味着它将始终启动一个新的容器。https://dev59.com/gFsW5IYBdhLWcg3wm4QK#46138763 - firstpostcommenter