一,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 檔案,它定義了一個或多個服務,並定義了服務的環境變數、部署標籤、容器數量以及相關的環境特定配置等。
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之前的配置 |
如何滾動更新 Service?- 每天5分鐘玩轉 Docker 容器技術(102)
Docker 小記 — 微信鬥牛棋牌原始碼搭建Compose & Swarm