1. 程式人生 > >docker同宿主機容器和不同宿主機容器之間怎麽通信?

docker同宿主機容器和不同宿主機容器之間怎麽通信?

roc 網卡 命令執行 ip) oss namespace 跨主機通信 進行 work

第一部分 docker有四種網絡模式
第一種:bridge 模式
當docker進程啟動時,主機上會創建一個名為docker0的虛擬網橋,容器內部會創建一個只能容器內部看到的接口eth0,eth0 和docker0工作方式就像物理二層交換機一樣,可以互相通信。

技術分享圖片

命令執行過程:
#docker run -tid --net=bridge --name docker_bri1 ubuntu-base:v3
#docker run -tid --net=bridge --name docker_bri2 ubuntu-base:v3

#brctl show
#docker exec -ti docker_bri1 /bin/bash

#docker exec -ti docker_bri1 /bin/bash

#ifconfig –a
#route –n

第二種:host模式
容器啟動時候用host模式,那麽容器不會像第一張那樣有個獨立Network NameSpace。而是和主機共享一個Network NameSpace。
使用宿主機的ip和端口,但是容器的系統,進程列表等還是和主機隔離。

技術分享圖片

命令執行:
#docker run -tid --net=host --name docker_host1 ubuntu-base:v3
#docker run -tid --net=host --name docker_host2 ubuntu-base:v3

#docker exec -ti docker_host1 /bin/bash
#docker exec -ti docker_host1 /bin/bash

#ifconfig –a
#route –n

第三種模式 Container
congtainer容器指定和已經存在的容器共享一個network namespace。
不配置ip,指一個已經存在容器共享ip,其他
技術分享圖片

第四種:none模式
none模式,Docker容器擁有自己的Network Namespace,但是,並不為Docker容器進行任何網絡配置。

技術分享圖片
#docker run -tid --net=none --name docker_non1 ubuntu-base:v3

#docker exec -ti docker_non1 /bin/bash

#ifconfig –a
#route -n

第二部分 跨主機通信
單臺主機上面的docker容器通過docker0來通信。不同主機上面的容器只能在主機上做端口映射來完成。種端口映射方式對很多集群應用來說極不方便。

方法一:現在用docker主機上添加靜態路由直接實現跨宿主機容器之間通信:
技術分享圖片

方法二:借助pipework容器網絡配置工具。
通過使用ip、brctl、ovs-vsctl等命令來為Docker容器配置自定義的網橋、網卡、路由等。

使用新建的bri0網橋代替缺省的docker0網橋

技術分享圖片

第三種:Flannel(Flannel + UDP 或者 Flannel + VxLAN)

Flannel實現的容器的跨主機通信通過如下過程實現:

每個主機上安裝並運行etcd和flannel;
在etcd中規劃配置所有主機的docker0子網範圍;
每個主機上的flanneld根據etcd中的配置,為本主機的docker0分配子網,保證所有主機上的docker0網段不重復,並將結果(即本主機上的docker0子網信息和本主機IP的對應關系)存入etcd庫中,這樣etcd庫中就保存了所有主機上的docker子網信息和本主機IP的對應關系;
當需要與其他主機上的容器進行通信時,查找etcd數據庫,找到目的容器的子網所對應的outip(目的宿主機的IP);
將原始數據包封裝在VXLAN或UDP數據包中,IP層以outip為目的IP進行封裝;
由於目的IP是宿主機IP,因此路由是可達的;
VXLAN或UDP數據包到達目的宿主機解封裝,解出原始數據包,最終到達目的容器

技術分享圖片

#/opt/bin/etcdctl get /coreos.com/network/config
#/opt/bin/etcdctl ls /coreos.com/network/subnets
#/opt/bin/etcdctl get /coreos.com/network/subnets/172.16.49.0-24

docker同宿主機容器和不同宿主機容器之間怎麽通信?