docker daemon 后台进程重启,而不引起容器关闭

本文介绍在CentOS 7.5环境下,通过修改Docker配置文件中的live-restore参数,实现Docker后台进程重启时,容器仍能保持运行的方法,避免因重启导致的重要测试中断。

场景

在使用docker时,可能会修改一些配置参数,有些参数修改后,是需要重启docker 后台进程 daemon 才能生效的,但是docker 后台进程重启后,可能会造成正在运行的容器强制关闭。如果容器正在跑着重要的测试,这样就不太方便了。所以,有必要了解一下如何使docker 后台进程在重启的情况下,容器不会强制关闭,保持运行。

环境

centos 7.5.1804
docker 19.03.6-ce

修改docker 配置文件

vim  /etc/docker/daemon.json
{
    "live-restore": true
}

在这里插入图片描述
如果 “live-restore”: true 不是在最后一行,需要添加 ,

<think> 我们讨论了容器启动后立即退出的原因,现在用户明确需求:让Docker容器后台持续运行退出。 核心思路:确保容器的主进程(PID=1)是一个长期运行的前台进程。如果用户的应用本身是后台进程,需要改造为前台运行,或者通过某种方式让主进程退出。 根据之前的引用和知识,总结方法如下: 1. Dockerfile中确保CMD/ENTRYPOINT启动的是前台进程。 例如:对于Nginx,使用 `nginx -g 'daemon off;'` 对于其他应用,如果它默认后台运行,需要找到让它前台运行的参数,或者用脚本包装。 2. 如果无法修改应用(比如应用本身就是设计为后台运行的),则可以在启动命令后加上一个永退出的命令,保持主进程退出。 例如: CMD ["sh", "-c", "your_app && tail -f /dev/null"] 或者 CMD ["/bin/bash", "-c", "while true; do sleep 1; done"] 3. 使用`docker run`时,直接指定一个永退出的命令(覆盖Dockerfile中的CMD): docker run -d your_image tail -f /dev/null 4. 注意:如果使用`tail -f /dev/null`或循环保持运行,需要确保你的应用在后台正确启动(比如用`&`)或者在前台启动后再执行这个阻塞命令。 5. 另外,也可以使用`docker run`的`-it`选项(交互式终端)来保持容器运行,但这种方式通常用于调试,生产环境推荐。 根据引用[3]和[4]提供的例子: docker run -d configserver tail -f /dev/null docker run -d configserver /bin/bash -c "while true;do echo hello docker;sleep 1;done" 因此,回答的重点是:如何修改Dockerfile或者docker run命令,使得容器的主进程会退出。 同时,提醒用户:如果容器仍然退出,需要查看日志(docker logs)来排查应用本身的问题(如崩溃、配置错误等)。 生成相关问题: 1. 如何修改Docker容器的启动命令? 2. 如何查看Docker容器的日志? 3. Docker容器中如何让一个后台运行的应用保持容器退出? 4. Dockerfile中CMD和ENTRYPOINT有什么区别? 5. 如何进入运行中的Docker容器进行调试? </think> ### 让Docker容器后台持续运行退出的方法 #### 核心原理:保持主进程持续运行 Docker容器生命周期绑定于其**主进程(PID=1)**: $ \text{容器存活} \iff PID=1 \text{ 持续运行} $ 因此,确保主进程退出是保持容器运行的关键[^1]。 --- #### 具体实现方案 1. **修改Dockerfile启动命令**(推荐方案) ```dockerfile # 原生应用前台化(如Nginx) CMD ["nginx", "-g", "daemon off;"] # 脚本类应用添加阻塞进程 CMD ["sh", "-c", "/app/start.sh && tail -f /dev/null"] # [^3] ``` 2. **启动时覆盖命令**(调试场景) ```bash # 使用tail阻塞(最常用) docker run -d your_image tail -f /dev/null # 循环输出保持运行 docker run -d your_image /bin/bash -c "while true; do sleep 1; done" # 持续ping(网络测试场景) docker run -d your_image /bin/bash -c "ping 127.0.0.1" # [^3] ``` 3. **复合命令处理**(依赖后台进程) ```bash # 启动后台服务+阻塞进程 docker run -d your_image sh -c "service mysql start && tail -f /var/log/mysql.log" ``` 4. **特殊案例:调试容器** ```bash # 保持交互式shell运行(退出即停止) docker run -it --name debug_container your_image /bin/bash ``` --- #### 操作验证步骤 1. 启动容器: ```bash docker run -d --name=myapp your_image tail -f /dev/null ``` 2. 检查状态: ```bash docker ps -a | grep myapp # 应显示Up状态 ``` 3. 进入容器验证: ```bash docker exec -it myapp ps aux # 查看PID=1是否为tail进程 ``` > **关键提示**:若仍退出需检查: > ```bash > docker logs myapp # 查看启动日志 > docker inspect myapp --format='{{.State.ExitCode}}' # 分析退出码 > ``` --- ### 相关问题 1. 如何查看Docker容器的主进程状态? 2. `tail -f /dev/null`为什么能保持容器运行? 3. Docker Compose中如何配置服务持续运行? 4. 容器后台进程崩溃如何自动重启? 5. 如何优化容器资源占用避免OOM退出?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值