docker swarm 搭建與服務更新


,docker swarm 是什么

Docker Swarm、Docker Machine與Docker Compose號稱Docker三劍客
Docker Swarm 和 Docker Compose 一樣,都是 Docker 官方容器編排項目,但不同的是,Docker Compose 是一個在單個服務器或主機上創建多個容器的工具,可以將組成某個應該的多個docker容器編排在一起,同時管理。
而 Docker Swarm 則可以在多個服務器或主機上創建容器集群服務,其主要作用是把若干台Docker主機抽象為一個整體,並且通過一個入口(docker stack)統一管理這些Docker主機上的各種Docker資源。

Swarm的基本架構如下圖所示,

  • stack 是構成特定環境中的 service 集合, 它是自動部署多個相互關聯的服務的簡便方法,而無需單獨定義每個服務。
  • stack file 是一種 yaml 格式的文件,類似於 docker-compose.yml 文件,它定義了一個或多個服務,並定義了服務的環境變量、部署標簽、容器數量以及相關的環境特定配置等。
二,啟動Swarm,並創建集群
Docker 默認包含了 Swarm,因此可以直接使用,初始化命令:docker swarm init 
docker swarm init --advertise-addr 192.168.100.129

此時將本機ip“192.168.100.126”,會默認當前節點為 Leader,執行 docker info 查看

通過下面命令獲取加入token,其他節點可以用 manager 或者 worker 的身份加入到當前集群

docker swarm join-token [worker|manager]

需要加入的節點無需再執行“docker swarm init”初始化,直接加入節點即可

出錯了,需要在管理管設置防火牆

firewall-cmd --permanent --add-port=2377/tcp # 允許某端口放行

然后執行防火牆重新加載

firewall-cmd --reload

再次在需要加入的節點上執行加入

這里我們加入2個節點,執行 docker info 查看

在管理端執行“docker info” 查看, 顯示工3個節點

 

脫離集群

docker swarm leave 

結果如下:

三,docker-stack.yml文件編排

Docker stack 也是一個yaml文件,和一份docker-compose.yml文件差不多,指令也基本一致。但是與compose相比其不支持build、links和network_mode。Docker stack有一個新的指令deploy。

注:stack不支持的指令

Deploy是用來指定swarm服務部署和運行時的相關配置,並且只有使用docker stack deploy 部署swarm集群時才會生效。如果使用docker-compose up 或者docker-compose run時,該選項會被忽略。要使用deploy選項,compose-file中version版本要在3或3+。

下面通過一個demo說明 deploy關鍵選項version: "3.4"

version: "3.4"
services:
  demo-docker:
    image: ejiyuan/demo-docker
    ports:
      - 8081:8081
    environment:
      - DF_NOTIFY_CREATE_SERVICE_URL=http://proxy:8080/v1/docker-flow-proxy/reconfigure
    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: vip
      labels:
        com.example.description: "This label will appear on the web service"
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
      update_config:
        parallelism: 1
        delay: 10s
        order: start-first
  visualizer:
    image: dockersamples/visualizer
    ports:
      - "9080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]
  portainer:
    image: portainer/portainer
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

visualizer,portainer 為服務管理與監聽服務,這里先不做詳細介紹

1,mode :global 全局(每個群集節點只有一個容器)replicated 副本(指定容器的數量)。默認值:replicated。

2,replicas:副本模式下每個節點啟動副本的數量

3,endpoint_mode:指定swarm服務發現的模式

  • vip - Docker為swarm集群服務分配一個虛擬IP(VIP),作為客戶端到達集群服務的“前端”。Docker 在客戶端和可用工作節點之間對服務的請求進行路由。而客戶端不用知道有多少節點參與服務或者是這些節點的IP/端口。(這是默認模式)
  • dnsrr - DNS輪詢(DNSRR)服務發現不使用單個虛擬IP。 Docker為服務設置DNS條目,使得服務名稱的DNS查詢返回一個IP地址列表,並且客戶端直接連接到其中的一個。如果您想使用自己的負載平衡器,或者混合Windows和Linux應用程序,則DNS輪詢功能非常有用。

4,labels:指定服務的標簽。這些標簽僅在服務上設置,而不在服務的任何容器上設置

5,resources:設置服務資源分配

  • limits:最大使用限制
  • reservations:表示預留,即最小使用
  • cpus: '0.50' 表示最大或預留50%
  • memory: 20M:表示最大或預留20M

