,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 [email protected] registry.cn-beijing.aliyuncs.com 

內網地址

sudo docker login [email protected] 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 模式:入門教程