centos7下安裝docker(15.6docker跨主機網絡---Weave)


Weave是weaveworks開發的容器網絡解決方案。weave創建的虛擬網絡可以將部署在多個主機上的容器連接起來。對於容器來說,weave就像一個巨大的網絡交換機,容器可以直接通信,無需NAT和端口映射。除此之外,weave的DNS模塊是容器可以通過hostname訪問

weave不依賴分布式數據庫(例如:consul和etcd)交換網絡信息,每個主機上只需要運行weave組件就能建立起跨主機容器網絡,weave網絡能夠穿透防火牆並運行在部分連接的網絡上,weave支持加密網絡接連,用戶可以從一個不受信任的網絡連接到主機

weave官網地址: https://github.com/weaveworks/weave

開始部署weave:

1.linux內核版本為3.8以上,dockers版本為1.10.0 or later

2.curl -L git.io/weave -o /usr/local/bin/weave

3.更改權限chmod a+x /usr/local/bin/weave

4。初始化weave:weave  launch

注:初始化weave前要保證有 bridge-utils 網橋工具包

初始化weave三個docker容器來輔助運行,會自動下載鏡像

weave:是主程序,負責建立weave網絡,收發數據,提供DNS等服務

 自動創建網橋

自動創建一個docker網絡

driver是weave,subnet是10.32.0.0/12

 

 

分析weave的網絡結構:

1. eval $(weave env)    設置環境變量,這樣通過docker命令行啟動的容器就會自動地連接到weave網絡中了

可執行 eval  $(weave env --restore)恢復之前的環境

2.docker run --name weave1 -itd busybox    注:-itd連用可使普通鏡像運行容器后,容器會保持運行狀態

3.查看weave1容器中得網絡

weave1容器有兩個網絡接口:eth0@if18,從他的IP可以看出是與host上得docker0同屬一個網段,所以還是默認連接在docker0上得

還有一個ethwe@if20,從名稱可以看出ethew與weave相關,他的對應編號是20,我們從host上面通過ip link進行查看

vethwep120768@if19是與ethwe是一對veth pair,而且被掛在了weave上

我們通過ip -d link深入分析一下現在host上得網絡

這里出現了很多新得interface

datapath:是一個openvswitch

 vethwe-datapath@vethwe-bridge:是veth pair

vethwe-datapath:父設備是datapath

 vxlan-6784:是vxlan interface,其maste也是datapath,weave主機之間通過Vxlan節能型通信

host1得網絡結構如下:盜圖

weave網絡包含兩個虛擬交換機:橋接的weave和openvswitch datapath,veth pair :vethwe-bridge將兩者連接在一起。

weave與datapath分工不同,weave負責將容器接入weave網絡,datapath負責在主機間建立vxlan隧道並收發數據

 

我們再運行一個容器

查看weave1的hostname1

weave DNS為容器創建了默認域weave1.weave.local

可以ping通

 

 

Weave的連通性和隔離性

1.之前我們是在docker1上進行的操作,現在我們在docker2上進行同樣的部署weave

2.啟動weave

這里必須指定IP 192.168.7.235這樣docker1和docker2才能加到同一個網絡

設置環境變量,在docker2上運行容器

 eval $(weave env)

docker run -itd --name weave11 busybox

docker2上面的weave11能夠ping通docker1上的weave1

docker1上面的weave1的IP是10.32.0.1/12

docker2上的weave11的IP 是10.44.0.0/12

掩碼是12位的,實際上這個兩個IP 是在同一個subnet10.32.0.0/12.通過docker1和docker2之間的vxlan隧道,2個容器邏輯上在一個LAN中,肯定是能ping通的

 盜圖

 

1.數據包的目的地址是10.32.0.1/12,docker2根據路由表,從ethwe發送出去

2.docker2查詢到目的主機,將數據通過vxlan發送給docker1

3.docker1收到數據,根據目的IP將數據轉發給weave1

 

weave的網絡隔離

默認配置下,weave使用一個大subnet(例如10.32.0.0/12),所有主機的容器都從這個地址空間中分配IP ,因為同屬一個subnet,容器可以直接通信。如果要實現網絡隔離,可以通過換環境變量WEAVE_CIDR為容器分配不同的subnet的IP

注:如果通過-e WEAVE_CIDR ,進入容器后沒有使用新的網段,那么重新設置一下變量 eval $(weave env)

容器分配到的IP 是10.32.2.128/24,無法ping通10.32.0.1

 

 

 

weave如何與外部進行通信

weave是一個私有的xvlan網絡,默認與外部網絡隔離。外部如何才能訪問到weave中的容器呢?

方法是:

1.首先將主機加入到weave網絡

2.然后把主機當作訪問weave網絡的網關。

要將主機加入到weave,執行weave expose

這個ip10.32.0.6會被配置到host上的weave的網橋上

現在docker1的網絡是,如盜圖:

weave網橋位於root namespace,它負責將容器接入weave網絡。給weave配置同一subnet的IP其本質就是將docker1接入weave網絡。docker1現在已經可以直接與同一weave網絡接入容器通信了,無論容器是否在docker1上

 

在docker1上ping同一個host上的容器

pingdocker2上的容器

下面我們看一下,如果host主機沒有加入到weave網絡,是否能ping通自己主機上的容器?

進入docker2上

沒有加入到weave網絡的主機 也無法ping通自己主機上的容器。如果是部署了weave服務可以直接通過weave expose加入到weave網絡,如果沒有部署weave網絡的主機如何與容器進行通信呢?

方法是:將非weave主機的網關指向docker1

如:像docker主機添加路由

 測試后可以ping通

 

 

使用weave網絡,容器是如何方位外網的呢?

我們可以觀察到在weave環境下,我們運行的容器出本地網卡外都有兩個網卡,eth0和weave,我們知道這個eth0是連接docker0用的,所以容器訪問外網就是通過docker0實現的

 

IPAM:

我們在每個主機上通過weave launch使weave獲得subnet后,發現都是10.32.0.0/12網段的,我們也可以自定義subnet,可以通過--ipalloc-range分配特定的subnet

 

weave launch --ipalloc-range 10.2.0.0/16

但是一定要確保每個主機都使用相同的subnet

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM