容器运维:不同平台下 Docker/Podman 网问题配置速查

60 阅读4分钟

1. 前言与核心概念

在特定的网络环境下,配置 Registry Mirror(镜像加速)与 HTTP/HTTPS Proxy(网络代理)是保障容器服务稳定运行的基础工作。本手册旨在提供一套标准化的操作流程,覆盖主流操作系统及特殊网络设备。

1.1 范围与分组原则

我们将配置场景分为两大类:

  • 镜像加速 (Registry Mirror):仅针对 docker pull 操作,作用于 Daemon 层面,通常不涉及鉴权。
  • 通用代理 (HTTP Proxy):影响 docker builddocker push 及容器运行时的外网访问。

1.2 安全与合规提示

⚠️ 警告

  • 证书信任:配置私有源或公司代理时,必须确保 CA 证书已导入宿主机及 Docker 信任区。

  • 凭证泄露:严禁将包含账号密码的代理 URL(如 user:pass@proxy)提交到公共代码仓库。

  • NO_PROXY:务必排除 localhost127.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 机制。

  1. 创建配置目录
sudo mkdir -p /etc/systemd/system/docker.service.d

  1. 创建代理配置文件 编辑 /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"

  1. 重载并重启
sudo systemctl daemon-reload && sudo systemctl restart docker

  1. 验证配置 运行 docker info,检查输出中的 "Registry Mirrors" 和 "HTTP Proxy" 字段。

3. Podman 配置差异

Podman 采用无守护进程(Daemonless)架构,其配置逻辑与 Docker 有显著不同。

3.1 Docker vs Podman 配置对比

配置项DockerPodman
配置文件格式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 配置。

  1. 设置代理 (Proxy)
  • 进入 Settings -> Resources -> Proxies
  • 开启 "Manual proxy configuration"。
  • 填入 http://127.0.0.1:7890 (假设使用本机 Windows 代理软件)。
  1. 设置镜像 (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 常见故障排查

  1. JSON 语法错误
  • 现象:Docker 无法启动。
  • 解决:使用 jq . /etc/docker/daemon.json 验证语法,注意末尾逗号。
  1. 代理不可达
  • 现象:Pull 超时。
  • 解决:确保宿主机能 ping 通代理 IP。检查防火墙(ufw/iptables)是否拦截。
  1. 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