Docker Swarm 提供了 Volume 機制來持久化資料,確保容器刪除後資料仍然保留。透過 docker volume inspect 命令可以檢視 Volume 的詳細資訊,例如驅動程式、掛載點、名稱和作用域。建立 Service 時,可以使用 --mount 引數將 Volume 掛載到容器內指定目錄,確保資料的持久化儲存。docker service ls 和 docker service ps 命令則是用於檢視 Service 狀態和任務資訊。此外,Docker Swarm 還支援 Volume 的動態建立,當 Service 擴充套件到新的節點時,會自動建立所需的 Volume。在資源管理方面,Docker Swarm 允許組態 CPU 和記憶體資源,透過 --reserve-cpu、--limit-cpu、--reserve-memory 和 --limit-memory 等引數設定資源保證和限制,避免資源分配不均和節點資源耗盡。同時,Docker Swarm 支援繫結掛載,允許容器直接存取主機上的目錄,並可設定唯讀模式防止資料被修改。透過滾動更新機制,可以動態修改服務的資源組態,確保服務的穩定執行和資源的有效利用。
Docker Volume 的使用與管理
在 Docker 中,Volume 是一種用於持久化資料的機制,使得資料即使在容器被刪除後仍然能夠保留。本章節將探討如何在 Docker Swarm 中使用 Volume。
檢視 Volume 詳細資訊
當我們建立一個 Volume 後,可以使用 docker volume inspect 命令來檢視其詳細資訊。例如,檢視名為 mysql-scripts 的 Volume:
~ $ docker volume inspect mysql-scripts
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/mysql-scripts/_data",
"Name": "mysql-scripts",
"Options": {},
"Scope": "local"
}
]
內容解密:
Driver: 表示使用的 Volume 驅動程式,這裡是local,表示資料儲存在本地。Mountpoint: 表示 Volume 在主機上的掛載點。Name: Volume 的名稱。Scope: 表示 Volume 的作用域,這裡是local,表示該 Volume 僅在單一主機上有效。
建立使用 Volume 的 Service
接下來,我們可以建立一個 Service,並在其中使用上述的 Volume。以下是一個範例:
~ $ docker service create \
--env MYSQL_ROOT_PASSWORD='mysql' \
--mount type=volume,src="mysql-scripts",dst="/etc/mysql/scripts" \
--publish 3306:3306 \
--replicas 2 \
--name mysql \
mysql
內容解密:
--env MYSQL_ROOT_PASSWORD='mysql': 設定 MySQL 的 root 密碼。--mount type=volume,src="mysql-scripts",dst="/etc/mysql/scripts": 將名為mysql-scripts的 Volume 掛載到容器內的/etc/mysql/scripts目錄。--publish 3306:3306: 將主機的 3306 連線埠對應到容器的 3306 連線埠。--replicas 2: 指定 Service 的副本數量為 2。--name mysql: 指定 Service 的名稱為mysql。
檢視 Service 狀態
建立 Service 後,可以使用 docker service ls 和 docker service ps 命令來檢視其狀態:
~ $ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
cghaz4zoxurp mysql replicated 1/2 mysql:latest *:3306->3306/tcp
~ $ docker service ps mysql
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
y59yhzwch2fj mysql.1 mysql:latest ip-172-31-33-230.ec2.internal Running Preparing 12 seconds ago
zg7wrludkr84 mysql.2 mysql:latest ip-172-31-16-11.ec2.internal Running Running less than a second ago
內容解密:
docker service ls: 列出所有 Service 的基本資訊。docker service ps mysql: 列出名為mysql的 Service 的詳細任務資訊。
Volume 的動態建立
當 Service 使用自動產生的名為 Volume 時,如果該 Volume 在某些節點上不存在,Docker 將自動在這些節點上建立它。例如,將 mysql Service 縮放到 3 個副本:
~ $ docker service scale mysql=3
此時,Docker 將在所有參與的節點上建立必要的 Volume。
組態資源於 Docker Swarm 模式
Docker 容器在基礎作業系統核心上以隔離方式執行,並需要資源來執行。Docker Swarm 模式支援兩種型別的資源:CPU 和記憶體。
資源組態問題
預設情況下,Docker Swarm 模式不會對服務任務可消耗的資源(CPU 迴圈或記憶體)施加任何限制。同時,Swarm 模式也不保證最低資源需求。如果在 Docker Swarm 模式中未指定資源組態,則可能出現兩個問題:
- 部分服務任務可能會消耗不成比例的資源量,而其他服務任務由於缺乏資源而無法排程。例如,考慮一個具有 3GB 資源容量和 3 個 CPU 的節點。在沒有任何資源保證和限制的情況下,一個服務任務容器可能會消耗大部分資源(2.8GB 和 2.8 個 CPU),而其他兩個服務任務容器各自僅剩下 0.1GB 和 0.1 個 CPU 的資源可用,導致無法排程,如圖 7-2 所示。一個因資源不足而無法排程的 Docker 服務任務將被置於擱置狀態。
資源型別
Docker Swarm 模式支援兩種資源型別:
- CPU
- RAM(記憶體)
圖 7-1:Docker Swarm 模式支援的資源型別
使用掛載(Mounts)於 Docker Swarm
在 Docker Swarm 中,有兩種型別的掛載:繫結掛載(Bind Mount)和卷掛載(Volume Mount)。繫結掛載適合於需要從 Docker 容器記憶體取主機上現有目錄中的資料的情況。
建立和使用繫結掛載
- 在主機上建立目錄,例如
/etc/mysql/scripts。 - 在該目錄中新增檔案,例如
createtable.sql。 - 使用
--mount選項建立服務,並指定type=bind、src為主機目錄、dst為容器內的目標目錄。
docker service create
–env MYSQL_ROOT_PASSWORD=‘mysql’
–replicas 3
–mount type=bind,src="/etc/mysql/scripts",dst="/scripts"
–name mysql
mysql
4. 在排程任務的節點上啟動 bash shell,列出目標目錄 `/scripts` 中的內容。
##### 繫結掛載的特點
* 繫結掛載預設為讀寫模式,可以修改或刪除掛載路徑中的檔案。
* 可以透過在 `--mount` 引數中新增 `readonly` 選項,將掛載設為唯讀模式。
#### 示範唯讀掛載
1. 首先移除已執行的 mysql 服務。
2. 使用相同的命令建立服務,但新增 `readonly` 選項:
```bash
docker service create \
--env MYSQL_ROOT_PASSWORD='mysql' \
--replicas 3 \
--mount type=bind,src="/etc/mysql/scripts",dst="/scripts",readonly \
--name mysql \
mysql
- 在排程任務的節點上存取容器,並嘗試刪除範例指令碼。將會產生錯誤,因為檔案系統是唯讀的。
程式碼範例與說明
以下是建立 Docker 服務並使用繫結掛載的命令範例:
docker service create \
--env MYSQL_ROOT_PASSWORD='mysql' \
--replicas 3 \
--mount type=bind,src="/etc/mysql/scripts",dst="/scripts" \
--name mysql \
mysql
內容解密:
docker service create:建立一個新的 Docker 服務。--env MYSQL_ROOT_PASSWORD='mysql':設定環境變數MYSQL_ROOT_PASSWORD為'mysql',用於設定 MySQL root 使用者的密碼。--replicas 3:指定服務的副本數量為 3,即啟動三個相同的容器例項。--mount type=bind,src="/etc/mysql/scripts",dst="/scripts":將主機上的/etc/mysql/scripts目錄以繫結掛載的方式掛載到容器內的/scripts目錄。這樣,容器就可以存取主機上的該目錄中的檔案。--name mysql:將服務命名為mysql,方便管理和識別。mysql:指定要使用的 Docker 映象名稱,即使用官方的 MySQL 映象來建立容器。
綜上所述,這條命令的作用是建立一個名為 mysql 的服務,該服務根據官方 MySQL 映象,包含三個副本,並且將主機上的特定目錄掛載到容器內的特定路徑,以實作資料分享和持久化。
組態資源
在 Docker Swarm 模式中,資源管理是確保服務任務能夠有效率執行的重要環節。本章將探討如何組態資源,包括設定資源保證(reserves)和資源限制(limits),以避免資源分配不均或資源耗盡的問題。
資源分配問題
在未組態資源保證和限制的情況下,兩個主要問題可能會出現:
- 資源分配不均:不同的服務任務可能會佔用不同數量的資源,導致某些節點上的資源被耗盡,而其他節點仍有剩餘資源。
- 節點資源耗盡:當一個節點上的資源被完全佔用時,新的服務任務將無法被排程到該節點上。
解決方案
Docker Swarm 模式提供了設定資源保證和資源限制的功能。資源保證是指為服務任務保留的最小資源量,而資源限制則是指服務任務可以使用的最大資源量。
資源保證
透過設定資源保證,可以確保每個服務任務至少獲得一定量的資源。例如,將每個服務任務的 CPU 和記憶體資源保證分別設定為 1 CPU 和 1GB,可以避免資源分配不均的問題。
資源限制
透過設定資源限制,可以防止服務任務佔用過多的資源,從而保留一定的資源給新的服務任務。例如,將每個服務任務的 CPU 和記憶體資源限制分別設定為 2 CPUs 和 2GB,可以保留剩餘的資源給新的服務任務。
建立服務與資源組態
本章將介紹如何建立一個具有資源組態的服務,並探討相關的操作。
建立無資源組態的服務
首先,建立一個 MySQL 資料函式庫服務,不設定任何資源保證或限制。
docker service create \
--env MYSQL_ROOT_PASSWORD='mysql' \
--replicas 1 \
--name mysql \
mysql
列出服務和服務任務,可以看到 MySQL 服務正在執行。
docker service ls
docker service ps mysql
檢查服務的詳細資訊,可以看到容器規格中沒有包含任何資源限制或保證。
docker service inspect mysql
輸出結果:
[
{
"Resources": {
"Limits": {},
"Reservations": {}
}
}
]
保留資源
Swarm 模式在 docker service create 和 docker service update 命令中提供了兩個選項來設定資源保證:--reserve-cpu 和 --reserve-memory。
| 選項 | 描述 | 預設值 |
|---|---|---|
--reserve-cpu | 保留 CPU 資源 | 0.000 |
--reserve-memory | 保留記憶體資源 | 0 |
設定資源限制
Swarm 模式在 docker service create 和 docker service update 命令中提供了兩個選項來設定資源限制:--limit-cpu 和 --limit-memory。
| 選項 | 描述 | 預設值 |
|---|---|---|
--limit-cpu | 限制 CPU 資源 | 0.000 |
--limit-memory | 限制記憶體資源 | 0 |
建立具有資源組態的服務
刪除之前建立的 MySQL 服務,並建立一個新的具有資源組態的 MySQL 服務。
docker service rm mysql
docker service create \
--env MYSQL_ROOT_PASSWORD='mysql' \
--replicas 1 \
--name mysql \
--reserve-cpu .25 --limit-cpu 1 --reserve-memory 128mb --limit-memory 256mb \
mysql
檢查服務的詳細資訊,可以看到資源限制和保證已經被設定。
docker service inspect mysql
輸出結果:
[
{
"Resources": {
"Limits": {
"NanoCPUs": 1000000000,
"MemoryBytes": 268435456
},
"Reservations": {
"NanoCPUs": 250000000,
"MemoryBytes": 134217728
}
}
}
]
縮放與資源
在擴充套件服務之前,瞭解節點的容量是很重要的。可以使用 docker node inspect 命令來檢查節點的容量。
docker node inspect ip-172-31-16-11.ec2.internal
輸出結果:
[
{
"Resources": {
"NanoCPUs": 1000000000,
"MemoryBytes": 1039040512
}
}
]
此輸出顯示了節點的 CPU 和記憶體容量。
資源組態的管理與最佳實踐
在Docker Swarm叢集中,資源的管理是確保服務穩定執行的關鍵因素之一。本章將探討如何組態資源限制與保留,以及如何透過滾動更新來修改這些組態。
資源限制與保留的基本概念
在Docker Swarm中,每個服務任務都可以設定CPU和記憶體的限制(Limit)與保留(Reserve)。資源限制定義了任務最多可以使用的資源量,而資源保留則定義了任務保證可用的資源量。
關鍵概念解析
- 資源限制(Resource Limits):定義任務最大可使用的資源。
- 資源保留(Resource Reserves):定義任務保證可用的資源。
資源組態的實際操作
當我們建立一個服務時,可以透過--limit-cpu、--limit-memory、--reserve-cpu和--reserve-memory等引數來設定資源限制和保留。
程式碼範例:建立服務並設定資源組態
docker service create \
--env MYSQL_ROOT_PASSWORD='mysql' \
--replicas 1 \
--name mysql \
--reserve-cpu 0.5 --limit-cpu 0.5 \
--reserve-memory 256mb --limit-memory 256mb \
mysql
內容解密:
--reserve-cpu 0.5:表示該服務任務保留0.5個CPU核心。--limit-cpu 0.5:表示該服務任務最多可以使用0.5個CPU核心。--reserve-memory 256mb:表示該服務任務保留256MB記憶體。--limit-memory 256mb:表示該服務任務最多可以使用256MB記憶體。
資源保留與限制的關係
資源保留必須小於或等於資源限制。如果資源保留大於資源限制,服務任務可能會因為無法取得足夠的資源而失敗。
程式碼範例:錯誤的資源組態導致服務任務失敗
docker service create \
--env MYSQL_ROOT_PASSWORD='mysql' \
--replicas 1 \
--name mysql \
--reserve-cpu 0.75 --limit-cpu 0.5 \
--reserve-memory 256mb --limit-memory 128mb \
mysql
內容解密:
- 資源保留(0.75 CPU核心)大於資源限制(0.5 CPU核心),導致服務任務無法正常執行。
- 同樣,記憶體保留(256MB)大於記憶體限制(128MB),進一步加劇了資源不足的問題。
滾動更新以修改資源組態
Docker Swarm支援透過滾動更新來修改服務的資源組態。這使得我們可以在不影響服務可用性的情況下調整資源限制和保留。
程式碼範例:使用滾動更新修改資源組態
docker service update \
--reserve-cpu 1 \
--limit-cpu 2 \
--reserve-memory 256mb \
--limit-memory 512mb \
mysql
內容解密:
--reserve-cpu 1和--limit-cpu 2:將CPU保留調整為1個核心,CPU限制調整為2個核心。--reserve-memory 256mb和--limit-memory 512mb:保持記憶體保留為256MB,將記憶體限制調整為512MB。