天天看点

Docker 多宿主互联

在之前的docker简介中介绍了一些docker基础的操作,在涉及到多台不同的宿主机上运行docker时应该如何使他们之间进行通信呢,这是这篇文章的主要内容。

docker 可以使用多种集群的解决方案,如k8s,mesos等,这个将在后面的内容中一一介绍,这里我们将使用docker原生的组件进行连接。

环境准备

两台宿主机,都安装docker. 并下载官方的centos镜像。

网络配置

在宿主机node1和node2上分别查看默认的docker0网络:

1

2

3

4

5

<code>node1:</code>

<code>docker0: &lt;NO-CARRIER,BROADCAST,MULTICAST,UP&gt; mtu 1500 qdisc noqueue state DOWN </code>

<code>    </code><code>link</code><code>/ether</code> <code>02:42:c2:a4:d3:e0 brd ff:ff:ff:ff:ff:ff</code>

<code>    </code><code>inet 172.17.0.1</code><code>/16</code> <code>scope global docker0</code>

<code>       </code><code>valid_lft forever preferred_lft foreve</code>

<code>node2:</code>

<code>    </code><code>link</code><code>/ether</code> <code>02:42:2e:be:83:69 brd ff:ff:ff:ff:ff:ff</code>

<code>       </code><code>valid_lft forever preferred_lft forever</code>

两个内部的网段相同,如果创建容器,两个网络肯定无法互联,所以我们修改默认docker0网络,并且使这两个网络不会和外部的网络冲突。

在node2上的 /usr/lib/systemd/system/docker.service 文件中ExecStart=区域添加参数:

<code>--bip=10.10.0.1</code><code>/16</code> <code>\</code>

重启docker服务。

分别在node1和node2上创建容器:

<code>docker run -it --name test1 centos  </code><code>bash</code>

<code>docker run -it --name test2 centos  </code><code>bash</code>

这时test1的ip地址为172.17.0.2, test2的地址为10.10.0.2, 两个虚拟机都是走的宿主机的内部nat,所以依然无法通信。

而容器到node1和node2宿主机都是可以正常通信的,由于我们都是设置的不同网段,所以可以在每个宿主机上单独添加一条静态路由,指定数据包的流向:

node1:

<code>route add -net 10.10.0.0</code><code>/16</code> <code>gw 192.168.56.12</code>

node2:

<code>route add -net 172.17.0.0</code><code>/16</code> <code>gw 192.168.56.11</code>

这样不同宿主机上的容器就可以互联了。

这种方式虽然简单高效,但是如果是大规模的docker集群,会难以维护,同时由于docker容器都在不同宿主机的不同网段,需要使用网络组播和广播交互的服务就无法跨主机通信了

 本文转自 酥心糖 51CTO博客,原文链接:http://blog.51cto.com/tryingstuff/1945943