同一個主機上的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容器之間通信
網上找到一些解決方案:
- 使用openvswitch 搭建 xvlan協議隧道
- 將多個物理機的容器組到一個物理網絡,這需要在每臺機器上創建自己的網橋br0,然后將docker默認網橋綁定到br0
- 使用docker的swarm集群
- 使用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跨多宿主機容器網絡