Docker 代理配置 链接到标题

Docker 代理分为两类:容器运行代理(容器访问外网)和 Pull/Push 代理(dockerd 拉取/推送镜像)。


一、容器运行代理 链接到标题

容器运行时代理用于让容器内部的应用通过代理访问网络。有两种配置方式。

方式一:运行容器时手动指定(临时) 链接到标题

docker run -e HTTP_PROXY="http://proxy.example.com:8080" \
           -e HTTPS_PROXY="http://proxy.example.com:8080" \
           -e NO_PROXY="localhost,127.0.0.1,.local" \
           nginx

每次启动容器都要手动加,比较麻烦。

方式二:通过 Docker Client 配置文件(推荐,持久化) 链接到标题

编辑 ~/.docker/config.json,让 Docker 自动为所有容器注入代理环境变量:

{
  "proxies": {
    "default": {
      "httpProxy":  "http://proxy.example.com:8080",
      "httpsProxy": "http://proxy.example.com:8080",
      "noProxy":    "localhost,127.0.0.1,.local"
    }
  }
}

配置后,用 docker run 启动的容器会自动注入这些环境变量。如果只想对特定容器生效,把 default 换成容器名即可。

Docker Desktop 用户也可以在 GUI 的 Settings → Resources → Proxies 中配置,本质上也是写入 config.json


二、Pull / Push 代理 链接到标题

docker pulldocker push 走的是 dockerd 守护进程 的网络,需要给 dockerd 配代理。

方式一:systemd 方式(推荐) 链接到标题

创建 dockerd 的 systemd 代理配置:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf << 'EOF'
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080"
Environment="HTTPS_PROXY=http://proxy.example.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,.local"
EOF

重启生效:

sudo systemctl daemon-reload
sudo systemctl restart docker

方式二:daemon.json 方式(Docker 18.09+) 链接到标题

编辑 /etc/docker/daemon.json

{
  "registry-mirrors": [],
  "http-proxy": "http://proxy.example.com:8080",
  "https-proxy": "http://proxy.example.com:8080",
  "no-proxy": "localhost,127.0.0.1,.local"
}

重启:

sudo systemctl restart docker

验证代理是否生效 链接到标题

sudo systemctl show docker --property Environment
# 或者
docker info | grep -i proxy

systemd 方式本质是给 dockerd 进程注入环境变量(containerd 内部拉镜像也用这个环境变量),daemon.json 方式则是 dockerd 自己读取配置传给 containerd。两种方式效果等价,systemd 方式兼容性更广。


三、总结 链接到标题

场景 配置位置 生效对象
容器内访问外网 ~/.docker/config.jsonproxies 字段) 容器
pull / push 镜像 systemd 或 /etc/docker/daemon.json dockerd 守护进程

kind 代理配置 链接到标题

kind 起的cluster其实是多个本地容器,其实不能管理多个主机,只能拿来学习和测试。

所以想要kind走代理(kubuctl deploy 就是cri pull时),要么用 docker exec -it kind-control-plane bash进容器改systemctl 来改cri的环境 要么用上面的docker容器配置,让所有docker的外网访问陪代理