docker 容器启动后为什么就停止了

2019-03-06 0 By admin

Docker 容器启动后,默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据。
如果docker 容器pid=1进程挂了,那么docker容器便会直接退出。这样的话,如果我们在前台维持一个运行的进程,docker 容器就会一直处于运行的状态中。

一、常见的运行状态说明

前提说明:这里使用的Docker 镜像centos 和 nginx 都是直接从官网仓库pull获取的。

1.1、交互式bash

docker run -itd centos /bin/bash
其中的运行参数:-i :交互式启动,-t:为容器分配一个伪输入终端。
猜测它们都可以将/bin/bash命令的输入端重定向,进而维持进程在前台运行,使容器在运行的状态中。
启动服务
在容器维持在/bin/bash的运行状态的情况下,使用exec或者attach选项登录并管理容器;这时候在容器内部启动其他服务(如nginx、httpd等);这样的话,也可以容器内部运行服务,实现我们的需求。
不过这样的话,容器的第一个进程(pid=1)是/bin/bash;容器中实际上应该是维护了两个进程;这样部署和容器设计理念不合。

1.2、服务前台运行

docker run -d nginx
Docker nginx镜像设置了容器启动时运行nginx -g "daemon off;"。这样的话,创建的容器中的第一个进程是nginx主进程服务,并且设置了前台运行。
如果没有使用参数设定Nginx服务进程前台运行的话,那么容器启动后,就会立即停止。
使用这种方法创建镜像的话,更能保证容器中运行的进程服务唯一性;没有其他多余的服务进程。