Docker中容器 -d后台运行,为什么会自行关闭,而且不能再次start

一 不太熟悉docker的时候,守护模式[-d 选项] 运行测试官方image,偶尔会遇到运行了容器后,结果在活动容器里看不到的问题,只能增加 -a 选项查看全部状态的container 才可以。比如下面的例子

ubuntu@VM-4-10-ubuntu:~$ docker run -d --name tag1 ubuntu
133f42b7ff91affa40220928bcca987204562286f329cd657136475697b7815c
ubuntu@VM-4-10-ubuntu:~$ docker container ls
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
ubuntu@VM-4-10-ubuntu:~$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                      PORTS     NAMES
133f42b7ff91   ubuntu    "bash"    14 seconds ago   Exited (0) 13 seconds ago             tag1

在网络上找了一个container状态的图【https://blog.csdn.net/duringsummer/article/details/122348742】,一共5种状态,转载如下:

4b1253ed87ad430dba23b21190541340.png

最重要的一个原因就是:这个容器里没有可运行的进程存在,所以被认为可以退出。

二 在这个链接地址,发现的一个解释

docker容器自动退出的原因是什么
https://www.php.cn/docker/490893.html

docker容器会自动退出的原因:
1、docker容器没有前台进程,容器会认为空闲,所以自动退出;
2、容器运行的命令不是一直挂起的命令(比如top、tail、循环等),所以会自动退出。

需要稍微修正一下,其实不管是前台进程,后台进程,都是一样的。如果后台进程也已经退出,且没有其他的前台/后台进程在活动中,则这个容器,就被认为可以退出。

三 这种具有空活动进程的容器,可以重新 start 吗?

答案是肯定的:可以。
但是为什么使用 docker container ls -a 查看,依然是 exited状态呢。

原因就是,重新start之后,容器再次退出了。

四 怎么确认这种空活动进程的容器再次启动了?可以加多一个sleep行为,观察一下

ubuntu@VM-4-10-ubuntu:~$ docker run -d --name tag1 ubuntu sleep 20
28dd80eaa8380340e34223a06060a702e73d2b1c8b62215dd979269a00d2a065
ubuntu@VM-4-10-ubuntu:~$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND      CREATED          STATUS          PORTS     NAMES
28dd80eaa838   ubuntu    "sleep 20"   16 seconds ago   Up 15 seconds             tag1
ubuntu@VM-4-10-ubuntu:~$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND      CREATED          STATUS                      PORTS     NAMES
28dd80eaa838   ubuntu    "sleep 20"   31 seconds ago   Exited (0) 10 seconds ago             tag1
ubuntu@VM-4-10-ubuntu:~$ docker container start tag1 #start重新启动
tag1
ubuntu@VM-4-10-ubuntu:~$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND      CREATED          STATUS         PORTS     NAMES
28dd80eaa838   ubuntu    "sleep 20"   46 seconds ago   Up 2 seconds             tag1
ubuntu@VM-4-10-ubuntu:~$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND      CREATED          STATUS         PORTS     NAMES
28dd80eaa838   ubuntu    "sleep 20"   51 seconds ago   Up 6 seconds             tag1
ubuntu@VM-4-10-ubuntu:~$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND      CREATED              STATUS                      PORTS     NAMES
28dd80eaa838   ubuntu    "sleep 20"   About a minute ago   Exited (0) 45 seconds ago             tag1

五 其他

5.1 在每次启动的container的时候,给容器自定义冠名,是一个好习惯,可以避免重复运行容器。也方便重新启动或停止。比如下面的例子就重复启动了。

ubuntu@VM-4-10-ubuntu:~$ docker run -d ubuntu
65f8aa55be79eb7f4c049c372f7eb722b1fbd210d4db74a0fdfe1c4c441ec4b5
ubuntu@VM-4-10-ubuntu:~$ docker run -d ubuntu
1bba099d243ac8b2be87b9dce5ce4b13b34eb737582f59329d7ac7055cf37a07
ubuntu@VM-4-10-ubuntu:~$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS                     PORTS     NAMES
1bba099d243a   ubuntu    "bash"    7 seconds ago   Exited (0) 6 seconds ago             sad_mahavira
65f8aa55be79   ubuntu    "bash"    9 seconds ago   Exited (0) 8 seconds ago             heuristic_keldysh
学海无涯,错误难免,如有发现,尽请指正。

--the end

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容