在容器化時代,網路管理是建構和維護分散式應用程式的關鍵環節。Docker Swarm 作為容器協調平台,仰賴網路外掛來確保容器之間的順暢溝通。本文將探討 Docker 網路外掛,特別是 Overlay 網路,如何在 Swarm 叢集中實作跨主機容器通訊。我們將逐步講解 Consul 服務發現的佈署、Swarm 叢集的建立,以及 Overlay 網路的建立和使用,並輔以實際操作範例和程式碼片段。此外,還會介紹 Weave Net 這個成熟的軟體定義網路服務,說明其在 Docker 生態系統中的應用,以及如何利用其建立跨主機的容器網路。最後,透過圖表說明,更清晰地呈現網路架構和容器之間的連線關係,幫助讀者理解 Docker 網路外掛的運作機制。

網路外掛詳解與實務操作

在現代化的容器化佈署中,網路外掛扮演著至關重要的角色。Docker Swarm 叢集的建立與管理,更是離不開網路外掛的支援。本章節將探討 Docker 網路外掛的使用,以及如何在 Swarm 叢集中建立和組態 overlay 網路。

Consul 服務發現機制的佈署

首先,我們需要佈署 Consul 作為服務發現機制。Consul 不僅提供服務註冊與發現功能,還支援健康檢查和鍵值儲存等功能。

docker $(docker-machine config service-discovery) run -d \
-p "8400:8400" \
-p "8500:8500" \
-h "consul" \
russmckendrick/consul agent -data-dir /data -server -bootstrap-expect 1 -ui-dir /ui -client=0.0.0.0

內容解密:

  • docker $(docker-machine config service-discovery) run -d:在指定的 Docker 主機上以後台模式執行容器。
  • -p "8400:8400" -p "8500:8500":將容器的 8400 和 8500 連線埠對映到主機的相同連線埠,用於 Consul 的 RPC 和 HTTP API 服務。
  • -h "consul":設定容器主機名為 “consul”。
  • russmckendrick/consul:使用的 Consul 容器映象。
  • agent -data-dir /data -server -bootstrap-expect 1 -ui-dir /ui -client=0.0.0.0:啟動 Consul agent 並組態為伺服器模式,預期一個伺服器節點,啟用 Web UI,並監聽所有網路介面。

Swarm 叢集的建立

接下來,我們將建立 Docker Swarm 叢集。首先,建立 Swarm master 節點:

docker-machine create \
--driver digitalocean \
--digitalocean-access-token sdnjkjdfgkjb345kjdgljknqwetkjwhgoih314rjkwergoiyu34rjkherglkhrg0 \
--digitalocean-region lon1 \
--digitalocean-size 1gb \
--digitalocean-private-networking \
--swarm --swarm-master \
--swarm-discovery="consul://$(docker-machine ip service-discovery):8500" \
--engine-opt="cluster-store=consul://$(docker-machine ip service-discovery):8500" \
--engine-opt="cluster-advertise=eth1:2376" \
chapter04-00

內容解密:

  • --swarm --swarm-master:建立 Swarm master 節點。
  • --swarm-discovery="consul://$(docker-machine ip service-discovery):8500":指定 Consul 作為服務發現機制。
  • --engine-opt="cluster-store=consul://$(docker-machine ip service-discovery):8500":組態 Docker Engine 使用 Consul 作為叢集儲存。
  • --engine-opt="cluster-advertise=eth1:2376":指定 Docker Engine 對外通告的位址和連線埠。

Overlay 網路的建立與使用

在 Swarm 叢集建立完成後,我們可以建立 overlay 網路來實作跨主機的容器通訊。

docker network create --driver overlay --subnet=10.0.9.0/24 chapter04-overlay-network

內容解密:

  • --driver overlay:指定網路驅動為 overlay,用於跨主機通訊。
  • --subnet=10.0.9.0/24:定義網路的子網範圍。

接著,我們可以在該網路上啟動容器,並驗證跨主機的容器間通訊。

docker run -itd \
--name=chapter04-web \
--net=chapter04-overlay-network \
-p 80:80 \
--env="constraint:node==chapter04-01" \
russmckendrick/nginx

內容解密:

  • --net=chapter04-overlay-network:將容器連線到指定的 overlay 網路。
  • --env="constraint:node==chapter04-01":將容器排程到指定的 Swarm 節點。

跨主機容器通訊測試

我們可以透過在不同節點上啟動容器,並使用 wgetping 命令來測試跨主機的容器間通訊。

docker run -it \
--rm \
--net=chapter04-overlay-network \
--env="constraint:node==chapter04-02" \
russmckendrick/base wget -q -O- http://chapter04-web

內容解密:

  • --rm:容器離開後自動刪除。
  • wget -q -O- http://chapter04-web:從 NGINX 容器取得網頁內容。

網路外掛

跨主機網路的組建與應用

