0%

最近在玩docker,由于众所周知的原因,在国内访问海外的网站速度会很慢,在docker内的表现是git clone和apt install缓慢。这个问题的常见解决方法是换源、挂代理。这里我使用了挂代理的方式解决,主要是考虑比较通用,不需要给每个工具配置一遍源。

在container里面挂代理,需要确定container是如何和host的网络通信的。实际上,在host有一个docker0的虚拟网卡,用于container和host通信,可以这么查看:

1
2
3
4
5
6
7
8
# host
$ ip addr show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:64:51:fb:47 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
inet6 fe80::42:64ff:fe51:fb47/64 scope link
valid_lft forever preferred_lft forever

在container内,我们同样观察一下网络的路由配置:

1
2
3
4
# container
$ ip route show
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 src 172.17.0.4

可以发现container的ip包默认会转发到172.17.0.1,这正是host的docker0网卡配置的ip。至此,我们确定了container和host通信的ip地址。

为了让host允许container访问所有port,需要修改host的ip路由表:

1
2
# host
iptables -A INPUT -i docker0 -j ACCEPT

假设在host已经配置了一个可用的代理地址127.0.0.1:7890,那么container访问这个代理就需要使用172.17.0.1:7890。

在container可以如此配置代理:

1
2
export http_proxy=http://172.17.0.1:7890
export https_proxy=http://172.17.0.1:7890

这样设置后,运行curl www.google.com成功,就说明代理生效了。通过设置这两个变量后,apt install和git clone也成功挂上了代理。

参考: