Docker Swarm 集群

Docker Swarm 集群

本文檔介紹了 Docker Swarm 集群的基本概念、工作原理以及相關命令使用示例,包括如何在服務調度中使用自定義標簽。本文檔適用于需要管理和擴展 Docker 容器化應用程序的生產環境場景。


1. 什么是 Docker Swarm

Docker Swarm 是用于管理 Docker 集群的原生工具,從 Docker 1.12.0 版本開始,Swarm 已經內置于 Docker 引擎中。Swarm 可以將多臺 Docker 主機組織成一個統一的虛擬主機,使用戶能夠輕松部署、管理和擴展容器化應用程序。

官方文檔:Docker Swarm Overview


2. 與 Docker Compose 的區別

  • Docker Compose:適用于單節點環境,通過定義 docker-compose.yml 文件快速搭建和調試容器化應用。
  • Docker Swarm:專為生產環境設計,支持多節點集群管理和容器編排,還能實現零宕機滾動更新、彈性伸縮等高級功能。

3. Docker Swarm 的工作原理

3.1 基本概念

  • 節點 (Node)
    集群中的每個 Docker 主機都被稱為一個節點。節點分為兩種角色:

    • Manager 節點:負責集群的管理與控制,集群中可以有多個 Manager,但只有一個 Manager 被選舉為 Leader。
    • Worker 節點:用于運行任務,由 Manager 分配任務后執行相應的容器操作。
  • 多重身份
    一個節點可以同時扮演 Manager 和 Worker 的角色。

  • Raft 協議
    使用 Raft 協議選舉 Manager Leader 并同步狀態信息,要求至少兩個 Manager 參與選舉。

3.2 工作流程

  1. 集群初始化
    使用 docker swarm init 命令初始化集群,執行節點自動成為 Manager(通常也是 Leader)。

  2. 節點加入
    其他 Docker 主機通過 Manager 節點分配的 token 加入集群,并被授予 Manager 或 Worker 角色。

  3. 服務定義
    通過定義服務來描述容器應用程序,并由 Manager 將任務分配到合適的節點。任務是 Swarm 中最小的調度單位,而一個服務是多個任務的集合。

  4. 調度策略
    Manager 節點按照調度策略(spread、binpack、random)選擇合適的節點部署服務實例。

  5. 容器編排
    Manager 負責執行創建、啟動、停止、重啟等操作,保證應用程序持續高可用運行。


4. Swarm 集群管理

4.1 集群節點準備

角色IPHostname
Manager1172.16.10.110manager1
Manager2172.16.10.111manager2
Worker1172.16.10.120worker1
Worker2172.16.10.121worker2

4.2 初始化集群

在 Manager1 上執行以下命令:

docker swarm init --advertise-addr 172.16.10.110

執行成功后,輸出中會顯示用于其他節點加入集群的 token。注意:

  • 參數 --advertise-addr 用于指定通信的 IP 地址(默認端口為 2377),在多網卡環境下建議指定。

查看 token:

docker swarm join-token manager   # 查看管理節點 token
docker swarm join-token worker    # 查看工作節點 token

4.3 節點加入

  • 加入 Manager2
    在 Manager2 上執行(請替換 <manager_token> 與對應的廣播地址):

    docker swarm join --advertise-addr <Manager2_IP> --token <manager_token> 172.16.10.110:2377
    
  • 加入 Worker1 和 Worker2
    分別在 Worker 節點上執行:

    docker swarm join --advertise-addr <Worker_IP> --token <worker_token> 172.16.10.110:2377
    

在 Manager1 上使用 docker node ls 查看當前集群狀態。

4.4 集群解散

要將節點退出并從集群移除:

  1. 在目標節點上執行:

    docker swarm leave [--force]   # Manager 節點退出需加 --force
    
  2. 在 Manager 節點上刪除該節點:

    docker node rm <節點名稱>
    

5. 節點管理

以下命令需在 Manager 節點上執行(Worker 節點無操作權限):

  • 查看集群所有節點

    docker node ls
    
  • 查看指定節點詳情

    docker node inspect <節點名稱> --pretty
    
  • 節點升級與降級

    bash復制編輯docker node promote <節點名稱>   # 將 Worker 升級為 Manager
    docker node demote <節點名稱>     # 將 Manager 降級為 Worker
    
  • 節點下線(暫停任務調度)

    docker node update --availability drain <節點名稱>
    
  • 節點上線

    docker node update --availability active <節點名稱>
    

6. 服務管理

6.1 服務定義

創建服務時常用的命令格式如下:

bash復制編輯docker service create --name <服務名> \[-d] [-p] [-e] [--network] [--replicas] [--mount] \image:tag
示例
  • 測試 1:指定副本數、端口映射

    docker service create -d --name web-nginx --replicas 2 -p 80:80 nginx
    
  • 測試 2:傳遞環境變量

    bash復制編輯docker service create -d --name mysql --replicas=1 \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD=123456 \-e MYSQL_DATABASES=test \mysql:5.7
    

6.2 服務查看

  • 查看所有服務:

    docker service ls
    
  • 查看指定服務及其任務分布:

    docker service ps <服務名>
    

示例輸出:

docker service ls
ID             NAME        MODE         REPLICAS   IMAGE          PORTS
0jlt1yx8dcox   mysql       replicated   1/1        mysql:5.7      *:3306->3306/tcp
fxha9cy659vu   web-nginx   replicated   3/3        nginx:1.24.0   *:80->80/tcpdocker service ps mysql
ID             NAME      IMAGE       NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
wit44m5i6plf   mysql.1   mysql:5.7   master    Running         Running 3 minutes ago

6.3 服務移除

docker service rm <服務名稱>

6.4 服務模式及調度

  • 服務模式

    • Replicated 模式(默認):在指定節點上運行多個副本。
    • Global 模式:在每個節點上都運行一個副本(適合日志收集、監控等場景)。

    示例:

    docker service create --name cadvisor --mode global \--mount type=bind,src=/,dst=/rootfs,readonly \--mount type=bind,src=/var/run,dst=/var/run \--mount type=bind,src=/sys,dst=/sys,readonly \--mount type=bind,src=/var/lib/docker/,dst=/var/lib/docker,readonly \--publish 8888:8080 \gcr.io/cadvisor/cadvisor:latest
    
  • 調度約束

    通過指定調度約束,可以控制服務任務只在符合要求的節點上運行。

    • 根據節點主機名調度:

      docker service create --name my-service \--constraint 'node.hostname == node01' \nginx:latest
      
    • 根據自定義標簽調度:

      1. 給節點添加自定義 Label

        在 Manager 節點上執行(假設給 node01 添加 hm=node01):

        docker node update --label-add hm=node01 node01
        

        查看節點標簽:

        docker node inspect node01 --pretty
        
      2. 使用標簽調度創建服務

        docker service create --name my-service \--constraint 'node.labels.hm == node01' \nginx:latest
        

      docker-compose.yml 文件中也可通過 deploy.placement.constraints 設置:

      version: '3.8'
      services:web:image: nginx:latestdeploy:replicas: 1placement:constraints:- "node.labels.hm == node01"ports:- "80:80"
      

      部署命令:

      docker stack deploy -c docker-compose.yml mystack
      
  • 移除節點標簽

    docker node update --label-rm hm node01
    

6.5 服務日志

查看服務日志:

docker service logs <服務名>

7. Swarm 集群的彈性伸縮

彈性伸縮指動態增加或減少服務任務數。

  • 創建服務時指定副本數

    docker service create -d --name mysql --replicas=2 \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD=123456 \mysql:5.7
    
  • 在線伸縮命令

    • 使用 update 命令:

      docker service update --replicas <新副本數> <服務名>
      
    • 或者使用 scale 命令:

      docker service scale <服務名>=<副本數>
      

8. Swarm 集群服務的滾動更新

滾動更新允許在不中斷服務的情況下更新服務。常用于灰度發布與鏡像升級。

8.1 更新命令示例

例如升級 MySQL 服務鏡像版本,從 v5.7 到 v8.0,同時調整副本數量:

docker service update --replicas 5 \--image mysql:8.0 \--update-delay 60s \--update-parallelism 5 \mysql

參數說明:

  • --update-delay:指定滾動更新每個任務之間的延時(支持秒、分鐘、小時)。
  • --update-parallelism:指定同時更新的任務數。

8.2 鏡像版本回退

有兩種方式:

  • 方式一:使用 rollback 命令

    docker service rollback mysql
    

    此命令會回滾到上次成功部署的狀態。

  • 方式二:手動指定舊版本進行更新

    docker service update --image mysql:5.7 mysql
    
  • 查看更新狀態

    docker service inspect --pretty mysql
    

    輸出中 UpdateConfig 部分會顯示當前服務的更新狀態,例如 rollback_completed 表示已回滾。


9. 使用 Docker Compose 部署 Swarm 集群

9.1 docker service create 的局限

該命令一次只能創建一個服務,多個服務時較為繁瑣,因此推薦使用 Compose 文件配合 docker stack deploy 部署整個應用堆棧。

9.2 Docker Compose 文件中的 Swarm 配置

在 Compose 文件中,可在 deploy 下配置與 Swarm 相關的屬性。請注意,使用 docker-compose up 時會忽略 deploy 部分,因此必須通過 docker stack deploy 部署。

示例:

yaml復制編輯version: '3.8'
services:web:image: nginx:latestdeploy:replicas: 2                   # 服務副本數mode: replicated              # 服務模式:replicated(默認)或 globalplacement:constraints:- "node.hostname == node01"      # 根據主機名調度- "node.labels.hm == node01"       # 根據自定義標簽調度restart_policy:condition: on-failure     # 僅在容器異常退出時重啟delay: 10s                # 嘗試重啟的間隔時間max_attempts: 3           # 最大重啟嘗試次數ports:- "80:80"

9.3 部署 Stack

使用以下命令部署堆棧:

docker stack deploy -c docker-compose.yml mystack
  • 查看堆棧列表:

    docker stack ls
    
  • 查看堆棧服務:

    docker stack services mystack
    
  • 查看堆棧任務:

    docker stack ps mystack
    
  • 刪除堆棧:

    docker stack rm mystack
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79271.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

充電寶項目中的MQTT(輕量高效的物聯網通信協議)

文章目錄 補充&#xff1a;HTTP協議MQTT協議MQTT的核心特性MQTT vs HTTP&#xff1a;關鍵對比 EMQX項目集成EMQX集成配置客戶端和回調方法具體接口和方法處理處理類 補充&#xff1a;HTTP協議 HTTP是一種應用層協議&#xff0c;使用TCP作為傳輸層協議&#xff0c;默認端口是80…

【iOS】UIPageViewController學習

UIPageViewController學習 前言創建一個UIPageViewController最簡單的使用 UIPageViewController的方法說明&#xff1a;效果展示 UIPageViewController的協議方法 前言 筆者最近在寫項目時想實現一個翻書效果&#xff0c;上網學習到了UIPageViewController今天寫本篇博客總結…

Linux搭建環境:從零開始掌握基礎操作(四)

? ? 您好&#xff0c;我是程序員小羊&#xff01; 前言 軟件測試第一步就是搭建測試環境&#xff0c;如何搭建好測試環境&#xff0c;需要具備兩項的基礎知識&#xff1a; 1、Linux 命令: 軟件測試第一個任務, 一般都需要進行環境搭建, 一部分&#xff0c;環境搭建內容是在服…

一天一個java知識點----Tomcat與Servlet

認識BS架構 靜態資源&#xff1a;服務器上存儲的不會改變的數據&#xff0c;通常不會根據用戶的請求而變化。比如&#xff1a;HTML、CSS、JS、圖片、視頻等(負責頁面展示) 動態資源&#xff1a;服務器端根據用戶請求和其他數據動態生成的&#xff0c;內容可能會在每次請求時都…

YOLOV8 OBB 海思3516訓練流程

YOLOV8 OBB 海思3516訓練流程 目錄 1、 下載帶GPU版本的torch(可選) 1 2、 安裝 ultralytics 2 3、 下載pycharm 社區版 2 4、安裝pycharm 3 5、新建pycharm 工程 3 6、 添加conda 環境 4 7、 訓練代碼 5 9、配置Ymal 文件 6 10、修改網絡結構 9 11、運行train.py 開始訓練模…

【深度學習】花書第18章——配分函數

直面配分函數 許多概率模型&#xff08;通常是無向圖模型&#xff09;由一個未歸一化的概率分布 p ~ ( x , θ ) \tilde p(\mathbf x,\theta) p~?(x,θ)定義。我們必須通過除以配分函數 Z ( θ ) Z(\pmb{ \theta}) Z(θ)來歸一化 p ~ \tilde p p~?。以獲得一個有效的概率分…

工作記錄1

日常總結、靈感記錄、學習要點。持續記錄 學海無涯,再好的記性也比不過爛筆頭,記錄一下學習日常、靈感、要點。 前言:最近看見一個博文,很有感觸,是某個大佬自己運營的網站,分享了他的各種經驗文章和自身的一些筆記。本人還沒有他這么屌,所以還是先在CSDN上小試牛刀吧…

Spring Boot(二十一):RedisTemplate的String和Hash類型操作

RedisTemplate和StringRedisTemplate的系列文章詳見&#xff1a; Spring Boot&#xff08;十七&#xff09;&#xff1a;集成和使用Redis Spring Boot&#xff08;十八&#xff09;&#xff1a;RedisTemplate和StringRedisTemplate Spring Boot&#xff08;十九&#xff09;…

智能指針之設計模式1

本文探討一下智能指針和GOF設計模式的關系&#xff0c;如果按照設計模式的背后思想來分析&#xff0c;可以發現圍繞智能指針的設計和實現有設計模式的一些思想體現。當然&#xff0c;它們也不是嚴格意義上面向對象的設計模式&#xff0c;畢竟它們沒有那么分明的類層次體系&…

中間件--ClickHouse-1--基礎介紹(列式存儲,MPP架構,分布式計算,SQL支持,向量化執行,億萬級數據秒級查詢)

1、概述 ClickHouse是一個用于聯機分析(OLAP)的列式數據庫管理系統(DBMS)。它由俄羅斯的互聯網巨頭Yandex為解決其內部數據分析需求而開發&#xff0c;并于2016年開源。專為大規模數據分析&#xff0c;實時數據分析和復雜查詢設計&#xff0c;具有高性能、實時數據和可擴展性等…

Go之Slice和數組:深入理解底層設計與最佳實踐

在Go語言中&#xff0c;數組&#xff08;Array&#xff09;和切片&#xff08;Slice&#xff09;是兩種看似相似卻本質不同的數據結構。本文將深入剖析它們的底層實現機制&#xff0c;并結合實際代碼示例&#xff0c;幫助開發者掌握核心差異和使用場景。 一、基礎概念&#xff…

力扣熱題100——普通數組(不普通)

普通數組但一點不普通&#xff01; 最大子數組和合并區間輪轉數組除自身以外數組的乘積缺失的第一個正數 最大子數組和 這道題是非常經典的適用動態規劃解決題目&#xff0c;但同時這里給出兩種解法 動態規劃、分治法 那么動態規劃方法大家可以在我的另外一篇博客總結中看到&am…

矩陣基礎+矩陣轉置+矩陣乘法+行列式與逆矩陣

GPU渲染過程 矩陣 什么是矩陣&#xff08;Matrix&#xff09; 向量 &#xff08;3&#xff0c;9&#xff0c;88&#xff09; 點乘&#xff1a;計算向量夾角 叉乘&#xff1a;計算兩個向量構成平面的法向量。 矩陣 矩陣有3行&#xff0c;2列&#xff0c;所以表示為M32 獲取固…

MySQL之text字段詳細分類說明

在 MySQL 中&#xff0c;TEXT 是用來存儲大量文本數據的數據類型。TEXT 類型可以存儲非常長的字符串&#xff0c;比 VARCHAR 類型更適合存儲大塊的文本數據。TEXT 數據類型分為以下幾個子類型&#xff0c;每個子類型用于存儲不同大小范圍的文本數據&#xff1a; TINYTEXT: 可以…

超詳細!Android 面試題大匯總與深度解析

一、Java 與 Kotlin 基礎 1. Java 的多態是如何實現的&#xff1f; 多態是指在 Java 中&#xff0c;同一個行為具有多個不同表現形式或形態的能力。它主要通過方法重載&#xff08;Overloading&#xff09;和方法重寫&#xff08;Overriding&#xff09;來實現。 方法重載&a…

如何提高webrtc操作跟手時間,降低延遲

第一次做webrtc項目&#xff0c;操作延遲&#xff0c;一直是個問題&#xff0c;多次調試都不能達到理想效果。偶爾發現提高jitterBuffer時間可以解決此問題。關鍵代碼 const _setJitter (values: number) > { const receives peerConnection.getReceivers();receives.f…

語音合成(TTS)從零搭建一個完整的TTS系統-第一節-效果演示

一、概述 語音合成又叫文字轉語音&#xff08;TTS-text to speech &#xff09;&#xff0c;本專題我們記錄從零搭建一個完整的語音合成系統&#xff0c;包括文本前端、聲學模型和聲碼器&#xff0c;從模型訓練到系統的工程化實現&#xff0c;模型可以部署在手機等嵌入式設備上…

實驗三 I/O地址譯碼

一、實驗目的 掌握I/O地址譯碼電路的工作原理。 二、實驗電路 實驗電路如圖1所示&#xff0c;其中74LS74為D觸發器&#xff0c;可直接使用實驗臺上數字電路實驗區的D觸發器&#xff0c;74LS138為地址譯碼器&#xff0c; Y0&#xff1a;280H&#xff5e;287H&…

Linux 使用Nginx搭建簡易網站模塊

網站需求&#xff1a; 一、基于域名[www.openlab.com](http://www.openlab.com)可以訪問網站內容為 welcome to openlab ? 二、給該公司創建三個子界面分別顯示學生信息&#xff0c;教學資料和繳費網站&#xff0c;基于[www.openlab.com/student](http://www.openlab.com/stud…

MyBatis 如何使用

1. 環境準備 添加依賴&#xff08;Maven&#xff09; 在 pom.xml 中添加 MyBatis 和數據庫驅動依賴&#xff1a; <dependencies><!-- MyBatis 核心庫 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId&g…