6,restart_policy:配置在容器退出時是否並如何重啟容器。取代docker-compose 中的 restart指令。

  • condition :none、on-failure和any(默認any)
  • delay :在重啟嘗試之間等待多久(默認0)
  • max_attempts :嘗試重啟的次數(默認一直重啟,直到成功)
  • window : 在確實一個重啟是否成功前需要等待的窗口時間 

7,update_config :配置更新服務,用於無縫更新應用(rolling update)

  • parallelism:同一時間升級的容器數量
  • delay:容器升級間隔時間
  • failure_action:升級失敗后的動作(continue、rollback和pause。默認pause)。
  • monitor:更新完成后確實成功的時間(ns|us|ms|s|m|h)。(默認0s)
  • max_failure_ratio:更新期間允許的失敗率
  • order: 更新期間的操作順序。停止優先(舊任務在開始新任務之前停止)或者先啟動(首先啟動新任務,並且正在運行的任務短暫重疊)(默認停止優先)注意:只支持v3.4及更高版本。 

四,docker stack相關命令

1, docker stack deploy:部署新的堆棧或更新現有堆棧

docker stack deploy [OPTIONS] STACK

參數

  • --bundle-file:【實驗階段】分布式應用程序包文件的路徑
  • -c --compose-file :Stack File 路徑
  • --prune:刪除不再被引用的服務
  • --resolve-image: 查詢 Registry 以解決​​鏡像摘要和支持的平台可選值:always(默認)、changed、never
  • --with-registry-auth:向 Swarm 代理發送 Registry 認證詳細信息

私有倉庫需要攜帶"--with-registry-auth"參數,否則提示

image registry.cn-beijing.aliyuncs.com/ejiyuan/app:latest could not be accessed on a registry to record 
its digest. Each node will access registry.cn-hangzhou.aliyuncs.com/ejiyuan/app:latest,
possibly leading to different nodes running different

需要先登錄到阿里私有倉 

sudo docker login --username=ejiyuan@aliyun.com registry.cn-beijing.aliyuncs.com 

內網地址

sudo docker login --username=ejiyuan@aliyun.com registry-vpc.cn-beijing.aliyuncs.com

執行命令開始使用 docker-stack.yml 文件部署服務堆,堆名為“test”

 docker stack deploy -c docker-stack.yml test --with-registry-auth

結果如下:

 2,docker stack ls:列出現有堆棧以及堆中的服務數量

docker stack ls [flags]

SERVICES 顯示堆中有多少個服務

3,docker stack ps:列出堆棧中的任務

docker stack ps [OPTIONS] STACK [flags]

對應 docke run為 上圖中,綠、藍、黃分別代表上面文件中定義的三個服務

  • 第一行,任務NAME “test_demo-docker.1”,"test"表示服務棧名稱,“_”后面的demo-docker是文件中定義的服務名稱,“.1”表示第一個實例;
  • 第四列 NODE表示所在的節點;
  • 第五列:desired state 狀態running運行中;
  • 下面一行 “\_”表示為第一次重啟,跟部署配置文件(docker-stack.yml)中的“restart_policy”,重啟策略有關,文件中設置了 出錯重啟,最多重啟3次,所以3行的,“\_”,第五列狀態顯示為 shutdown停止
  • 第七列 顯示錯誤原因
  • task:non-zero exit(137) 錯誤原因服務容器內容不足,上面部署配置文件(docker-stack.yml)中設置了內存為20M,所以導致服務反復重啟知道達到  max_attempts 限制, by:https://success.docker.com/article/what-causes-a-container-to-exit-with-code-137 

4,docker stack services :列出堆棧中的服務 

docker stack services [OPTIONS] STACK [flags]

  • NAME 表示堆中的服務
  • MODE 文件中配置的啟動模式,這里都是 replicated (副本模式)
  • REPLICAS 表示正在運行的/啟動的副本數量

5,docker stack rm :刪除一個或多個堆棧

 docker stack rm STACK [STACK...] [flags]

六,服務升級

docker service upadte 命令參數詳解

  • --force 強制更新重啟服務,無論是否配置或鏡像改變都更新
  • --image <image:tag> 制定更新的鏡像
  • --with-registry-auth 向 Swarm 代理發送 Registry 認證詳細信息,私有倉庫需要攜帶該參數

1,更新鏡像:

docker service update --image ejiyuan/demo-docker:latest test_demo-docker

