目前docker主要應用于單機環境,使用網橋模式,但如果想把多臺主機網絡互相,讓多臺主機內部的container互相通信,就得使用其他的軟件來幫忙,可以使用Weave、Kubernetes、Flannel、SocketPlane或者openvswitch等,我這里就使用openvswitch來介紹docker多臺主機網絡互通。
先看一個使用openvswitch連接的架構圖,連接的方式是vxlan
說明:
這里有2臺主機,分別是NODEA與NODEB,系統是centos7,內核是3.18(默認centos7內核是3.10,但想使用vxlan,所以得升級,參考http://dl528888.blog.51cto.com/2382721/1609850)
docker是1.3.2版本,存儲引擎是devicemapper。
每臺主機里都有2個網橋ovs1與ovs2,ovs1是管理網絡,連接內網網卡em1,ovs2是數據網絡,docker測試機都連接這個ovs2,并且container創建的時候網絡都是none,使用pipework指定固定ip。
然后2臺主機使用vxlan連接網絡。
重要:
我個人認為使用這個模式并且指定固定ip,適用于的環境主要是給研發或者個人的測試模式,如果是集群環境,沒必要指定固定ip(我這里的集群就沒有使用固定ip,使用動態ip,效果很好,后續給大家介紹集群)。
下面是部署方法
環境
一、安裝openvswitch
我的版本是最新的2.3.1
1、安裝基礎環境
2、下載最新的包
3、解壓與打包
之后會在~/rpmbuild/RPMS/x86_64/里有2個文件
安裝第一個就行
4、安裝
5、啟動
6、查看狀態
可以看到是正常運行狀態
具體的安裝詳細步驟可以參考
https://github.com/openvswitch/ovs/blob/master/INSTALL.RHEL.md與http://www.linuxidc.com/Linux/2014-12/110272.htm
二、部署單機環境的docker
1、下載pipework
使用這個軟件進行固定ip設置
2、在NODEA(ip是10.10.17.3)里運行下面命令
可以把下面內容復制到腳本里運行
根據自己的環境修改上面內容
運行腳本
可以看到已經啟動了2個容器,分別是test1與test2
下面從本地登陸指定的ip試試
登陸后可以看到容器內的ip是指定的,并且能ping另外同一個網段的172.16.0.6,外網也能ping通。
下面進行vxlan測試,需要現在另外一個物理宿主機進行上面的腳本安裝,然后在進行vxlan配置
3、在NODEB(ip是10.10.17.4)里運行
腳本內容是
運行這個腳本
登陸分別的固定ip試試
可以看到結果跟NODEA(10.10.17.3)里運行的一樣,登陸后可以看到容器內的ip是指定的,并且能ping另外同一個網段的172.16.0.9,外網也能ping通
然后在試試能否ping通對方的em1網卡與對方ovs2的ip
4、在NODEA里測試
5、在NODEB里測試
結果也是一樣,能ping通自己的em1與NODEA(10.10.17.3)的em1網卡,并且對方的ovs2的ip也能ping通,但ovs2里的主機無法ping通
6、vxlan設置
在NODEA里運行
在NODEB里運行
現在NODEA與NODEB這2臺物理機的網絡都是互通的,容器的網絡也是互通。
然后在NODEA(10.10.17.3)里ping NODEB(10.10.17.4)的ovs2 ip與容器的ip
可以看到可以在NODEA(10.10.17.3)里ping通NODEB(10.10.17.4)的ovs2 ip與交換機下面的容器ip
如果各自設置vxlan,還是無法連接請看看iptables里是否給ovs1進行了input放行
在NODEB里測試
結果也是一樣,設置了vxlan就可以2個宿主機的所有服務器進行通信。目前是2個節點的vxlan,如果是3個節點呢
7、vxlan多節點應用(超過2個節點)
架構圖為
新節點是NODEC(ip是10.10.21.199)
環境為
部署單機環境,腳本內容是
運行腳本
可以看到可以ping通本地的ovs2 的ip與交換機下面是ip
可以看到能ping通NODEA(10.10.17.3)與NODEB(10.10.17.4)(em1網卡都是走物理交換機),但他們2個的ovs2都無法ping通下面是在NODEC(10.10.21.199)里與10.10.17.3做一個vxlan
然后還需要在NODEA(10.10.17.3)里配置
之前在NODEA(10.10.17.3)里與NODE(10.10.17.4)做的vxlan使用vx1,這里NODEA(10.10.17.3)與NODEC(10.10.21.199)就使用vx2端口
然后在NODEA(10.10.17.3)里ping NODEC(10.10.21.199)的ovs2 ip與交換機下面的ip
可以看到是通的
在NODEC(10.10.21.199)里ping NODEA(10.10.17.3)的ovs2的ip與交換機下面的ip
也是通的,然后從NODEC(10.10.21.199) ping NODEB(10.10.17.4)的ovs2的ip與其交換機的ip
可以看到是通的,平均延遲0.608,并且可以發現使用了vxlan,3個節點,如果想全部互通,只需要2個線連接就行。
如果使用gre模式,3個節點就需要3個線了,架構圖為
目前使用docker結合openvswitch的vxlan模式就把多臺主機的docker連接起來,這樣很多測試就方便很多,但還是建議把這樣的方式作為測試環境。
本文來源:吟—技術交流 的博客 原文鏈接:http://dl528888.blog.51cto.com/2382721/1611491