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 pull 和 docker 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.json(proxies 字段) |
容器 |
| 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的外网访问陪代理