使用 portainer/portainer:latest鏡像,更新  portainer_portainer服務,此方法執行前,必須將 鏡像文件上傳到遠程倉中,程序會自動拉取遠程倉中鏡像文件與啟動服務的鏡像對比,如果沒有變化不會啟動更新,也不會重啟服務

 

即使設置了update_config.order: start-first,服務會先啟動在停止,但是tomcat 啟動 spring 項目需要一定時間,這段時間服務是不可用的,但是服務狀態是Runing的,所以,這里啟用兩個副本,每次更新一個,等待一個服務啟動完成后,在執行另一個更新,主要目的是為了,無縫的升級系統,具體update_config.delay設置為多少可以參考tomcat的啟動時間

Tomcat started on port(s): 8081 (http) with context path ''
Started DemoDockerApplication in 17.292 seconds (JVM running for 18.745)

注意:如果有多個同名images,最后一次編譯的會被加tag :latest,push時 要加上

docker push registry.cn-beijing.aliyuncs.com/ejiyuan/demo-docker:latest

2,更新節點數目

docker service scale test_demo-docker=3

運行結果:

3,添加或者更新一個對外端口 

docker service update -–publish-add 8090 test_demo-docker 

 結果如下

七,更新節點

docker node update [OPTIONS] NODE [flags]

參數:

  • --availability 節點的可用性(有效/暫停/耗盡)
  • --label-add 添加或更新節點標簽(key = value)
  • --label-rm 刪除節點標簽(如果存在)
  • --role 節點的作用(worker / manager)

NODE:節點名稱 可以使用 “docker info” 查看得到

 

執行下面語句查看節點詳情

docker node inspect atv61b72x9qa5dpbrew2n016g

該命令只會更改角色,部分權限並沒有立即更新,因此執行服務操作時有可能提示該錯誤Error response from daemon: rpc error: code = DeadlineExceeded desc = context deadline exceeded

立即生效更新節點為manger 執行

docker node promote NODE [NODE...]

七,常用命令

 

 

常用命令

  • docker swarm 命令用於管理 Swarm 群集
命令 描述
docker swarm init 初始化一個 swarm 群集
docker swarm join 加入群集作為節點或管理器
docker swarm join-token 管理用於加入群集的令牌
docker swarm leave 離開 swarm 群集
docker swarm unlock 解鎖 swarm 群集
docker swarm unlock-key 管理解鎖鑰匙
docker swarm update 更新 swarm 群集
  • docker node 命令用於管理 Swarm 群集中的機器節點
命令 描述
docker node demote 從 swarm 群集管理器中降級一個或多個節點
docker node inspect 顯示一個或多個節點的詳細信息
docker node ls 列出 swarm 群集中的節點
docker node promote 將一個或多個節點推入到群集管理器中
docker node ps 列出在一個或多個節點上運行的任務,默認為當前節點
docker node rm 從 swarm 群集刪除一個或多個節點
docker node update 更新一個節點
  • docker service 命令用於管理服務
命令 描述
docker service create 創建服務
docker service inspect 顯示一個或多個服務的詳細信息
docker service logs 獲取服務的日志
docker service ls 列出服務
docker service rm 刪除一個或多個服務
docker service scale 設置服務的實例數量
docker service update 更新服務
docker service rollback 恢復服務至update之前的配置
七,注意:
如果一台機器啟用多個服務注意,合理分配cpu與內存資源,因tomcat在啟動編譯時會很吃內存,且docker是多線程啟動的,所有最好是限定一下(設置resources.limits)否者會導致內存在同一時刻用光,某些服務啟動失敗當然也可是設置出錯重啟(restart_policy.condition:on-failure),另外設置resources.reservations要注意,不要超出總內存或cpu百分比,否者會導致后面服務無法獲取cpu或內存資源出現“no suitable node (insufficien”錯誤(這個錯誤很奇怪,某個service不啟動,也不輸出日志,使用“docker stack ps [xxxx]”查看狀態會顯示此錯誤)無法啟動
八,參考

Docker swarm搭建總結

Docker 三劍客之 Docker Swarm

使用 Docker Swarm 管理 Docker 集群

如何滾動更新 Service?- 每天5分鍾玩轉 Docker 容器技術(102)

Docker 小記 — 微信斗牛棋牌源碼搭建Compose & Swarm

 Docker swarm - 使用體驗 1+2

docker node update命令

Docker(六):Docker 三劍客之 Docker Swarm

Docker 引擎的 Swarm 模式:入門教程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM