以前寫過<<docker-compose真香>> 和《docker-compose、docker stack前世此生》兩篇博客, 回顧一下思路:html
① docker-compose是docker引擎頂層的容器編排工具(Python實現),須要單獨安裝; docker stack 是docker引擎原生支持的容器編排技術(Go實現)node
② 二者都支持最新docker-compose.yml 版本3容器編排文件,部分指令有差別。nginx
③ docker-compose 能現場Build鏡像,更適用於開發、測試時候單機迭代部署;docker stack須預先準備鏡像,具有生產環境諸多特性。web
昨天docker-compose編排的單機多容器忽然崩潰,爲提升項目服務可用性評價值(SLA), 決心切換到docker stack生產部署。docker
Docker Swarm is native clustering for Docker. It turns a pool of Docker hosts into a single, virtual Docker host.json
Docker Swarm是Docker平臺原生內置的集羣編排技術,它將Docker主機池變成了 單個虛擬主機。網絡
有不少理由促使你採用容器集羣解決方案。隨着應用程序的增加,將面臨新的強制要求:例如可伸縮性,可管理性和高可用性。架構
Docker Swarm 直接優點:app
Native Clustering負載均衡
Production Grade
Work out of the box
Easy to setup and use
Active Community
Stack、Service、Container 金字塔模型定義了一個完整的生產應用架構:
service是一個或一組容器在生產環境的預期狀態(也可說是一組task的集合),在Worker節點上執行;有兩種模式(對應下面docker-stack.yml-deploy-mode配置節)
stack 是一組服務,協做支撐整個業務
還支持 副本集、滾動更新、更新和回滾策略,以上配置均可以在docker-compose.yml 版本3官方文檔找到對應的配置字段:
deploy: endpoint_mode: 服務發現的方式: vip,dnsrr labels: 爲服務指定的標籤 mode:replicated (指定數量的容器) global(每一個節點一個容器) replicas: 實例數量 resources: 配置資源 restart_policy: 重啓策略 update_config: 服務更新策略 parallelism: 同時更新容器數量 delay: 容器組更新的間隔時間 failure_action: 更新失敗的操做:continue、rollbak,pause(默認) monitor: 監視更新失敗的等待時間 max_failure_ratio: 更新的失敗容錯率 order:操做策略:stop-first(先中止某容器,再建立新容器)、start-first (先建立新容器,因此會與即將消滅的容器有時間重疊) rollback_config: 回滾策略 ...同上...
Docker Swarm在以多主機模型支撐業務,對於開發者/部署者來講, 一個節點或多節點部署的配置流程是相似的。
有兩種形式節點: managers,workers
使用Raft協議保持集羣內部一致性;
測試目的,可使用單個manager運行swarm;(單manager fail, 服務繼續運行)
workers節點的惟一目的是執行容器,workers節點不參與Raft distributed state, make scheduling decisions, or serve the swarm mode HTTP API.
能夠建立只有一個manager的羣集,可是若是沒有一個manager節點,則不可能有一個工做節點。
默認狀況下,全部manager也是worker。在單個manager節點集羣中,您能夠運行諸如docker service create之類的命令,而調度程序會將全部任務放在本地引擎上。
+ https://docs.docker.com/engine/swarm/key-concepts/#services-and-tasks
做用在外部要訪問的服務上,通常服務會對外暴露一個port,(若是你沒有指定的話,swarm manager會自動給這個服務分配一個PublishedPort )
外部Clients能在集羣任一節點的PublishedPort 上訪問服務(不論這個節點當前是否有這個服務的running task)。
服務發現(這裏天然說的是Docker Stack中某個對外暴露的服務),有兩種模式(對應docker-stack.yml: deploy---->endpoint_mode)
- vip: Docker Swarm爲服務分配1個虛擬ip,服務後有多少節點、服務請求到哪一個節點容器對於客戶端是透明的。 默認
- dnsrr: Docker Swarm 爲服務創建DNS記錄,返回可用容器的ip列表, 客戶端直接請求其中一個ip, 這種方式通常用於自建負載均衡器
做用在每一個服務上,swarm內部有一個DNS組件(自動爲每一個服務分配dns條目),swarm manager使用依據DNS名稱分發請求。
① overlay network:覆蓋物網絡,顧名思義是附着在主機底層網絡之上的網絡, 這個網絡保證了不一樣主機之間容器通訊
② ingress network:進入網絡,顧名思義是外部客戶端訪問服務時,服務節點間負載均衡(節點在開放端口上收到請求,上交給IPVS,選擇容器),是一種特殊的overlay網絡。
③ docker-gwbridge: 將overlay網絡鏈接到docker宿主機的網絡,默認: 服務正在運行的每一個容器都鏈接到其本地Docker守護程序主機的docker_gwbridge網絡
在初始化或剛加入Swarm集羣時,會建立一個Ingress和 docker-gwbridge網絡
本次將<<docker-compose真香>> 3容器改造目標:
三個服務---->nginx----> receiver------>app,服務容器經過名爲webnet 的overlay網絡通訊;
nginx開放外部訪問端口80和8080,關注ingress網絡
receiver, app服務須要訪問宿主機上搭建的Redis, 關注docker-gwbridge網絡
通常兩個步驟: ① 搭建集羣 ② 發佈服務
單節點/多節點的初始化方式,可參考 docker swarm -- help指令; 集羣節點的管理可參考 docker node --help指令
$ docker swarm --help Usage: docker swarm COMMAND Manage Swarm Commands: ca Display and rotate the root CA init Initialize a swarm join Join a swarm as a node and/or manager join-token Manage join tokens, 若是忘記Token,能夠執行這個參數 leave Leave the swarm unlock Unlock swarm unlock-key Manage the unlock key update Update the swarm
可以使用docker service create方式建立服務,我比較喜歡使用docker stack deploy搭配docker-stack.yml文件
下面是生產部署中追加的production.yml,建立了一個名爲eqidstack_webnet的overlay網絡
version: "3.7" services: proxy: networks: - webnet receiver: deploy: replicas: 1 restart_policy: condition: on-failure networks: - webnet volumes: - type: bind source: /home/eqidmanager/receiver.secrets.json target: /app/appsettings.secrets.json app: deploy: replicas: 2 restart_policy: condition: on-failure update_config: parallelism: 1 delay: 5s order: stop-first networks: - webnet volumes: - type: bind source: /home/eqidmanager/appsettings.secrets.json target: /app/appsettings.secrets.json networks: webnet:
# docker stack不加載同目錄下的.env環境變量文件,原有適用於docker-compose工具的yml文件可採用變通方法
docker stack deploy -c <(docker-compose -f docker-stack.yml -f production.yml config) eqidstack
服務部署效果:
#docker stack ls: NAME SERVICES ORCHESTRATOR eqidstack 3 Swarm #docker service ls:
ID NAME MODE REPLICAS IMAGE PORTS (服務對外暴露的端口)
jml6ecfa330r eqidstack_app replicated 2/2 12205599/eqidmanager:master
3381stpkirgj eqidstack_proxy replicated 1/1 nginx:latest *:80->80/tcp, *:8080->8080/tcp
vhz4ef8p4ffp eqidstack_receiver replicated 1/1 12205599/eqidreceiver:master
可經過
docker network inspect ingress 驗證容器eqidstack_proxy.1 鏈接到ingress網絡;
docker network inspect eqidstack_webnet 驗證有4個容器鏈接到 overlay網絡
手動更新服務配置:docker service update [opton] {some_service_name}
咱們來爲以上名爲{eqidstack_proxy}的服務添加 [重啓策略]
手動擴容:docker service scale [option] {service=replicas}
爲名爲{eqidstack_proxy}的服務擴容爲2容器
可經過docker service inspect eqidstack_proxy驗證操做結果
docker service 定義某個(副本集)容器在生產環境下的狀態,通常業務含義上的服務相關;
docker stack 定義一組服務,服務間協做、調用,支撐整個業務架構;
docker swarm 管理一組服務在集羣節點上的的部署
本文以 重難點解讀+實戰演練的方式記錄Docker Swarm生產部署的過程,但願能和你們查缺補漏,共同探討。
+ https://docs.docker.com/compose/compose-file/
+ https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/#manager-nodes
+ https://docs.docker.com/engine/swarm/key-concepts/#services-and-tasks
+ https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/