Docker中使用HTTP代理
内网中的虚拟机都没有外网访问权限,无法直接进行在线安装。
虽然 CMA 有自己的镜像网站:
但缺乏操作系统之外的镜像,比如 pip,anaconda 和 DockerHub 等。 所以配置 Python 环境和编排 Docker 镜像都不是很方便。
我在之前的文章《HPC用户安装Python解决方案》中介绍使用在工作电脑上搭建的代理服务可以在线安装 Python 包。 本文介绍如何在 Docker 中使用代理。
概述
Docker 有三个地方需要网络访问:
- 下载 Docker 镜像:Docker 服务
- 编排 Docker 镜像:Docker 客户端
- 运行 Docker 容器:Docker 容器运行时
下面分别介绍设置代理的方法。
Docker 服务
下载 Docker 镜像由 Docker 服务完成。
Docker 服务使用启动时的 HTTP_PROXY
,HTTPS_PROXY
和 NO_PROXY
环境变量配置 HTTP 代理。
使用 systemd 管理的 Docker 服务需要单独设置配置文件。
为 Docker 服务创建 systemd drop-in 目录:
sudo mkdir -p /etc/systemd/system/docker.service.d
创建名为 /etc/systemd/system/docker.service.d/http-proxy.conf
的文件,添加环境变量
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80"
Environment="HTTPS_PROXY=https://proxy.example.com:443"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
再使用 docker pull
命令就可以直接从 DockerHub 拉取镜像。
Docker 客户端
编排 Docker 容器过程中设计的网络连接由 Docker 客户端负责,可以在 docker build
的命令行中通过 --build-arg
设置编排过程中使用到的环境变量。
sudo docker build \
--build-arg http_proxy=http://proxy.example.com:80 \
--build-arg https_proxy=https://proxy.example.com:443 \
.
Docker 运行时
运行中的 Docker 容器可能也需要访问互联网,可以通过为容器设置环境变量来实现。
- 在 Dockerfile 中使用类似
ENV HTTP_PROXY "http://127.0.0.1:3001"
的命令设置 - 在
docker run
命令中使用类似--env HTTP_PROXY="http://127.0.0.1:3001"
的参数设置
进一步
Docker 客户端和 Docker 运行时都可以通过 ~/.docker/config.json
配置文件设置代理:
{
"proxies":
{
"default":
{
"httpProxy": "http://127.0.0.1:3001",
"httpsProxy": "http://127.0.0.1:3001",
"noProxy": "*.test.example.com,.example2.com"
}
}
}
但笔者添加该文件后编排或创建新的容器均未生效,后续会进一步排查原因。
参考
更详细的设置方法请参考以下文档:
https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables---build-arg