在日常的 Docker 操作中,特别是使用 docker pull
、docker run
和 docker build
命令时,可能会遇到网络访问受限的情况,尤其是当你在公司网络或者需要访问被限制的资源时。这时候,配置一个 VPN 代理变得非常重要。本文将详细介绍如何在不同的 Docker 操作中正确配置 VPN 代理。
docker pull
配置代理当你需要通过 docker pull
命令从 Docker Hub 拉取镜像时,Docker 代理的设置由 systemd
接管。因此,需要通过以下步骤来配置代理:
编辑 Docker 服务的代理配置:
bashsudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
添加 HTTP 和 HTTPS 代理设置:
ini[Service]
Environment="HTTP_PROXY=http://127.0.0.1:10811"
Environment="HTTPS_PROXY=http://127.0.0.1:10811"
这里的 127.0.0.1:10811
是你本机的 HTTP 代理地址。
重新加载并重启 Docker 服务:
bashsudo systemctl daemon-reload sudo systemctl restart docker
验证代理设置: 你可以通过以下命令查看 Docker 服务的环境变量,确保代理已生效:
bashsudo systemctl show --property=Environment docker
配置完成后,docker pull
命令将通过配置的代理来拉取镜像。
docker run
配置代理当你使用 docker run
启动容器时,你可以通过以下几种方法来让容器使用代理:
如果你希望容器内部直接使用代理,可以在启动容器后,通过以下命令设置代理:
bashexport ALL_PROXY='socks5://127.0.0.1:10810'
这里的 127.0.0.1:10810
是你本机的 SOCKS5 代理地址。
--network=host
)在启动容器时,可以使用 --network=host
选项共享宿主机的网络,然后在容器内设置代理:
bashdocker run --network=host my-container
在容器内部设置代理:
bashexport ALL_PROXY='socks5://127.0.0.1:10810'
使用 --network=host
时,容器将共享宿主机的网络,这样你可以直接使用 127.0.0.1
作为代理地址。
需要注意的是,使用 --network=host
时,所有端口都将与宿主机共享,端口映射 (-p
) 参数将无法使用。
你可以通过编辑 Docker 客户端配置文件 ~/.docker/config.json
,为所有容器配置全局代理:
json{
"proxies": {
"default": {
"httpProxy": "http://127.0.0.1:10811",
"httpsProxy": "http://127.0.0.1:10811",
"noProxy": "localhost,127.0.0.1"
}
}
}
设置全局代理后,所有通过 docker run
创建的容器都会自动使用这些代理设置。
docker build
配置代理在构建 Docker 镜像时,你可以使用宿主机的网络模式,并通过 --build-arg
参数为构建过程指定代理:
你可以通过 --network=host
选项让 docker build
使用宿主机网络,从而直接访问宿主机的代理:
bashdocker build --network=host --build-arg http_proxy=http://127.0.0.1:10811 --build-arg https_proxy=http://127.0.0.1:10811 -t my-image .
如果你选择使用 Docker 默认的 bridge
网络模式,构建过程中将使用 Docker 的虚拟网卡,这时需要使用虚拟网卡的 IP 地址:
bashdocker build --build-arg http_proxy=http://172.17.0.1:10811 --build-arg https_proxy=http://172.17.0.1:10811 -t my-image .
在 bridge
网络模式下,172.17.0.1
是 Docker 默认的虚拟网卡地址,容器内部将通过该地址访问宿主机的代理。
docker run
和 docker build
中,根据你的需求选择合适的网络模式(bridge
或 host
),以确保容器能够正确访问代理。~/.docker/config.json
中生效,但不会影响已创建的容器,只有新创建的容器会使用该配置。polipo
等工具将 SOCKS5 转换为 HTTP 代理。通过以上方法,你可以在使用 Docker 的过程中灵活地配置代理,确保在受限网络环境中也能顺利地进行镜像拉取、容器运行和镜像构建等操作。
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!