最近在学习Docker,需要将局域网中不同机器上运行的Docker网络调通,打算使用桥接的方式。下面记录了一些相关的操作及遇到的问题和解决方法。

    1. 安装bridge-utils(系统为Ubuntu 15.04)

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地址绑定等等,但是还是会断网。

建立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 offbridge_stp no),再重启网卡,瞬间网络就通了,但是我后面又在几台机器上测试了,貌似还是不行,重启系统后,桥接就没问题了。不过,后来又发现:貌似bridge_stp on/no,都对桥接影响不大,反正就是需要重启系统。被这个问题折腾了两三天,故在此备忘,也希望能帮助到遇到同样问题的同学。