一、容器内网络代理 #
在Docker容器内部访问外部网络时,服务器环境需要配置代理的情况。通过配置环境变量实现。
1.环境变量解释 #
-
HTTP_PROXY: 用于 HTTP 请求的代理服务器。 -
HTTPS_PROXY: 用于 HTTPS 请求的代理服务器。 -
NO_PROXY: 指定不需要通过代理服务器访问的主机名、域名或 IP 地址列表,多个值之间用逗号分隔。
2.在 docker run 命令中设置环境变量: #
docker run \
-e HTTP_PROXY="http://127.0.0.1:8080" \
-e HTTPS_PROXY="http://127.0.0.1:8080" \
-e NO_PROXY="localhost,127.0.0.1,example.com" \
<image_name>
3.在 compose文件中设置环境变量: #
services:
service-name:
image: <image_name>
container_name: <container_name>
environment:
- HTTP_PROXY="http://127.0.0.1:8080"
- HTTPS_PROXY="http://127.0.0.1:8080"
- NO_PROXY="localhost,127.0.0.1,example.com"
... ## 其他配置
4.在 Dockerfile 中设置环境变量 (不推荐): #
FROM <base_image>
ENV HTTP_PROXY="http://127.0.0.1:8080"
ENV HTTPS_PROXY="http://127.0.0.1:8080"
ENV NO_PROXY="localhost,127.0.0.1,example.com"
## 其他构建指令
上述配置,会在构建镜像和容器运行时都生效
二、构建镜像时代理 #
在构建Docker镜像过程中需要访问外部网络的情况。
1. 在 Dockerfile 中设置代理 #
已在第一节讲述过:
FROM <base_image>
ENV HTTP_PROXY="http://127.0.0.1:8080"
ENV HTTPS_PROXY="http://127.0.0.1:8080"
ENV NO_PROXY="localhost,127.0.0.1,example.com"
## 其他构建指令
2. 执行构建命令时使用 –build-arg 传递代理参数 #
构建命令如下:
docker build --build-arg HTTP_PROXY="http://127.0.0.1:8080" \
--build-arg HTTPS_PROXY="http://127.0.0.1:8080" \
--build-arg NO_PROXY="localhost,127.0.0.1,example.com" \
-t <image_name> .
注意:上述两种配置不会在拉取(pull)镜像时生效。
注意:上述两种配置不会在拉取(pull)镜像时生效。
注意:上述两种配置不会在拉取(pull)镜像时生效。
三、拉取镜像时代理 #
当Docker守护进程拉取镜像时,它并不读取Dockerfile里的ENV或--build-arg等设置,而是直接由Docker守护进程发起网络请求。如果网络环境要求必须走代理,那么需要对Docker守护进程进行全局代理配置。
四、全局代理 #
1.配置 Docker Daemon 的代理 #
编辑daemon.json文件,加入代理设置
{
"proxies": {
"http-proxy": "http://127.0.0.1:8080",
"https-proxy": "http://127.0.0.1:8080",
"no-proxy": "localhost,127.0.0.1,example.com"
}
}
Docker Daemon 的配置文件所在位置如下:
- Linux 常规模式:
/etc/docker/daemon.json - Linux Rootless 模式:
~/.config/docker/daemon.json - Windows:
C:\ProgramData\docker\config\daemon.json - macOS Docker Desktop:
~/.docker/config/daemon.json - macOS OrbStack:
~/.orbstack/config/docker.json
2.使用 Systemd 配置代理 (适用于 Linux) #
sudo mkdir -p /etc/systemd/system/docker.service.d
touch /etc/systemd/system/docker.service.d/http-proxy.conf
http-proxy.conf 文件内容如下:
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:8080"
Environment="HTTPS_PROXY=http://127.0.0.1:8080"
Environment="NO_PROXY=localhost,127.0.0.1,example.com"
Reload 服务配置并重启 Docker Daemon 服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
五、总结 #
Docker 代理配置涉及多个层面,包括容器运行时、镜像构建时和镜像拉取时。
- 容器运行时代理: 使用环境变量 (
HTTP_PROXY,HTTPS_PROXY,NO_PROXY),可以通过docker run或docker-compose灵活配置。 - 镜像构建时代理: 推荐使用
--build-arg方式传递代理参数,避免将代理信息固化在镜像中。 - 镜像拉取时代理: 需要配置 Docker Daemon 的全局代理,可以通过修改
daemon.json文件或使用 Systemd 配置。
选择合适的代理配置方式取决于具体的应用场景和需求。理解这些配置方式的差异和适用范围,可以帮助我们更好地管理 Docker 容器的网络访问。