1. 程式人生 > >Docker學習筆記 — Weave實現跨主機容器互聯

Docker學習筆記 — Weave實現跨主機容器互聯

Docker的原生網路支援非常有限,且沒有跨主機的叢集網路方案。目前實現Docker網路的開源方案有Weave、Kubernetes、Flannel、Pipework以及SocketPlane等,其中Weave被評價為目前最靠譜的,那麼這裡就對Weave的基本原理及使用方法做個總結。

簡介

Weave是由Zett.io公司開發的,它能夠建立一個虛擬網路,用於連線部署在多臺主機上的Docker容器,這樣容器就像被接入了同一個網路交換機,那些使用網路的應用程式不必去配置埠對映和連結等資訊。外部裝置能夠訪問Weave網路上的應用程式容器所提供的服務,同時已有的內部系統也能夠暴露到應用程式容器上。Weave能夠穿透防火牆並執行在部分連線的網路上,另外,Weave的通訊支援加密,所以使用者可以從一個不受信任的網路連線到主機。

這裡寫圖片描述

這裡寫圖片描述

安裝與啟動

直接從github下載二進位制檔案安裝。

# sudo wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
# sudo chmod a+x /usr/local/bin/weave

啟動weave路由器,這個路由器其實也是以容器的形式執行的。

# weave launch
Unable to find image 'zettio/weave' locally
......

此時會發現有兩個網橋,一個是Docker預設生成的,另一個是Weave生成的。
這裡寫圖片描述

這裡寫圖片描述
接下來就可以執行應用容器,使用weave提供的網路功能了。

簡單使用

準備
1. host1: 10.0.2.6
2. host2: 10.0.2.8
3. host1上的應用容器1: 192.168.0.2/24 host1上的應用容器2: 192.168.1.2/24
4. host2上的應用容器1: 192.168.0.3/24
兩臺機上均安裝Docker及Weave,並均啟動好Weave路由容器。

在兩臺機上均啟動一個應用容器。可以直接使用weave run命令,也可以先使用docker run啟動好容器,然後使用weave attach命令給容器繫結IP地址。

# weave run 192.168.0.2/24 -itd ubuntu bash

或者

# docker run -itd ubuntu bash
# weave attach 192.168.0.2/24 $ID

此時發現兩個容器之間是不通的,需要使用weave connect命令在兩臺weave的路由器之間建立連線。

# weave connect 10.0.2.8

會發現,此時位於兩臺不同主機上的容器之間可以相互ping通了。但是處於不同子網的兩個容器是不能互聯的,這樣我們就可以使用不同子網進行容器間的網路隔離了。

我們會發現,如果不使用Docker的原生網路,在容器內部是不能訪問宿主機以及外部網路的。此時我們可以使用weave expose 192.168.0.1/24來給weave網橋新增IP,以實現容器與宿主機網路連通。但是,此時在容器內部依然不能訪問外部網路。
我們可以同時使用Docker的原生網路和weave網路來實現容器互聯及容器訪問外網和埠對映。使用外部網路及埠對映的時候就使用docker0網橋,需要容器互聯的時候就使用weave網橋。每個容器分配兩個網絡卡。

其他特性

  • 應用隔離:不同子網容器之間預設隔離的,即便它們位於同一臺物理機上也相互不通(使用-icc=false關閉容器互通);不同物理機之間的容器預設也是隔離的
  • 安全性:可以通過weave launch -password wEaVe設定一個密碼用於weave peers之間加密通訊
  • 檢視weave路由狀態:weave ps

問題

  1. 容器重啟問題
    如果使用weave,則就不能再使用docker自帶的auto-restart feature(如docker run –restart=always redis),因為weave是在docker之外為容器配置的網路,容器重啟的時候docker本身不會做這些事情。因而,還需額外的工具來管理容器的狀態(比如systemd, upstart等),這些工具要呼叫weave命令(weave run/start/attach)來啟動容器。