docker應用-5(使用overlay 網絡進行容器間跨物理主機通信)

同一個主機上的Docker容器之間通信

docker 引擎會在主機上增加一個docker0網卡,該網卡具有雙重身份:

1.從容器視角,網橋(交換機)身份
docker0 對于運行在同一個主機上的各個容器來說,是二層交換機的角色:洪范,維護CAM表,在二層轉發數據包;同時,docker0 自身也具有MAC地址,并且綁定了IP,因此在容器中還可以作為默認網關存在。
2.從宿主機視角,網卡身份
物理交換機提供了由硬件實現的高效的背板通道,供連接在交換機上的主機高效實現二層通信;對于開啟了三層協議的物理交換機而言,其ip路由的處理 也是由物理交換機管理程序提供的。對于docker0而言,其負責處理二層交換機邏輯以及三層的處理程序其實就是宿主機上的Linux內核 tcp/ip協議棧程序。而從宿主機來看,所有docker0從veth(只是個二層的存在,沒有綁定ipv4地址)接收到的數據包都會被宿主機 看成從docker0這塊網卡接收進來的數據包,尤其是在進入三層時,宿主機上的iptables就會 對docker0進來的數據包按照rules進行相應處理(通過一些內核網絡設置也可以忽略docker0 brigde數據的處理)。

通過,docker0的網橋功能,可以實現在同一個主機上的各個容器之間的通信。

不同主機上的Docker容器之間通信

網上找到一些解決方案:

  1. 使用openvswitch 搭建 xvlan協議隧道
  2. 將多個物理機的容器組到一個物理網絡,這需要在每臺機器上創建自己的網橋br0,然后將docker默認網橋綁定到br0
  3. 使用docker的swarm集群
  4. 使用docker的overlay網絡

swarm集群在上文中已經實現,這里實現方案4,使用docker的overlay網絡。

準備
搭建環境:
(1)物理主機 dev-11 IP=162.10575.113, 上面運行docker容器 host1
(2)物理主機 dev-12 IP=162.105.75.220,上面運行docker容器 host2

1. 安裝并配置consul
Consul 是一個支持多數據中心分布式高可用的服務發現和配置共享的服務軟件,由 HashiCorp 公司用 Go 語言開發, 基于 Mozilla Public License 2.0 的協議進行開源. Consul 支持健康檢查,并允許 HTTP 和 DNS 協議調用 API 存儲鍵值對.

(1)直接從官網下載,并解壓,將二進制文件拷貝到 /usr/local/bin 目錄下即安裝完成,同時創建新文件夾 /opt/consul 用于存放consul運行時產生的文件
(2)在dev-11機器上執行nohup consul agent -server -bootstrap -data-dir /opt/consul -bind=162.105.75.113 &,將dev-11作為server節點
(3)在dev-12機器上執行nohup consul agent -data-dir /opt/consul -bind=162.105.75.220 &,將dev-12作為client節點,然后 consul join dev-11 加入集群。
(4)分別在 dev-11和dev-12上執行,consul members來查看集群中是否有兩個主機。

[root@dev-12 skc]# consul members
Node    Address              Status  Type    Build  Protocol  DC
dev-11  162.105.75.113:8301  alive   server  0.7.5  2         dc1
dev-12  162.105.75.220:8301  alive   client  0.7.5  2         dc1
我在搭建的時候一直出現 500 錯誤,無法建成集群,最后發現是防火墻的原因。**centos 7 下默認防火墻為firewalld,且默認開機啟動,一定要注意!**

2. 配置docker啟動參數

/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \
--cluster-store=consul://localhost:8500 --cluster-advertise=enp1s0:2375

其中 cluster-store 的主機指定為localhost即可,cluster-advertise的ip可以指定為本機的網卡名。

3. 創建overlay網絡
在dev-11上執行,docker network create -d overlay multihost 創建overlay類型網絡multihost。然后

[root@dev-11 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
914e62484c33        bridge              bridge              local
018d41df39c5        docker_gwbridge     bridge              local
0edff5347b33        host                host                local
e7b16dd58248        multihost           overlay             global
1d25e019c111        none                null                local
說明網絡建立成功

此時,在dev-12機器上,

[root@dev-12 skc]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
7af47cbb82c8        bridge              bridge              local
30911dfed7f2        docker_gwbridge     bridge              local
6e6deb4077c4        host                host                local
e7b16dd58248        multihost           overlay             global
dc7f861e601a        none                null                local

說明overlay網絡被同步過去了。

4. 創建容器并測試

[root@dev-11 skc]# docker run -it --name=host1 --net=multihost debugman007/ubt14-ssh:v1 bash

[root@dev-12 skc]# docker run -it --name=host2 --net=multihost debugman007/ubt14-ssh:v1 bash

在host1中,

root@d19636118ead:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:0a:00:00:02  
          inet addr:10.0.0.2  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:aff:fe00:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:24 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1904 (1.9 KB)  TX bytes:2122 (2.1 KB)

eth1      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1018 (1.0 KB)  TX bytes:868 (868.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:970 (970.0 B)  TX bytes:970 (970.0 B)

在host2中
root@7bd8ff1ab133:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:0a:00:00:03  
          inet addr:10.0.0.3  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:aff:fe00:3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:25 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1966 (1.9 KB)  TX bytes:1850 (1.8 KB)

eth1      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:22 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2412 (2.4 KB)  TX bytes:648 (648.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:934 (934.0 B)  TX bytes:934 (934.0 B)

此時,在host1中ping host2

root@d19636118ead:/# ping host1
PING host1 (10.0.0.2) 56(84) bytes of data.
64 bytes from d19636118ead (10.0.0.2): icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from d19636118ead (10.0.0.2): icmp_seq=2 ttl=64 time=0.057 ms
^C
--- host1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.047/0.052/0.057/0.005 ms
root@d19636118ead:/# ping host2
PING host2 (10.0.0.3) 56(84) bytes of data.
64 bytes from host2.multihost (10.0.0.3): icmp_seq=1 ttl=64 time=0.917 ms
64 bytes from host2.multihost (10.0.0.3): icmp_seq=2 ttl=64 time=0.975 ms
64 bytes from host2.multihost (10.0.0.3): icmp_seq=3 ttl=64 time=0.935 ms
^C
--- host2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.917/0.942/0.975/0.034 ms

能夠ping通,說明跨主機的容器搭建完成。

參考

理解Docker單機容器網絡
理解Docker跨多主機容器網絡
基于consul的Docker-overlay跨多宿主機容器網絡

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 概述 自從docker容器出現以來,容器的網絡通信就一直是大家關注的焦點,也是生產環境的迫切需求。而容器的網絡通信...
    糙老爺們兒吃什么櫻桃閱讀 3,650評論 1 5
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,890評論 18 139
  • 轉載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,532評論 0 120
  • 大拇指在屏幕上撥點著,突然用力地按下,迸發出想把屏幕捏碎的心情。 繼而又歸于冷靜。 我們總說,為了遠方我們在如今的...
    曉天曉天閱讀 397評論 1 1