Docker Container 代理配置一本通
完美解决容器代理配置
由于一些原因,我们常常需要在开发中使用代理,但是在实践过程中我们发现在 Container 中我们无法直接使用主机配置好的代理。本文将给出不同平台下配置 Container 中的代理的方法。
本文的目的是为工作提供方便,很多公司开发过程中都需要使用代理连接内部资源服务器,请勿将本文所述内容用于违法用途!
对此产生的任何影响本人概不负责!
综述
对于 Container 的配置分为两种情况:
- 使用Dockerfile/Docker-compose分步构建过程中是需要使用代理
- 例如需要使用公司内部镜像下载软件包
- 构建好的容器需要使用代理
对于上述两种情况,经过查阅 Docker 相关文档,所有平台下对 Container 的代理配置都可以转化为一个操作:
在 Container 中设置
http_proxy/https_proxy这两个环境变量注意注意这里的大小写,如果只设置了HTTP_proxy/HTTPS_proxy可能在某些情况下无法正常工作,当然您也可以一块儿将这四个变量都设置了,不影响的。
配置方法
Docker 支持设定时给每个新构建的 Container 传递永久环境变量,有些人利用这一点直接传递 xxxx_proxy,但是我不希望你这样做
http_proxy 等 代理环境变量,那可能会导致你的镜像在别人那里运行就会出现网络问题,而对方可能对 Docker 或者 Linux 理解不深从而没有办法修复这个问题,这不符合一次构建到处运行的理念。在正式开始之前,我们需要确定我们的代理已经允许了本地 LAN 并配置好了端口:

确定 http(s)_proxy 地址
在实际的使用中,我们需要传递的环境变量 http_proxy 和 https_proxy (当然,你也可以继续传递 类似 ftp_proxy 等内容)
这时候对于不同平台我们需要使用不同的地址:
Windows / MacOs:
由于在这两个平台下 Docker 通过 NAT 的方式连接网络,我们无法获取一个固定的网关地址,所以 Docker-Desktop 为我们提供了一个访问网关的网址:gateway.docker.internal,所以我们直接使用这个地址即可。
|
|
Linux
Linux 下 docker 服务默认会创建一个 docker0 网桥,我们可以通过这个网桥让容器和主机进行通信,只需要在命令行输入:
|
|
就可以看到 docker0 的信息:
|
|
这里面 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 就表示我们容器的网关为 172.17.0.1,我们使用网关即可直接访问我们主机:
|
|
从 Dockerfile 构建
1. 永久传递环境变量
使用 ENV 参数,这样传递进去的参数在此之后会一直留存在镜像之中:
|
|
2. 仅在构建时传递
使用 ARG 参数,这样两条代理指令仅在构建过程中起效,构建结束后的 Image 中不会留存相关环境变量:
|
|
构建好的 Image
对于已经构建好的 Image,我们对其配置代理有两种方式:
1. 传递永久环境变量
在启动的时候传入参数:
|
|
当然,您可也可以将这写环境变量写成一个 .env 文件然后使用 --env-file 去统一导入:
例如 Linux 下.env 文件:
|
|
之后这要进行导入:
|
|
2. 临时传递
临时传递的方式较为简单,只需要先运行镜像:
|
|
在进入镜像后手动设置环境变量:
|
|
或者配合 VSCode 的 Remote-Container 插件配置后可以实现每次自动设置,具体方式请移步 Docker 配合 VSC 开发最佳实践
已生成的 Container
1. 永久设定环境变量
修改 /etc/profile 或者 ~/.bashrc 文件,在其中加入
|
|
2. 临时设定
在进入镜像后手动设置环境变量:
|
|
或者配合 VSCode 的 Remote-Container 插件配置后可以实现每次自动设置,具体方式请移步 Docker 配合 VSC 开发最佳实践
结语
以上就是配置 Docker 容器代理的全部方法,经过实践真实可用