最近在学习Docker,需要将局域网中不同机器上运行的Docker网络调通,打算使用桥接的方式。下面记录了一些相关的操作及遇到的问题和解决方法。
1. 安装bridge-utils(系统为Ubuntu 15.04)
apt-get install -y bridge-utils
2. 停掉Docker服务
systemctl stop docker.service
3. 删除Docker创建的默认虚拟网卡
ip link set dev docker0 down
brctl delbr docker0
4. 修改网卡的配置文件
vi /etc/network/interfaces
auto p1p1
iface p1p1 inet static
address 10.0.40.11
netmask 255.255.255.0
network 10.0.40.0
broadcast 10.0.40.255
gateway 10.0.40.1
dns-nameservers 114.114.114.114
将上面的内容修改为(完整配置):
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
auto p1p1
iface p1p1 inet manual
auto br0
iface br0 inet static
address 10.0.40.11
network 10.0.40.0
netmask 255.255.255.0
broadcast 10.0.40.255
gateway 10.0.40.1
bridge_ports p1p1
dns-nameservers 114.114.114.114
# bridge_stp off
bridge_fd 0
bridge_maxwait 0
5. 重启网卡
/etc/network/networking restart
重启之后,执行 ifconfig ,可以看到会存在一个br0的虚拟网卡
6. 修改docker的桥接配置
echo 'DOCKER_OPTS="-b=br0"' >> /etc/default/docker
systemctl start docker.service
OK,现在桥接已经配置,Docker的桥接已经绑定到br0上了。
遇到的问题:由于参照网上关于网卡桥接的配置,几乎所有的资料都说需要在 /etc/network/interfaces中br0的配置中有一行: bridge_stp off ,但是每次修改配置文件,重启网卡后,网络就会不通,有时还能通几秒,可以执行几条命令,但是随后又会断网(MD,在逗我玩呢!)。然后,我花了整整一天时间在寻找问题所在,包括检查路由、IP和网关设置、Mac地址绑定等等,但是还是会断网。
最后,查了不知多少资料,偶然在http://blog.csdn.net/cybertan/article/details/8160102中看到一个关于STP的说明:
建立bridge后的状态是让网络接口eth0进入混杂模式(promiscuous mode,接收网络中所有数据包),网桥br0进入转发状态(forwarding state),而且br0和eth0有相同的MAC地址,一般也会得到和eth0相同的IP。“brctl stp br0 on”是打开br0的STP协议,STP是生成树协议(Spanning Tree Protocol),它主要是为了避免在建有bridge的以太网LAN中出现桥回路(bridge loop)。如果不打开STP,则可能出现回路从而导致建有bridge的主机网络不畅通。
所以,瞬间明白为什么网络不通了:在服务器内部成环了!于是果断将:bridge_stp off 一行注释掉(后来发现应该改成:bridge_stp no),再重启网卡,瞬间网络就通了,但是我后面又在几台机器上测试了,貌似还是不行,重启系统后,桥接就没问题了。不过,后来又发现:貌似bridge_stp on/no,都对桥接影响不大,反正就是需要重启系统。被这个问题折腾了两三天,故在此备忘,也希望能帮助到遇到同样问题的同学。