在容器化時代,網路管理是建構和維護分散式應用程式的關鍵環節。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 節點。
跨主機容器通訊測試
我們可以透過在不同節點上啟動容器,並使用 wget 或 ping 命令來測試跨主機的容器間通訊。
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 網路:wpoutside 和 wpinside。wpoutside 網路將具有外部存取權,而 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 網路實作跨主機的容器間通訊。
Overlay 網路建立:使用
docker network create命令建立兩個 Overlay 網路:wpoutside和wpinside。wpoutside網路具有外部存取權。wpinside網路是內部網路,不允許外部存取。
Docker Compose 設定:在
docker-compose.yml檔案中定義了兩個服務:wordpress和mysql。wordpress服務使用wordpress映象,並映射了80:80連線埠。mysql服務使用mysql映象。- 兩個服務都連線到
wpinside網路,但只有wordpress服務連線到wpoutside網路。
環境變數設定:在
docker-compose.yml檔案中設定了環境變數,例如WORDPRESS_DB_HOST和MYSQL_ROOT_PASSWORD。容器啟動與驗證:使用
docker-compose up -d命令啟動 WordPress 叢集,並使用docker-compose ps和docker ps命令驗證容器狀態。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 網路能夠正確地初始化並且具有足夠的容錯能力。
詳細內容解密:
- 安裝 Weave:下載 Weave 二進位制檔案並賦予執行許可權。
- 啟動 Weave:使用
weave launch命令啟動 Weave 網路,並指定初始節點數量。 --init-peer-count 3:這個引數告訴 Weave 在初始化時應該期待多少個節點,這有助於 Weave 正確地建立網路拓撲。
圖表翻譯:
此圖示展示了 Weave 網路的架構,包括多個節點之間的連線和通訊路徑。 圖表翻譯: Weave 網路架構圖展示瞭如何透過 Weave 建立跨多台機器的容器網路。圖中描述了各個節點之間的連線關係,以及資料如何在這些節點之間傳輸。這個架構允許容器跨不同的主機進行通訊,從而實作了軟體定義網路的功能。