Docker——访问官方镜像库-代理配置


终端科学上网说明

  • 配置好科学上网后,网页能科学上网

  • 为了在终端科学上网,需要配置代理(修改环境变量为 VPN 的指定端口)

    1
    2
    export HTTP_PROXY="http://127.0.0.1:7897/"
    export HTTPS_PROXY="http://127.0.0.1:7897/"
  • 确认一下 Ubuntu 终端已经科学上网,即已经配置下面的情况

    1
    2
    3
    4
    # echo $HTTP_PROXY
    http://127.0.0.1:7897/
    # echo $HTTPS_PROXY
    http://127.0.0.1:7897/
    • 从输出可以看到,终端已经配置了代理(HTTP_PROXYHTTPS_PROXY 均指向 http://127.0.0.1:7897/
  • 此时在终端执行 curl 能成功

    1
    curl https://www.google.com
    • 注意此时用 ping 命令不一定能成功,因为 ping 使用的是 ICMP 协议
  • 综上已经确定了终端可以科学上网

  • 特别注意:一般来说终端的代理配置仅对当前终端会话生效 ,除非把环境变量配置添加到 ~/.bashrc 文件


docker 的问题

  • 通过网页访问 docker 核心库没问题(有返回没验证的说明就是 OK 的)
  • Docker 服务默认不会继承终端的代理环境变量 ,这常常是 Docker 拉取镜像仍失败的关键原因
  • 需要将代理配置同步给 Docker 服务,确保 Docker 能通过代理访问镜像仓库

为 Docker 配置代理(确保与终端代理一致)

第一步:创建 Docker 代理配置文件

  • Docker 服务的代理配置需通过专门的系统目录(/etc/systemd/system/docker.service.d/)生效,执行以下命令创建配置文件:
    1
    2
    3
    4
    5
    # 创建配置目录(若不存在)
    sudo mkdir -p /etc/systemd/system/docker.service.d

    # 创建代理配置文件
    sudo nano /etc/systemd/system/docker.service.d/proxy.conf

第二步:写入代理配置(与终端代理保持一致)

  • proxy.conf 文件中添加以下内容(注意代理地址 127.0.0.1:7897 需与你终端的 HTTP_PROXY 完全一致,包括结尾是否带 /):

    1
    2
    3
    4
    [Service]
    Environment="HTTP_PROXY=http://127.0.0.1:7897/"
    Environment="HTTPS_PROXY=http://127.0.0.1:7897/"
    Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.local.golang.org,.docker.internal"
    • NO_PROXY:指定无需代理的地址(避免本地服务/容器间通信走代理,防止冲突),无需修改

第三步:重启 Docker 服务,使代理生效

1
2
3
4
5
6
7
8
# 重新加载 systemd 配置(识别新的 proxy.conf)
sudo systemctl daemon-reload

# 重启 Docker 服务
sudo systemctl restart docker

# 验证 Docker 是否加载了代理配置
sudo systemctl show --property=Environment docker
* 若输出中包含 `HTTP_PROXY=http://127.0.0.1:7897/` 和 `HTTPS_PROXY=http://127.0.0.1:7897/`,说明 Docker 代理配置成功

再次尝试拉取 Docker 镜像

  • 现在 Docker 已通过代理访问外部仓库,执行拉取命令:
    1
    2
    3
    4
    5
    # 先测试小镜像 hello-world,验证代理是否生效
    sudo docker pull hello-world

    # 若 hello-world 成功,再拉取目标镜像
    sudo docker pull xxx