1号进程是什么
当我们使用 /bin/bash 启动一个centos的容器
docker run -it --rm centos:7 /bin/bash
那么启动命令就是1号进程
[root@ded49b74042c /]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.2 0.0 11836 2952 pts/0 Ss 01:02 0:00 /bin/bash
root 16 0.0 0.0 51740 3528 pts/0 R+ 01:06 0:00 ps aux
这个/bin/bash是没有启动进程的权限的,应为启动进程必须是systemd 或者init 这就意味着,容器也会跟着这个进程的消亡而关闭
如何解决
将1号进程变成systemd
,这个方法需要提权,但是提权会使容器锁住,不建议这么做
docker run --restart always -d --name test --privileged centos:7 /usr/lib/systemd/systemd /sbin/init # 容器在遇到问题时尝试重启
当我们在写Dockerfile的时候,也可以这样写
CMD "usr/bin/mysql" # 这样起的一号进程是 /bin/sh -c "/usr/bin/mysqld"
CMD ["usr/bin/mysql"] # 这样起的一号进程是 /usr/bin/mysqld *:3306
当我们以第一种方式启动的容器,stop容器时候,他的第一进程是/bin/sh
所以,默认10秒后,应用将被强制杀死,可能会丢失数据
当我们以第二种方式启动的容器,stop容器的时候,应用先进行了关闭,随后才关闭容器,这样就可以"优雅"的关闭容器。