分析     

       在同一宿主机下的Docker的容器之间是默认互相联通的。通过docker inspect id或name可以查看到ip地址。在不通的容器中来执行ping是可以ping通的。但我们通过观察发现,每一个启动容器的ip地址不是固定的,所以如果我们通过ip地址来实现互连明显是不靠谱的。但我们发现这些ip又处于同一网段中而且默认是127.0.0.X,这就是Docker容器默认跨主机之间的链接方法的第一种:网桥实现

       在docker宿主机上运行ifconfig命令可以看的存在一个docker0的网桥。Docker容器通过docker0 网桥实现同一主机间中,容器的ip地址分配和访问,所以,如果希望Docker跨主机访问,最简单的方式就是将不同主机的docker0 设置为同一网段。整体网络拓扑结构就是这样:

docker网络可以路主机网络一样吗 docker跨主机网络_docker网络可以路主机网络一样吗

但是通过这种桥接,所有网卡都要在一个网段下,所以要对每个Docker守护进程对ip的分配做出限制。下面,我们就来实现这个结构:

实践

两台Ubuntu 的 ip:

       Host1 : 10.211.55.3 网卡:eth0

       Host2 :10.211.55.5 网卡 eth1

       网关:10.211.55.1

对容器ip的划分:

       Host1: 10.211.55.64/26

       地址范围: 10.211.55.65~10.211.55.126

       Host2: 10.211.55.128/26

       地址范围: 10.211.55.129~10.211.55.190

以下,以Host1 为例,Host2 上操作相似,只是网卡名字不一样,我在这里,没有我们不使用默认的docker0 网桥,而是自己新建一个网桥:

1. 首先安装bridge-utils工具包
$ sudo apt-get install bridge-utils

然后可以用 “brctl show” 来查看当前网桥信息,可以看到目前只有一个 docker0

$ brctl show  
bridge name bridge id       STP enabled interfaces  
docker0     8000.56847afe9799   no
2. 然后创建一个网桥 br0
$ sudo brctl addbr br0  
$ sudo ip addr add 192.168.66.1/24 dev br0  
$ sudo ip link set dev br0 up

添加后可以用 “brctl show” 来查看


$ brctl show  
bridge name bridge id       STP enabled interfaces  
br0     8000.000000000000   no       
docker0     8000.56847afe9799   no
3. 编辑 /etc/default/docker.io 文件,添加如下Docker参数,是Docker默认使用上面新添加的网桥
DOCKER_OPTS="-b=br0"
4. 重启docker服务
sudo service docker.io restart
5. 新建一个容器,可以看到它已经桥接到了 br0 上了
6. 最后,如果要删除网桥,可以
$ sudo ip link set dev br0 down  
$ sudo brctl addbr br0

总结

       优点


              1. 配置简单,不依赖第三方软件


       缺点


              1. 与主机在同网段,需要小心划分ip地址


              2. 需要有网段控制权,在生产环境中不易实现


              3. 不容易管理


              4. 兼容性不佳