1. 前言与核心概念
在特定的网络环境下,配置 Registry Mirror(镜像加速)与 HTTP/HTTPS Proxy(网络代理)是保障容器服务稳定运行的基础工作。本手册旨在提供一套标准化的操作流程,覆盖主流操作系统及特殊网络设备。
1.1 范围与分组原则
我们将配置场景分为两大类:
- 镜像加速 (Registry Mirror):仅针对
docker pull操作,作用于 Daemon 层面,通常不涉及鉴权。 - 通用代理 (HTTP Proxy):影响
docker build、docker push及容器运行时的外网访问。
1.2 安全与合规提示
⚠️ 警告
证书信任:配置私有源或公司代理时,必须确保 CA 证书已导入宿主机及 Docker 信任区。
凭证泄露:严禁将包含账号密码的代理 URL(如
user:pass@proxy)提交到公共代码仓库。NO_PROXY:务必排除
localhost、127.0.0.1及内部域名,防止内部流量误走代理导致服务不可达。
2. Linux (Systemd) 官方 Docker Engine
适用范围:Ubuntu, Debian, CentOS, Fedora, RHEL, Arch Linux 等标准生产环境。
2.1 配置 Registry Mirror (daemon.json)
镜像源配置位于 /etc/docker/daemon.json。如果文件不存在,请新建。
{
"registry-mirrors": [
"https://mirror.example.com",
"https://docker.company-mirror.com"
],
"insecure-registries": [],
"debug": false
}
2.2 配置 HTTP/HTTPS 代理 (Systemd Override)
为了让 Docker Daemon 能够通过代理拉取镜像或执行构建,切勿直接修改 /lib/systemd/system/docker.service,应使用 Systemd Drop-in 机制。
- 创建配置目录
sudo mkdir -p /etc/systemd/system/docker.service.d
- 创建代理配置文件
编辑
/etc/systemd/system/docker.service.d/proxy.conf:
[Service]
Environment="HTTP_PROXY=http://192.168.1.100:7890"
Environment="HTTPS_PROXY=http://192.168.1.100:7890"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
- 重载并重启
sudo systemctl daemon-reload && sudo systemctl restart docker
- 验证配置
运行
docker info,检查输出中的 "Registry Mirrors" 和 "HTTP Proxy" 字段。
3. Podman 配置差异
Podman 采用无守护进程(Daemonless)架构,其配置逻辑与 Docker 有显著不同。
3.1 Docker vs Podman 配置对比
| 配置项 | Docker | Podman |
|---|---|---|
| 配置文件格式 | JSON (daemon.json) | TOML (registries.conf) |
| 系统级路径 | /etc/docker/daemon.json | /etc/containers/registries.conf |
| 用户级路径 | 不支持 (依赖 Daemon) | ~/.config/containers/registries.conf |
| 代理生效方式 | Systemd Service 注入 | 直接读取 Shell 环境变量 (CLI) |
3.2 Podman 镜像源配置
编辑 registries.conf:
# 配置 docker.io 的镜像加速
[[registry]]
prefix = "docker.io"
location = "docker.io"
[[registry.mirror]]
location = "mirror.example.com"
[[registry.mirror]]
location = "docker.mirrors.ustc.edu.cn"
# 允许短名称搜索 (如 podman pull alpine)
unqualified-search-registries = ["docker.io"]
4. Windows (Docker Desktop) & WSL2
4.1 Docker Desktop (GUI)
Docker Desktop 屏蔽了底层复杂性,推荐优先通过 GUI 配置。
- 设置代理 (Proxy):
- 进入 Settings -> Resources -> Proxies。
- 开启 "Manual proxy configuration"。
- 填入
http://127.0.0.1:7890(假设使用本机 Windows 代理软件)。
- 设置镜像 (Docker Engine):
- 进入 Settings -> Docker Engine。
- 在 JSON 编辑器中添加
"registry-mirrors"字段,内容同 Linux 组配置。
注意:如果在 WSL2 命令行直接使用
docker命令(连接 Desktop 后端),上述 GUI 配置会自动生效。
4.2 WSL2 原生发行版 (非 Desktop)
如果你在 WSL2 (Ubuntu/Debian) 内独立安装了 Docker Engine,需注意网络互通问题。
- 网络代理指向:WSL2 无法直接通过
127.0.0.1访问 Windows 上的代理。必须使用host.docker.internal。 - Systemd 支持:确保
/etc/wsl.conf中已启用systemd=true。
配置示例 (/etc/systemd/system/docker.service.d/proxy.conf):
[Service]
# 注意:host.docker.internal 需要 WSL2 版本支持或手动配置 hosts
Environment="HTTP_PROXY=http://host.docker.internal:7890"
Environment="HTTPS_PROXY=http://host.docker.internal:7890"
Environment="NO_PROXY=localhost,127.0.0.1,*.internal,172.16.0.0/12"
5. 特殊环境:NAS 与 路由器
5.1 Synology 群晖 (DSM)
群晖 DSM 对 Docker 路径进行了定制,且升级可能重置配置。
-
图形界面配置 (推荐):
-
打开 Container Manager (DSM 7.2+) 或 Docker 套件。
-
Registry:在设置中选中 Docker Hub -> Edit,启用 "Registry Mirrors" 并填入 URL。
-
Proxy:通常需在控制面板的网络设置中全局配置。
-
配置文件路径 (SSH):
-
标准路径 (DSM 7.2+):
/var/packages/ContainerManager/etc/dockerd.json -
旧版路径:
/var/packages/Docker/etc/dockerd.json -
*修改后需重启套件:
synopkg restart ContainerManager*
5.2 OpenWrt
OpenWrt 使用 procd 管理服务。需修改 /etc/init.d/dockerd 脚本。
注入代理环境变量:
在 start_service() 函数中添加 procd_set_param env:
start_service() {
procd_open_instance
procd_set_param command /usr/bin/dockerd
# 添加以下行配置代理
procd_set_param env HTTP_PROXY=http://192.168.1.5:7890
procd_set_param env HTTPS_PROXY=http://192.168.1.5:7890
procd_set_param env NO_PROXY=localhost,127.0.0.1
procd_close_instance
}
*配置完成后重启服务:/etc/init.d/dockerd restart*
6. 验证脚本与故障排查
6.1 自动化验证脚本 (Ubuntu/Linux)
使用以下脚本检测配置是否生效:
#!/bin/bash
echo ">>> 检查 Docker 服务状态..."
systemctl is-active docker || { echo "Docker 未运行"; exit 1; }
echo ">>> 检查 Proxy 环境变量..."
# 获取 dockerd 进程的环境变量
PID=$(pgrep -n dockerd)
if [ -z "$PID" ]; then echo "无法找到 dockerd 进程"; exit 1; fi
sudo cat /proc/$PID/environ | tr '\0' '\n' | grep -E 'HTTP_PROXY|HTTPS_PROXY|NO_PROXY'
echo ">>> 检查 Registry Mirrors..."
docker info --format '{{json .RegistryConfig.Mirrors}}'
echo ">>> 网络连通性测试..."
docker pull hello-world
6.2 常见故障排查
- JSON 语法错误:
- 现象:Docker 无法启动。
- 解决:使用
jq . /etc/docker/daemon.json验证语法,注意末尾逗号。
- 代理不可达:
- 现象:Pull 超时。
- 解决:确保宿主机能
ping通代理 IP。检查防火墙(ufw/iptables)是否拦截。
- DNS 解析失败:
- 现象:报错
lookup ... no such host。 - 解决:检查
/etc/resolv.conf或在daemon.json中添加"dns": ["8.8.8.8"]。
6.3 配置文件路径速查表
| 文件用途 | 典型路径 |
|---|---|
| Docker 镜像配置 | /etc/docker/daemon.json |
| Docker 代理配置 | /etc/systemd/system/docker.service.d/proxy.conf |
| Podman 系统配置 | /etc/containers/registries.conf |
| Podman 用户配置 | ~/.config/containers/registries.conf |
| TLS 证书目录 | /etc/docker/certs.d/<domain>/ca.crt |