如何正确地为Docker容器设置代理

如何正确地为Docker容器设置代理

概述

为 Docker 容器设置代理有两种方式,原理都是设置环境变量。

假设: 宿主网络下的 7890 端口提供了代理服务。

宿主 ip

host.docker.internal 是 Docker Desktop 提供的特殊 DNS 名称,用于映射到宿主机的 IP 地址。

如果是 Linux 系统可能需要 --add-host host.docker.internal:host-gateway

此外,直接使用宿主的内网 ip 当然也可以

常见的方式是使用 docker 创建的网卡 docker0 的 ip: 172.17.0.1

设置环境变量

容器的网络代理,也可以直接在其运行时通过 -e 传入 http_proxy 等环境变来设置。

这种方式适合服务器部署应用。

1
2
3
4
docker run -e "http_proxy=http://宿主ip:7890" \
-e "https_proxy=http://宿主ip:7890" \
-e "noProxy=localhost,127.0.0.1" \
my_image

当然,也可以直接使用 --network=host,让容器直接使用宿主的网络空间,那么 host.docker.internal 就可以改成 127.0.0.1

Docker 配置文件

这种方式下,Docker 容器运行时会自动传入配置的环境变量,适合个人本地配置,且只在 Docker 17.07 及以上版本生效。

修改 ~/.docker/config.json 文件

1
2
3
4
5
6
7
8
9
{
"proxies": {
"default": {
"httpProxy": "http://宿主ip:7890",
"httpsProxy": "http://宿主ip:7890",
"noProxy": "localhost,127.0.0.1"
}
}
}

测试代理情况

进入容器,请求查询 ip 归属地判断是否成功使用代理。

1
2
3
wget https://www.ip.cn/api/index?ip=&type=0
# or
curl https://www.ip.cn/api/index?ip=&type=0

补充

我曾想通过 SSH 远程端口转发,将自己电脑上的代理服务端口转发到云服务器上,然后再设置云服务器中 Docker 容器代理使用 SSH 转发后的端口。

但不知道什么原因,无法连通 172.17.0.1。使用 --add-host host.docker.internal:host-gatewayhost.docker.internal 结果也一样。

虽然不爽,但还是老老实实的用 --network=host 吧。

   Vector Landscape Vectors by Vecteezy
作者

AkiChase

发布于

2024-01-07

更新于

2024-01-11

许可协议