Docker容器1号进程问题

本文解析了容器中1号进程的概念及其重要性,并探讨了如何通过不同方式设置1号进程来实现容器的优雅关闭。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

king config

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值