如何配置 Docker daemon.json 修改镜像加速器和日志驱动参数

文章导读
修改 Docker 全局配置最稳妥的方式是编辑 daemon.json 文件,改完后必须重启 Docker 服务才能生效,适合需要统一调整拉取源或控制日志大小的场景。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

修改 Docker 全局配置最稳妥的方式是编辑 daemon.json 文件,改完后必须重启 Docker 服务才能生效,适合需要统一调整拉取源或控制日志大小的场景。

先说结论:直接编辑配置文件是标准做法,但服务重启期间容器业务会短暂中断,建议在维护窗口操作。

  • 适合:需要全局生效的镜像源配置或日志轮转策略
  • 先准备:备份原有配置文件并确认新的镜像地址可用
  • 验收:重启后通过 docker info 确认参数已加载

命令速用版

如果你已经确定要修改的内容,可以直接使用以下命令序列完成备份、编辑和重启。

# 1. 备份原有配置
cp /etc/docker/daemon.json /etc/docker/daemon.json.bak

# 2. 编辑配置 (使用 vim 或 nano)
vim /etc/docker/daemon.json

# 3. 重载配置并重启服务
systemctl daemon-reload
systemctl restart docker

为什么会这样

Docker 守护进程在启动时会读取 /etc/docker/daemon.json 作为全局配置文件。修改这个文件不会自动触发重载,因为守护进程没有监听该文件的变更事件。必须重启 docker 服务才能让新的配置项(如 registry-mirrors 或 log-driver)生效。这也是为什么生产环境修改时需要谨慎,因为重启期间正在运行的容器网络可能会短暂波动,且未设置为重启策略的容器不会自动恢复。

分步处理

按照以下步骤操作,可以最大程度降低配置错误导致服务无法启动的风险。

如何配置 Docker daemon.json 修改镜像加速器和日志驱动参数

1. 检查当前配置状态

先查看当前是否已有配置文件,以及 Docker 正在使用的配置。

cat /etc/docker/daemon.json
docker info | grep -A 5 "Registry Mirrors"
docker info | grep "Logging Driver"

2. 编辑配置文件

确保 JSON 格式正确,逗号不能遗漏。以下是一个包含镜像加速器和日志驱动的典型示例:

{
  "registry-mirrors": [
    "https://your-mirror-id.mirror.aliyuncs.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}

注意:如果没有现有文件,直接创建即可;如果有内容,请合并配置,不要覆盖掉原有的 storage-driver 等关键参数。

如何配置 Docker daemon.json 修改镜像加速器和日志驱动参数

3. 验证 JSON 语法

在重启前,最好用 Python 或 jq 检查语法是否正确,避免重启失败。

# 使用 Python 验证
python -m json.tool /etc/docker/daemon.json > /dev/null && echo "JSON OK" || echo "JSON Error"

# 使用 jq 验证 (推荐,更轻量)
jq . /etc/docker/daemon.json > /dev/null && echo "JSON OK"

4. 重启服务

systemctl daemon-reload
systemctl restart docker

怎么验证是否生效

服务启动后,不要立刻认为配置成功,需要通过命令确认参数已加载。

如何配置 Docker daemon.json 修改镜像加速器和日志驱动参数

1. 检查镜像加速器

docker info | grep -A 10 "Registry Mirrors"

输出中应包含你配置的地址。如果显示为空或未变化,说明配置未生效。

2. 检查日志驱动

docker info | grep "Logging Driver"

确认显示为 json-file 或其他你设置的驱动。新建一个容器测试日志轮转是否按预期工作。

docker run `--rm` alpine echo "test log"
ls -lh /var/lib/docker/containers/*/*.log

常见坑

  • JSON 语法错误:最后一个字段后面多加了逗号,或者引号不匹配,会导致 Docker 无法启动。务必先做语法检查。
  • 配置覆盖:直接写入新内容覆盖了原有的 storage-driver 配置,可能导致 Docker 无法找到存储路径,启动失败。
  • 镜像地址失效:公共镜像加速器地址可能不稳定,建议优先使用云厂商提供的专属地址。公开资料中没有看到可靠的量化数据表明哪个公共地址长期最稳,需根据实际情况测试。
  • 日志丢失风险:修改 log-driver 后,旧容器可能仍沿用旧驱动,只有新创建的容器才会使用新配置。且切换驱动可能导致旧日志不可读。
  • 服务中断:systemctl restart docker 会停止所有容器。如果容器没有设置 `--restart`=always,重启后需要手动启动。

参考来源

  • Docker Docs, Daemon configuration file, https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file
  • Docker Docs, Configure logging drivers, https://docs.docker.com/config/containers/logging/configure/