在前面的章節中,我們已經探討瞭如何使用 Docker Swarm 來建立跨主機的容器叢集。現在,我們將進一步深入瞭解如何利用 Docker 的網路功能來實作跨主機的容器間通訊。

使用 Overlay 網路

當我們在 Docker Swarm 叢集中建立 Overlay 網路時,Docker 會自動處理容器間的連線問題,無需再使用 --link 引數來手動連結容器。這是因為 Docker 預設所有在同一 Overlay 網路中的容器都可以互相通訊。

docker network create --driver overlay my-overlay-network

網路組態與安全

Docker 還為容器組態了預設的閘道,以便將流量路由到 Overlay 網路以外。如果需要建立一個僅限內部的網路,可以使用 --internal 旗標。

docker network create --driver overlay --internal my-internal-network

使用 Consul 進行服務發現

在我們的範例中,Consul 服務發現容器一直在背景執行。回到 Consul 的網頁介面,我們可以看到 Docker Swarm 叢集中的節點列表。

使用 Docker Compose 佈署 WordPress

現在,讓我們使用 Docker Compose 來佈署 WordPress 叢集。我們將建立兩個 Overlay 網路:wpoutsidewpinsidewpoutside 網路將具有外部存取權,而 wpinside 網路則是內部網路,不允許外部存取。

建立 Overlay 網路

docker network create --driver overlay --subnet=10.0.10.0/24 wpoutside
docker network create --driver overlay --internal --subnet=10.0.11.0/24 wpinside

Docker Compose 設定檔

以下是我們的 docker-compose.yml 檔案:

version: '2'
services:
  wordpress:
    container_name: my-wordpress-app
    image: wordpress
    ports:
      - "80:80"
    networks:
      - wpoutside
      - wpinside
    environment:
      - "WORDPRESS_DB_HOST=mysql:3306"
      - "WORDPRESS_DB_PASSWORD=password"
      - "constraint:node==chapter04-01"
    volumes:
      - "uploads:/var/www/html/wp-content/uploads/"
  mysql:
    container_name: my-wordpress-database
    image: mysql
    networks:
      - wpinside
    environment:
      - "MYSQL_ROOT_PASSWORD=password"
      - "constraint:node==chapter04-02"
    volumes:
      - "database:/var/lib/mysql"
volumes:
  uploads:
    driver: local
  database:
    driver: local
networks:
  wpoutside:
    external: true
  wpinside:
    external: true

啟動 WordPress 叢集

docker-compose up -d

驗證容器狀態

docker-compose ps
docker ps

檢查容器 IP 位址

docker inspect my-wordpress-app | grep IPAddress
docker inspect my-wordpress-database | grep IPAddress

測試容器間通訊

docker exec my-wordpress-app ping -c 3 google.com
docker exec my-wordpress-app ping -c 3 my-wordpress-database
docker exec my-wordpress-database ping -c 3 my-wordpress-app
docker exec my-wordpress-database ping -c 3 google.com

程式碼詳解:

以上程式碼展示瞭如何使用 Docker Compose 來佈署 WordPress 叢集,並利用 Overlay 網路實作跨主機的容器間通訊。

  1. Overlay 網路建立:使用 docker network create 命令建立兩個 Overlay 網路:wpoutsidewpinside

    • wpoutside 網路具有外部存取權。
    • wpinside 網路是內部網路,不允許外部存取。
  2. Docker Compose 設定:在 docker-compose.yml 檔案中定義了兩個服務:wordpressmysql

    • wordpress 服務使用 wordpress 映象,並映射了 80:80 連線埠。
    • mysql 服務使用 mysql 映象。
    • 兩個服務都連線到 wpinside 網路,但只有 wordpress 服務連線到 wpoutside 網路。
  3. 環境變數設定:在 docker-compose.yml 檔案中設定了環境變數,例如 WORDPRESS_DB_HOSTMYSQL_ROOT_PASSWORD

  4. 容器啟動與驗證:使用 docker-compose up -d 命令啟動 WordPress 叢集,並使用 docker-compose psdocker ps 命令驗證容器狀態。

  5. IP 位址檢查與通訊測試:使用 docker inspect 命令檢查容器的 IP 位址,並使用 docker exec 命令測試容器間的通訊。

圖表說明:

此圖示展示了 WordPress 叢集的架構,包括兩個 Overlay 網路和相關的容器。

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 圖表說明:

rectangle "HTTP/HTTPS" as node1
rectangle "Database Query" as node2
rectangle "External Access" as node3
rectangle "Internal Network" as node4

node1 --> node2
node2 --> node3
node3 --> node4

@enduml

圖表翻譯: 此圖表展示了 WordPress 叢集的網路架構。使用者端透過 HTTP/HTTPS 存取 WordPress 容器,WordPress 容器再與 MySQL 容器進行資料函式庫查詢。WordPress 容器同時具有外部存取權,可以存取網際網路。兩個容器都位於 wpinside 網路中,而 WordPress 容器還位於 wpoutside 網路中,以實作外部存取。

