Docker Build 配置代理

好像拖更有点久,我记得上一次写文章还是在上一次……

最近好多服务都开始用自己手搓的容器了,由于众所周知的原因,拉取很多项目的代码的体验会很差,在build阶段挂上代理就显得很重要了。

设备及软件说明

本次演示使用的计算机操作系统为 Ubuntu 22.04LTS ,其他操作系统的方法基本一致。

软件方面有如下配置:

  • Docker version 24.0.7
  • Docker Compose version v2.22.0
  • 本机HTTP代理软件,默认监听本机的所以网卡的8080端口
  • ufw
  • ufw-docker (一个用于解决docker导致ufw防火墙失效的小工具)

实验过程

本次实验以 Caddy2 的容器为例

确认docker默认网卡的配置

通常情况下Linux的Docker默认网卡名为 docker0 ,默认IP及其网段信息一般情况下是 172.17.0.1/16 ,在运行build命令时临时容器将会在这张网卡的网段下,所以需要明确这张网卡的配置信息,以方便后续配置本地HTTP代理的地址,以及如果你跟我一样开启了防火墙的情况下开放端口使用。

首先可以运行以下命令查看网卡信息

ip a show docker0

你会得到类似如下的输出

xianyu@book:/home/xianyu $ ip a show docker0
14: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

如果你不打算修改默认配置的话就可以看下一节了,但如果你觉得默认网段有问题(不少企业网络会使用172的网段作为内网的地址段,会有比较大的概率冲突),那么就可以修改默认的网段。

修改默认网段

修改默认网段的方法非常简单,只需向 /etc/docker/daemon.json 中添加如下配置

{
    "bip":"10.233.0.1/24"
}

并重启docker即可

systemctl restart docker

同样的,重启后通过以下命令验证网段是否修改成功

xianyu@book:/home/xianyu $ ip a show docker0
14: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 10.233.0.1/24 brd 10.233.0.255 scope global docker0
       valid_lft forever preferred_lft forever

开放防火墙端口

由于目前IPv6的逐渐普及,计算机不开放防火墙会有极大的安全风险,所以在我的本地环境中是启用防火墙的

在上一节中我们提到了默认网卡的网段问题,此时我们可以知道默认网卡的网段为 10.233.0.0/24 本机作为网关在这个网段中的地址为 10.233.0.1

我们希望这个网段中的容器可以访问本机的HTTP代理服务,即我们需要添加一条ufw规则以允许来自 10.233.0.0/24 的请求访问 10.233.0.1:8080 ,具体的ufw命令如下

ufw allow from 10.233.0.0/24 to 10.233.0.1 port 8080

编辑Dockerfile

做好上述准备我们就可以开始配置容器的HTTP代理了

本次实际案例为编译一个包含自定义插件的Caddy2容器,依照官方文档原始的Dockerfile长这样:

FROM caddy:builder AS builder

RUN xcaddy build \
    --with github.com/caddy-dns/cloudflare

FROM caddy

COPY --from=builder /usr/bin/caddy /usr/bin/caddy

可以看到在 RUN 当中我们需要从Github拉取我们需要的代码,但实际上由于网络环境问题很难正常拉取到,此时我们可以在这里加入HTTP代理的变量使其拉取时走本机的代理

FROM caddy:builder AS builder

ENV http_proxy=http://10.233.0.1:8080
ENV https_proxy=http://10.233.0.1:8080

RUN xcaddy build \
    --with github.com/caddy-dns/cloudflare

FROM caddy

COPY --from=builder /usr/bin/caddy /usr/bin/caddy

经过上述处理即可愉快的手搓容器了。


Docker Build 配置代理
https://blog.xianyu.one/2023/11/03/docker/docker-build-proxy/
作者
咸鱼
发布于
2023年11月3日
许可协议