Docker中使用HTTP代理

目录

内网中的虚拟机都没有外网访问权限,无法直接进行在线安装。

虽然 CMA 有自己的镜像网站:

http://mirrors.cma.cn/

但缺乏操作系统之外的镜像,比如 pip,anaconda 和 DockerHub 等。 所以配置 Python 环境和编排 Docker 镜像都不是很方便。

我在之前的文章《HPC用户安装Python解决方案》中介绍使用在工作电脑上搭建的代理服务可以在线安装 Python 包。 本文介绍如何在 Docker 中使用代理。

概述

Docker 有三个地方需要网络访问:

  • 下载 Docker 镜像:Docker 服务
  • 编排 Docker 镜像:Docker 客户端
  • 运行 Docker 容器:Docker 容器运行时

下面分别介绍设置代理的方法。

Docker 服务

下载 Docker 镜像由 Docker 服务完成。

Docker 服务使用启动时的 HTTP_PROXYHTTPS_PROXYNO_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

https://docs.docker.com/network/proxy/