Docker容器1号进程问题

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容器的时候,应用先进行了关闭,随后才关闭容器,这样就可以"优雅"的关闭容器。

经验分享 程序员 微信小程序 职场和发展