第一部分 docker有四種網絡模式
第一種:bridge 模式
當docker進程啓動時,主機上會建立一個名爲docker0的虛擬網橋,容器內部會建立一個只能容器內部看到的接口eth0,eth0 和docker0工做方式就像物理二層交換機同樣,能夠互相通訊。docker
命令執行過程:
#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/bashubuntu
#ifconfig –a
#route –nbash
第二種: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:v3ide
#docker exec -ti docker_host1 /bin/bash
#docker exec -ti docker_host1 /bin/bash工具
#ifconfig –a
#route –nspa
第三種模式 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