7C00.ME/houmu 2015-02-12

Docker 网桥设置

Docker使用虚拟网桥 docker0 来连接宿主机和 container 的网络。docker0 默认使用的是 172.17.42.1/16 子网,这个网段和我所在的局域网有冲突,因此需要更改这个配置。Docker 官网文档 Network Configuration - Building your own bridge 给出了一个详细的解决方案。

不过我按照这篇文章操作完之后,却遇到了这样的问题:重启系统之后,docker命令无法正常使用,提示要启动 docker daemon 进程,docker 自启动失败了。查看 docker 自启动的日志文件(sudo less /var/log/upstart/docker.io.log),看到 “bridge not found: bridge0” 的字样多次出现。这时查看一下ifconfig,发现之前按照官网文档创建的 bridge0 不在了。查过资料后得知,通过 brctl 创建的虚拟网桥和用 ifconfig 命令设定的网卡地址一样,系统重启之后所有配置都会丢失,除非写到相应的文件里面。

要解决这个问题,我想过可以在 init.d 下创建一个自启动脚本,在系统启动的时候使用执行文档中提到的一组命令。我也想过修改 docker 的自启动脚本,把这些命令添加到脚本文件的合适位置。不过,我最后采用的做法是利用 interfaces 文件的 pre-up 和 post-down 特性来完成网桥的自动创建。

下面给出完整的操作过程,我用的系统是 Ubuntu 14.04。

  1. 安装 bridge-utils : sudo apt-get install bridge-utils
  2. 停止 docker 的后台进程 : sudo service docker.io stop
  3. 删除 docker0 虚拟网桥: sudo ip link set dev docker0 down ; sudo brctl delbr docker0
  4. 编辑 interfaces 文件 sudo vi /etc/network/interfaces,增加下面的内容(zbr224 是新建网桥的名字,可以换成其他的; address 和 netmask 可以换成其他和自己所在网络不冲突的网段):

    auto zbr224
    iface zbr224 inet static
        address 192.168.224.1
        netmask 255.255.255.0
        pre-up brctl addbr zbr224
        post-down brctl delbr zbr224
    
  5. 编辑 docker 配置文件 sudo vi /etc/default/docker.io,增加或修改 DOCKER_OPTS 字段,如:

    DOCKER_OPTS="-b zbr224"
    
  6. 重启系统。

重启之后再ifconfig,可以看到 zbr224,而docker version正确地输出版本信息,docker正常工作了。