为Docker配置代理 - 详解Docker的三种网络代理配置

Docker Client – 代理访问远程的 Docker Daemon

DockerClient–代理访问远程的DockerDaemon

Docker 的 ClientDaemon 端是可以不在同一个机器上的, 可以通过 docker -h 连接其他的 Docker Daemon

Client 端设置代理其实就是设置 Linux 系统的代理, 从而让系统的命令行可以通过代理连接到外部的网络。一般只需要配置 HTTP_PROXYHTTPS_PROXY 这两个即可。

1
2
3
4
5
6
7
8
9
10
# 临时方案
export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890
# 永久方案
vim /etc/profile
---
export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
:wq
---
source /etc/profile

Docker Daemon – 代理拉取或推送国外镜像

DockerDaemon–代理拉取或推送国外镜像

!!!注意
Docker 守护程序 (dockerd) 是在其启动环境中使用 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY 环境变量来配置 HTTP 或 HTTPS 代理行为
需要在 Docker systemd 服务文件中添加此配置
daemon.json 文件或者是在系统环境变量文件中配置它们都不会使其生效

/etc/systemd/system 目录下创建 docker.service.d 目录, 创建 http-proxy.conf 配置文件

1
2
3
4
5
6
7
8
9
10
mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/http-proxy.conf
---
[Service]
Environment="HTTP_PROXY=http://ip:port/"
Environment="HTTPS_PROXY=http://ip:port/"
Environment="NO_PROXY=localhost,127.0.0.1"
---
:wq
systemctl daemon-reload && systemctl restart docker

Container – 容器内部代理访问国外资源

参考 Docker 官方文档:Configure Docker to use a proxy server

!!!注意
该代理只针对于后续 build 或 run 的容器有效, 已经创建好的不受影响

Container–容器内部代理访问国外资源

容器就可以当做一个简化版的 Linux 系统, 如果想实现容器内部的代理, 则必须在容器内设置适当的环境变量

  • 直接在容器内部进行修改, 虽然也可以这样做, 但是不是很推荐, 如果不是测试使用, 最好还是保证容器的完整性, 如果是想要将该容器导出并移植到其他机器上去的话, 那肯定是在容器内部修改环境变量导出
  • 在 Docker 17.06 及更早版本中, 可以在构建映像(这会降低映像的可移植性)或创建或运行容器时通过指定参数来执行此操作
  • 在 Docker 17.07 及更高版本中, Docker 提供了一个全局的配置, 可以通过配置 Docker 客户端以自动将代理信息传递给容器, 从而让所有的容器内部都支持代理访问

Docker 17.07 及更高版本中的全局配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim ~/.docker/config.json
---
{
"proxies":
{
"default":
{
"httpProxy": "http://127.0.0.1:7890",
"httpsProxy": "http://127.0.0.1:7890",
"noProxy": "*.test.example.com,.example2.com,127.0.0.0/8"
}
}
}
---
:wq
systemctl restart docker

HTTP_PROXY 用于代理访问 http 请求, HTTPS_PROXY 用于代理访问 https 请求, 如果想某个IP或域名不走代理则配置到 NO_PROXY 中。

如果确实只是为容器配置临时的代理, 或者只为某个特定的容器设置代理, 可以使用docker-compose的配置文件或者容器内执行命令

docker-compose中配置代理

1
2
3
environment:
- http_proxy=192.168.62.164:8081
- https_proxy=192.168.62.164:8081

临时使用, 在容器内执行

1
sh -c "export http_proxy=http://192.168.62.164:8081 && export https_proxy=http://192.168.62.164:8081"

参考资料
[1] 详解 Docker 的三种网络代理配置 - Roc’s Blog (2024_7_31 10_47_08).html
[2] Docker 配置代理 - SnailRush - 博客园 (2024_7_31 10_47_32).html
[3] docker设置代理解决内网pull外网镜像_docker pull 代理-CSDN博客 (2024_7_31 10_46_34).html