返回文章列表

Docker Swarm 網路外掛設定與實務操作

本文探討 Docker 網路外掛,特別是 Overlay 網路在 Swarm 叢集中的應用。文章涵蓋 Consul 服務發現、Swarm 叢集建立、Overlay 網路建立與使用、跨主機容器通訊測試,以及 Weave Net 的設定與應用,提供完整的實務操作,並輔以程式碼範例和圖表說明。

容器技術 網路管理

在容器化時代,網路管理是建構和維護分散式應用程式的關鍵環節。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 建立跨多台機器的容器網路。圖中描述了各個節點之間的連線關係,以及資料如何在這些節點之間傳輸。這個架構允許容器跨不同的主機進行通訊,從而實作了軟體定義網路的功能。