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數據的處理)。css

經過,docker0的網橋功能,能夠實如今同一個主機上的各個容器之間的通訊。nginx

不一樣主機上的Docker容器之間通訊

網上找到一些解決方案:docker

  1. 使用openvswitch 搭建 xvlan協議隧道
  2. 將多個物理機的容器組到一個物理網絡,這須要在每臺機器上建立本身的網橋br0,而後將docker默認網橋綁定到br0
  3. 使用docker的swarm集羣
  4. 使用docker的overlay網絡

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

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

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

(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啓動參數less

在配置文件/lib/systemd/system/docker.service 中,
ssh

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

其中 cluster-store 的主機指定爲localhost便可,cluster-advertise的ip能夠指定爲本機的網卡名。tcp

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跨多宿主機容器網絡

相關文章
相關標籤/搜索