網路外掛

Weave Net 與 Scope 簡介

Weave Net 是由 Weaveworks 開發的成熟軟體定義網路服務,是最早期的 Docker 網路工具之一。它能夠在混合雲、虛擬機器和裸機上建立容器軟體定義網路(SDN),支援多種流量型別。

Weave Net 的主要功能

Weave Net 提供了兩種驅動程式:

  • Weave Mesh:本地範圍驅動程式,無需叢集儲存即可運作,可用於建立跨非叢集機器的網路。
  • Weave:全域範圍驅動程式,可與 Docker Swarm 和 Docker Compose 配合使用,需要叢集儲存。

組態叢集

要使用 Weave,首先需要建立服務發現例項和 Swarm 叢集。

建立服務發現主機

使用 Docker Machine 建立服務發現主機:

docker-machine create \
  --driver digitalocean \
  --digitalocean-access-token sdnjkjdfgkjb345kjdgljknqwetkjwhgoih314rjkwergoiyu34rjkherglkhrg0 \
  --digitalocean-region lon1 \
  --digitalocean-size 512mb \
  --digitalocean-private-networking \
  service-discovery

執行 Consul 代理程式:

docker $(docker-machine config service-discovery) run -d \
  -p "8400:8400" \
  -p "8500:8500" \
  -h "consul" \
  russmckendrick/consul agent -data-dir /data -server -bootstrap-expect 1 -client=0.0.0.0

建立 Swarm 叢集

建立 Swarm 主節點:

docker-machine create \
  --driver digitalocean \
  --digitalocean-access-token sdnjkjdfgkjb345kjdgljknqwetkjwhgoih314rjkwergoiyu34rjkherglkhrg0 \
  --digitalocean-region lon1 \
  --digitalocean-size 1gb \
  --digitalocean-private-networking \
  --swarm --swarm-master \
  --swarm-discovery="consul://$(docker-machine ip service-discovery):8500" \
  --engine-opt="cluster-store=consul://$(docker-machine ip service-discovery):8500" \
  --engine-opt="cluster-advertise=eth1:2376" \
  chapter04-00

建立 Swarm 工作節點:

docker-machine create \
  --driver digitalocean \
  --digitalocean-access-token sdnjkjdfgkjb345kjdgljknqwetkjwhgoih314rjkwergoiyu34rjkherglkhrg0 \
  --digitalocean-region lon1 \
  --digitalocean-size 1gb \
  --digitalocean-private-networking \
  --swarm \
  --swarm-discovery="consul://$(docker-machine ip service-discovery):8500" \
  --engine-opt="cluster-store=consul://$(docker-machine ip service-discovery):8500" \
  --engine-opt="cluster-advertise=eth1:2376" \
  chapter04-01

docker-machine create \
  --driver digitalocean \
  --digitalocean-access-token sdnjkjdfgkjb345kjdgljknqwetkjwhgoih314rjkwergoiyu34rjkherglkhrg0 \
  --digitalocean-region lon1 \
  --digitalocean-size 1gb \
  --digitalocean-private-networking \
  --swarm \
  --swarm-discovery="consul://$(docker-machine ip service-discovery):8500" \
  --engine-opt="cluster-store=consul://$(docker-machine ip service-discovery):8500" \
  --engine-opt="cluster-advertise=eth1:2376" \
  chapter04-02

檢查 Swarm 叢集狀態:

eval $(docker-machine env --swarm chapter04-00)
docker info

安裝和組態 Weave

在 Swarm 主節點上安裝 Weave:

docker-machine ssh chapter04-00 'curl -L git.io/weave -o /usr/local/bin/weave; chmod a+x /usr/local/bin/weave'

啟動 Weave:

docker-machine ssh chapter04-00 weave launch --init-peer-count 3

安裝與啟動 Weave 的作用與邏輯

安裝 Weave 的目的是為了提供一個軟體定義的網路服務,允許跨多台機器的容器進行通訊。啟動 Weave 時,--init-peer-count 3引數指定了初始的節點數量為3,這樣可以確保 Weave 網路能夠正確地初始化並且具有足夠的容錯能力。

詳細內容解密:

  1. 安裝 Weave:下載 Weave 二進位制檔案並賦予執行許可權。
  2. 啟動 Weave:使用 weave launch 命令啟動 Weave 網路,並指定初始節點數量。
  3. --init-peer-count 3:這個引數告訴 Weave 在初始化時應該期待多少個節點,這有助於 Weave 正確地建立網路拓撲。

圖表翻譯:

此圖示展示了 Weave 網路的架構,包括多個節點之間的連線和通訊路徑。 圖表翻譯: Weave 網路架構圖展示瞭如何透過 Weave 建立跨多台機器的容器網路。圖中描述了各個節點之間的連線關係,以及資料如何在這些節點之間傳輸。這個架構允許容器跨不同的主機進行通訊,從而實作了軟體定義網路的功能。