docker run 或者 docker restart 启动镜像就自动退出

执行命令:docker run --name centos8 -d centos /bin/bash,通过docker ps查看正在运行中容器,找不到centos8。通过docker ps -a查看发现,centos8容器已经处于停止状态了

[root@MiWiFi-R4A-srv server]$ docker run --name centos8 -d centos  /bin/bash
a770630ca865b3c3346a321a383f302ed22af9281be8482f4f4debc59218d0d1
[root@MiWiFi-R4A-srv server]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@MiWiFi-R4A-srv server]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
a770630ca865        centos              "/bin/bash"              37 seconds ago      Exited (0) 35 seconds ago                       centos8

为什么退出?

这是因为docker后台运行,必须有一个前台进程。docker运行的命令如果不是那些一直挂起的命令(e.g. top,ping),就是会自动退出的。而上面的代码中-d centos就是需要执行的指定的命令。命令如果执行完毕了或者应用终结时,容器会自动停止。

解决方法

以前台进程的形式运行

将运行的程序以前台进程的形式运行,如果容器需要同时启动多个进程,那么也只需要将其中一个挂起到前台即可。
比如上面所说的 centos 容器,只需要将启动指令修改为交互方式启动:

docker run --name centos8 -it centos  /bin/bash

又或者是Web容器:

service php5-fpm start && nginx -g "daemon off;"

取巧方式

添加类似于 tail top 这种可以前台运行的程序,持续输出log文件即可。

service nginx start && service php5-fpm start && tail -f /var/log/nginx/error.log

再以上面所说的 web 容器为例,可以写成:

service nginx start && service php5-fpm start && tail -f /var/log/nginx/error.log

自己写脚本

在启动centos/ubuntu容器时,可以做一个手脚:做一个死循环,持续输出任意,这样容器不会认为没事可做而自杀了。

docker run -d centos /bin/bash -c "while true; do echo hello world; sleep 1; done"

你可能感兴趣的:(Linux,全栈,经验分享,程序人生,linux,docker,centos)