重启docker service时为什么一般情况下不影响已经运行的容器?

本文解释了Docker的live-restore设置如何确保在不改动关键参数时,升级或重启docker不影响运行中的容器。重点在于理解其工作原理和限制条件,包括只在小版本更新和配置不变时进行容器恢复。

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

如果是所示,这是docker自身的一个属性决定,该属性默认使true,因此当我们执行systemctl docker restart时已经运行的容器未受影响。

原文在: https://docs.docker.com/config/containers/live-restore/

中文大意‘:/etc/docker/daemon.json配置文件中设置了

{
  "live-restore": true
}

在升级小版本或者重启时,只要不改变daemon-level级别参数,是不会影响已运行容器的

Live restore during upgrades

Live restore allows you to keep containers running across Docker daemon updates, but is only supported when installing patch releases (YY.MM.x), not for major (YY.MM) daemon upgrades.

If you skip releases during an upgrade, the daemon may not restore its connection to the containers. If the daemon can’t restore the connection, it cannot manage the running containers and you must stop them manually.
Live restore upon restart

The live restore option only works to restore containers if the daemon options, such as bridge IP addresses and graph driver, did not change. If any of these daemon-level configuration options have changed, the live restore may not work and you may need to manually stop the container
特别注意不是所有情况下重启docker服务都不影响已运行容器,而是当不改变特定参数情况下,才不影响。

### 一、Nacos Docker 容器自动重启的原因分析 Nacos Docker 容器频繁自动重启通常由以下几个原因引起: 1. **内存足** 当执行 `docker stats` 命令,如果发现 Nacos 容器占用过多内存(接近 1GB 或更高),而 Docker 默认分配给容器的内存仅为 2GB,则可能导致 OOM(Out of Memory)错误,从而触发容器自动重启[^3]。 2. **配置正确** 如果未正确设置 JVM 的堆内存参数或者挂载目录存在问题,也可能导致容器无法正常启动并进入无限重启状态[^1]。 3. **端口冲突** 若宿主机上已有其他服务占用了 Nacos 所需的默认端口(8848),则会引发绑定失败的情况,进而使容器断尝试重新启动[^2]。 --- ### 二、解决方案 以下是针对上述问题的具体解决方法: #### 1. 设置 Nacos 运行堆内存大小 通过调整 JVM 参数来限制 Nacos 的堆内存使用量。可以在启动命令中加入 `-Xms` 和 `-Xmx` 参数以指定最小和最大堆内存值。例如,在 `docker run` 中添加如下环境变量: ```bash -e JAVA_OPTS="-Xms512m -Xmx768m" ``` 这一步可以有效防止由于内存溢出而导致的容器崩溃。 #### 2. 创建正确的挂载目录 确保在运行 Nacos 容器之前已经创建好所需的持久化存储路径,并将其映射到容器内部的数据卷位置。典型的挂载方式如下所示: ```bash -v /host/path/data:/home/nacos/data \ -v /host/path/logs:/home/nacos/logs ``` 这样能够避免因为数据丢失或权限问题引起的异常退出行为。 #### 3. 修改 Docker 资源限制 增加单个容器可使用的总物理内存数量至至少大于等于 3GB 可减少因资源争抢造成的强制终止现象发生概率;另外还可以考虑开启交换分区支持以便于缓解临性的高负载压力状况下的表现恶化趋势。 编辑 `/etc/docker/daemon.json` 文件内容如下: ```json { "default-runtime": "runc", "oom-score-adjust": "-500", "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } ``` 然后重启 Docker 服务让更改生效即可。 #### 4. 检查端口占用情况 确认目标机器上的网络接口是否存在重复定义的服务实例监听地址与端口号组合关系。利用 netstat 工具排查是否有进程正在占据着预期要被分配出去的那个特定数值范围内的通信信道入口点位号。 ```bash sudo lsof -i :8848 ``` 如果有冲突的话可以选择修改应用本身的配置文件中的 server.port 属性或者是改变外部访问链接形式达到避开干扰的目的。 --- ### 示例代码片段 下面提供了一个完整的基于 Docker Compose 来部署带自定义选项版本号以及优化后的资源配置样例供参考学习之用: ```yaml version: '3' services: nacos: image: nacos/nacos-server:v2.2.0 container_name: nacos-container environment: - MODE=standalone - SPRING_DATASOURCE_PLATFORM=mysql - MYSQL_SERVICE_HOST=db_host - MYSQL_SERVICE_PORT=3306 - MYSQL_SERVICE_USER=root - MYSQL_SERVICE_PASSWORD=password - MYSQL_DATABASE_NAME=nacos_config - JAVA_OPTS=-Xms512m -Xmx768m ports: - "8848:8848" volumes: - ./data/:/home/nacos/data/ - ./logs/:/home/nacos/logs/ restart: always ``` 此 YAML 文件设置了独立模式下运行的同还引入了 MySQL 数据库作为远程存储后端并且指定了合适的初始 RAM 大小配额以防止单纯依赖缺省设定所带来的潜在风险隐患[^4]。 --- ### 总结 综上所述,当遇到 Docker 环境里的 Nacos 实例总是处于反复循环重试加载过程之中可以从硬件层面着手改善供给条件比如扩充可用空间容量比例同也要注意软件方面的精细化管理措施诸如合理规划各项参数指标等等综合施策才能彻底根除此类顽疾困扰^.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值