日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

docker swarm 集群服务编排部署指南(docker stack)

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 docker swarm 集群服务编排部署指南(docker stack) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Docker Swarm 集群管理

概述

Docker Swarm 是 Docker 的集群管理工具。它將 Docker 主機池轉變為單個虛擬 Docker 主機,使得容器可以組成跨主機的子網網絡。Docker Swarm 提供了標準的 Docker API,所有任何已經與 Docker 守護程序通信的工具都可以使用 Swarm 輕松地擴展到多個主機。

集群的管理和編排是使用嵌入到 docker 引擎的 SwarmKit,可以在 docker 初始化時啟動 swarm 模式或者加入已存在的 swarm。

支持的工具包括但不限于以下各項:

  • Dokku
  • Docker Compose
  • Docker Machine
  • Jenkins

Docker Swarm 優點

  • 任何規模都有高性能表現

對于企業級的 Docker Engine 集群和容器調度而言,可拓展性是關鍵。任何規模的公司——不論是擁有五個還是上千個服務器——都能在其環境下有效使用 Swarm。

經過測試,Swarm 可拓展性的極限是在 1000 個節點上運行 50000 個部署容器,每個容器的啟動時間為亞秒級,同時性能無減損。

  • 靈活的容器調度

Swarm 幫助 IT 運維團隊在有限條件下將性能表現和資源利用最優化。Swarm 的內置調度器(scheduler)支持多種過濾器,包括:節點標簽,親和性和多種容器部策略如 binpack、spread、random 等等。

  • 服務的持續可用性

Docker Swarm 由 Swarm Manager 提供高可用性,通過創建多個 Swarm master 節點和制定主 master 節點宕機時的備選策略。如果一個 master 節點宕機,那么一個 slave 節點就會被升格為 master 節點,直到原來的 master 節點恢復正常。

此外,如果某個節點無法加入集群,Swarm 會繼續嘗試加入,并提供錯誤警報和日志。在節點出錯時,Swarm 現在可以嘗試把容器重新調度到正常的節點上去。

  • 和 Docker API 及整合支持的兼容性

Swarm 對 Docker API 完全支持,這意味著它能為使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的用戶提供無縫銜接的使用體驗。

  • Docker Swarm 為 Docker 化應用的核心功能(諸如多主機網絡和存儲卷管理)提供原生支持

開發的 Compose 文件能(通過 docker-compose up )輕易地部署到測試服務器或 Swarm 集群上。Docker Swarm 還可以從 Docker Trusted Registry 或 Hub 里 pull 并 run 鏡像。

  • 集群模式,當修改了服務的配置后無需手動重啟服務。并且只有集群中的manager才能管理集群中的一切(包括服務、容器都歸它管,在一個woker節點上無法操作容器)

節點

swarm 集群由管理節點(manager)和工作節點(work node)構成。

  • swarm mananger:負責整個集群的管理工作包括集群配置、服務管理等所有跟集群有關的工作。一個 Swarm 集群可以有多個管理節點,但只有一個管理節點可以成為 leader,leader 通過 raft 協議實現。

    為了利用swarm模式的容錯功能,Docker建議根據組織的高可用性要求實現奇數個節點。當您擁有多個管理器時,您可以從管理器節點的故障中恢復而無需停機。

    • N個管理節點的集群容忍最多損失 (N-1)/2 個管理節點。
    • Docker建議一個集群最多7個管理器節點。
  • work node:即圖中的 available node,主要負責運行相應的服務來執行任務(task)。工作節點是任務執行節點,管理節點將服務 (service) 下發至工作節點執行。管理節點默認也作為工作節點。也可以通過配置讓服務只運行在管理節點。

服務和任務

任務 (Task)是 Swarm 中的最小的調度單位,目前來說就是一個單一的容器。

服務 (Services) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:

  • replicated services (復制服務)按照一定規則在各個工作節點上運行指定個數的任務。
  • global services (全局服務)每個工作節點上運行一個此任務。

兩種模式通過 docker service create 的 --mode 參數指定。下圖展示了容器、任務、服務的關系。

路由網格

service 通過 ingress load balancing 來發布服務,且 swarm 集群中所有 node 都參與到 ingress 路由網格(ingress routing mesh) 中,訪問任意一個 node+PublishedPort 即可訪問到服務。

當訪問任何節點上的端口8080時,Docker將請求路由到活動容器。在群節點本身,端口8080可能并不實際綁定,但路由網格知道如何路由流量,并防止任何端口沖突的發生。

路由網格在發布的端口上監聽分配給節點的任何IP地址。對于外部可路由的IP地址,該端口可從主機外部獲得。對于所有其他IP地址,只能從主機內部訪問。


Swarm 集群的搭建

準備工作

  • 二個或二個以上可以通過網絡進行通信的Linux主機或虛擬機,并安裝了Docker(加入開機自啟),或者使用docker-machine 創建三臺虛擬機。swarm 不需要單獨安裝,安裝了 docker 就自帶了該軟件

  • 已安裝Docker Engine 1.12或更高版本

  • 關閉所有主機上的防火墻或者開放以下端口:

    • TCP協議端口 2377 :集群管理端口

    • TCP協議端口 7946 :節點之間通訊端口(不開放則會負載均衡失效)

    • UDP協議端口 4789 :overlay網絡通訊端口

    • 防火墻相關命令:

      # 查看firewalld防火墻狀態 systemctl status firewalld# 查看所有打開的端口 firewall-cmd --zone=public --list-ports# 防火墻開放端口(更新firewalld防火墻規則后生效) firewall-cmd --zone=public --add-port=要開放的端口/tcp --permanent # 選項: –zone # 作用域 –add-port=80/tcp # 添加端口,格式為:端口/通訊協議 –permanent #永久生效,沒有此參數重啟后失效 # 示例: firewall-cmd --zone=public --add-port=3306/tcp --permanent# firewalld防火墻關閉接口(更新firewalld防火墻規則后生效) firewall-cmd --zone=public --remove-port=要關閉的端口/tcp --permanent# 更新firewalld防火墻規則(并不中斷用戶連接,即不丟失狀態信息) firewall-cmd --reload# 啟動firewalld防火墻 systemctl start firewalld # 關閉firewalld防火墻: systemctl stop firewalld # 開機禁用firewalld防火墻 systemctl disable firewalld # 開機啟用firewalld防火墻: systemctl enable firewalld
  • 分別修改機器的主機名,更改成 swarm01,swarm02 …

    hostnamectl set-hostname swarm01

創建docker swarm集群

1.master主機上初始化swarm。執行 docker swarm init 命令的節點自動成為管理節點。

docker swarm init# 注:如果主機有多個網卡,擁有多個IP,必須使用 --advertise-addr 指定 IP。 # 示例: docker swarm init --advertise-addr 192.168.99.100 # 執行命令后會給出加入這個swarm的命令 Swarm initialized: current node (4a8mo8cekpe0vpk0ze963avw9) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

2.在node主機上執行命令加入swarm

docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:2377

3.查看集群信息。集群的大部分命令需要在管理節點中才能運行

# 查看 swarm 集群狀態 docker info # 查看集群節點信息 docker node ls

Swarm 集群管理常用命令

docker swarm:管理集群

# 初始化一個swarm docker swarm init [OPTIONS] # 選項: --advertise-addr string # 發布的地址(格式:<ip|interface>[:port]) --force-new-cluster # 強制從當前狀態創建一個新的集群(去除本地之外的所有管理器身份) --cert-expiry duration # 節點證書有效期(ns|us|ms|s|m|h)(默認為2160h0m0s) --data-path-addr string # 用于數據路徑通信的地址或接口(格式: <ip|interface>) --data-path-port uint32 # 用于數據路徑流量的端口號(1024 - 49151)。如果沒有值,則默認端口號4789 --dispatcher-heartbeat duration # 調度程序的心跳周期(ns|us|ms|s|m|h)(默認為5s) --listen-addr node-addr # 監聽地址(格式: <ip|interface>[:port]) (默認 0.0.0.0:2377)# 查看加入節點到集群的命令及令牌(token) docker swarm join-token [OPTIONS] (worker|manager) # 選項: -q, --quiet # 只顯示令牌--rotate # 使舊令牌無效并生成新令牌 # 查看加入工作節點到集群的命令及令牌 docker swarm join-token worker # 查看加入管理節點到集群的命令及令牌 docker swarm join-token manager# 將節點加入swarm集群,作為一個manager或worker docker swarm join [OPTIONS] HOST:PORT # 選項: --advertise-addr string # 發布的地址 (格式: <ip|interface>[:port]) --availability string # 節點的可用性 ("active"|"pause"|"drain") (default "active") --data-path-addr string # 用于數據路徑通信的地址或接口 (格式: <ip|interface>) --listen-addr node-addr # 監聽地址 (格式: <ip|interface>[:port]) (default 0.0.0.0:2377) --token string # 進入的swarm集群的令牌 # 主動退出集群,讓節點處于down狀態(在需要退出Swarm集群的節點主機上執行命令) docker swarm leave [OPTIONS] # 選項: -f, --force # 強制。Manager若要退出 Swarm 集群,需要加上強制選項 ## 移除一個work-node節點主機的完整步驟: # 1.在管理節點上操作,清空work-node節點的容器。id 可以使用命令 docker node ls 查看 docker node update --availability drain [id] # 2.在work-node節點主機上操作,退出集群 docker swarm leave # 3,在管理節點上操作,刪除work-node節點 docker node rm [id] # 若想解散整個集群,則需先移除所有work-node節點主機,然后所有管理節點也退出集群# 更新 swarm 集群的配置 docker swarm update [OPTIONS] # 選項: --autolock # 更改管理器自動鎖定設置(true|false) --cert-expiry duration # 節點證書有效期(ns|us|ms|s|m|h)(默認為2160h0m0s) --dispatcher-heartbeat duration # 調度程序心跳周期(ns|us|ms|s|m|h)(默認為5s)

docker node:管理swarm集群節點

# 查看集群中的節點 docker node ls #選項: -f, --filter filter # 根據所提供的條件過濾輸出。(格式:key=value)# 目前支持的過濾器是:id, label, name, membership[=accepted|pending]# , role[manager|worker] -q, --quiet # 只顯示id# 查看運行的一個或多個及節點任務數,默認當前節點 docker node ps [OPTIONS] [NODE...] #選項: -f, --filter filter # 根據所提供的條件過濾輸出 -q, --quiet # 只顯示id# 將worker角色升級為manager docker node promote NODE [NODE...] # 將manager角色降級為worker docker node demote NODE [NODE...]# 查看節點的詳細信息,默認json格式 docker node inspect 主機名 # 查看節點信息平鋪格式 docker node inspect --pretty 主機名# 從swarm中刪除一個節點 docker node rm 主機名 # 從swarm中強制刪除一個節點 docker node rm -f 主機名# 更新一個節點 docker node update [options] 主機名 # 選項 --label-add list # 添加節點標簽(key=value) --label-rm list # 刪除節點標簽 --role string # 更改節點角色 ("worker"|"manager") --availability active/pause/drain # 設置節點的狀態# active 正常# pause 暫停。調度程序不向節點分配新任務,但是現有任務仍然保持運行# drain 排除自身work任務。調度程序不向節點分配新任務,且會關閉任何現有任務并在可用節點上安排它們

docker service:服務管理

# 列出服務列表 docker service ls# 列出服務任務信息 docker service ps [OPTIONS] SERVICE [SERVICE...] # 選項:--no-trunc # 顯示完整的信息 -f, --filter filter # 根據所提供的條件過濾輸出。過濾只運行的任務信息:"desired-state=running" -q, --quiet # 只顯示任務id# 查看服務內輸出 docker service logs [OPTIONS] SERVICE|TASK # 選項:--details # 顯示提供給日志的額外細節 -f, --follow # 跟蹤日志輸出--since string # 顯示自時間戳 (2013-01-02T13:23:37Z) 或相對時間戳 (42m for 42 minutes) 以來的日志 -n, --tail string # 從日志末尾顯示的行數(默認為“all”) -t, --timestamps # 顯示時間戳# 更新服務的相關配置 docker service update [options] 服務名 # 選項 --args "指令" # 容器加入指令 --image IMAGE # 更新服務容器鏡像 --rollback # 回滾服務容器版本 --network-add 網絡名 # 添加容器網絡 --network-rm 網絡名 # 刪除容器網絡 --reserve-cpu int # 更新分配的cpu --reserve-memory bytes # 更新分配的內存(示例:512m) --publish-add 暴露端口:容器端口 # 映射容器端口到主機 --publish-rm 暴露端口:容器端口 # 移除暴露端口 --endpoint-mode dnsrr # 修改負載均衡模式為dnsrr --force # 強制重啟服務 --config-rm 配置文件名稱 # 刪除配置文件 --constraint-add list # 新增一個約束 --constraint-rm list # 移除一個約束 --placement-pref-add pref # 新增一個偏好 --placement-pref-rm pref # 移除一個偏好 --config-add 配置文件名,target=/../容器內配置文件名 # 添加新的配置文件到容器內# 查看服務詳細信息,默認json格式 docker service inspect [OPTIONS] 服務名 [SERVICE...] # 查看服務信息平鋪形式 docker service inspect --pretty 服務名# 刪除服務 docker service rm [OPTIONS] 服務名 [SERVICE...]# 縮容擴容服務容器副本數量 docker service scale 服務名=副本數 [SERVICE=REPLICAS...]# 創建一個服務。一般搭建好 Swarm 集群后,使用 docker stack 部署應用,此處僅作了解 docker service create [OPTIONS] IMAGE [COMMAND] [ARG...] # 選項: --name string # 指定容器名稱 --replicas int # 指定副本數 --network 網絡名 # 添加網絡組 --mode string # 服務模式(復制或全局)(replicated | global) --reserve-cpu int # 預留的cpu --reserve-memory bytes # 預留的內存(512m) --limit-cpu int # 限制CPU --limit-memory bytes # 限制內存(512m) -l, --label list # 服務的標簽(key=value) --container-label list # 容器標簽(key=value) -p, --publish 暴露端口:容器端口 # 映射容器端口到主機 -e, --env MYVAR=myvalue # 配置環境變量 -w, --workdir string # 指定工作目錄(示例:/tmp) -restart-condition string # 滿足條件時重新啟動(no | always | on-failure | unless-stopped) --restart-delay duration # 重新啟動嘗試之間的延遲 (ns/us/ms/s/m/h) --restart-max-attempts int # 放棄前的最大重啟次數 --restart-window duration # 用于評估重啟策略的窗口 (ns/us/ms/s/m/h) --stop-grace-period duration # 強制殺死容器前的等待時間 (ns/us/ms/s/m/h) --update-delay duration # 更新之間的延遲(ns/us/ms/s/m/h)(默認 0s) --update-failure-action string # 更新失敗的操作("pause"停止|"continue"繼續)(默認pause) --update-max-failure-ratio float # 更新期間容忍的失敗率 --update-monitor duration # 每次任務更新后監控失敗的持續時間(ns/us/ms/s/m/h)(默認 0s) --update-parallelism int # 同時更新的最大任務數(0表示一次更新全部任務)(默認為1) --endpoint-mode string # 負載均衡模式(vip or dnsrr) (默認 "vip") --rollback-monitor 20s # 每次容器與容器之間的回滾時間間隔 --rollback-max-failure-ratio .數值 # 回滾故障率如果小于百分比允許運行(“.2”為%20) --mount type=volume,src=volume名稱,dst=容器目錄 # 創建volume類型數據卷 --mount type=bind,src=宿主目錄,dst=容器目錄 # 創建bind讀寫目錄掛載 --mount type=bind,src=宿主目錄,dst=容器目錄,readonly # 創建bind只讀目錄掛載 --config source=docker配置文件,target=配置文件路徑 # 創建docker配置文件到容器本地目錄

docker config:管理配置文件

# 查看已創建配置文件 docker config ls [OPTIONS] # 選項: -f, --filter filter # 根據所提供的條件過濾輸出 -q, --quiet # 只顯示id# 查看配置詳細信息 docker config inspect 配置文件名# 刪除配置 docker config rm CONFIG [CONFIG...]# 創建配置文件 docker config create 配置文件名 本地配置文件 # 示例:新建配置文件并添加新配置文件到服務 # 1.創建配置文件 docker config create nginx2_config nginx2.conf # 2.刪除舊配置文件 docker service update --config-rm ce_nginx_config 服務名 # 3.添加新配置文件到服務 ocker service update --config-add src=nginx2_config,target=/etc/nginx/nginx.conf ce_nginx

docker network:管理網絡

# 查看集群網絡列表 docker network ls# 將容器連接到集群網絡中 $ docker network connect [OPTIONS] NETWORK CONTAINER # 選項--alias strings # 為容器添加網絡范圍的別名--driver-opt string · # 指定網絡驅動程序--ip string # 指定IPv4地址(如172.30.100.104)--ip6 string # 指定IPv6地址(例如,2001:db8::33)--link list # 添加到另一個容器的鏈接--link-local-ip string # 為容器添加一個鏈接本地地址 # 示例 docker network connect mynet nginx# 斷開一個容器與集群網絡的連接 $ docker network disconnect [OPTIONS] NETWORK CONTAINER # 選項-f, --force # 強制容器從網絡斷開連接 # 顯示一個或多個集群網絡的詳細信息 $ docker network inspect [OPTIONS] NETWORK [NETWORK...] # 選項-f, --format string # 使用給定的Go模板格式化輸出-v, --verbose # 輸出詳細的診斷信息# 創建一個集群網絡 $ docker network create [OPTIONS] NETWORK # 選項--attachable # 準許手動容器連接--aux-address map # 網絡驅動使用的輔助IPv4或IPv6地址(默認映射[])--config-from string # 要從其中復制配置的網絡--config-only # 創建僅配置網絡-d, --driver string # 管理網絡的驅動程序(默認為“"bridge”)。選項:bridge、overlay、macvlan--gateway strings # 指定IPv4或IPv6主子網網關。示例:172.20.0.1--ingress # 創建群路由-網格網絡--internal # 限制外部訪問網絡--ip-range strings # 從子范圍分配容器ip--ipam-driver string # IP管理驅動(默認為“default”)--ipam-opt map # 設置IPAM驅動程序的特定選項(默認map[])--ipv6 # 啟用IPv6網絡--label list # 在網絡中設置元數據-o, --opt map # 設置驅動程序特定選項(默認map[])--scope string # 控制網絡的范圍--subnet strings # 指定一個CIDR格式的網段。示例:172.20.0.0/24 # 示例: docker network create -d overlay --attachable apps_net# 移除所有未使用的集群網絡 $ docker network prune [OPTIONS] # 選項--filter filter # 提供過濾值(e.g. 'until=<timestamp>') -f, --force # 強制,沒有提示確認# 刪除一個或多個集群網絡 $ docker network rm NETWORK [NETWORK...] # 別名:rm, remove

docker secret:管理敏感數據存儲

# 查看敏感數據卷列表 $ docker secret ls# 顯示一個或多個敏感數據卷的詳細信息 $ docker secret inspect [OPTIONS] SECRET [SECRET...] # 選項--pretty # 易讀的格式打印信息# 從文件或標準輸入創建一個敏感數據卷作為內容 $ docker secret create [OPTIONS] SECRET [file|-] # 選項-d, --driver string # 指定驅動-l, --label list # 指定標簽--template-driver string # 指定模板驅動程序# 移除一個或多個敏感數據卷 $ docker secret rm SECRET [SECRET...] # 別名:rm, remove

docker網絡管理

參考:

  • docker的3種自定義網絡(bridge、overlay、macvlan)
  • Docker Swarm - 網絡管理
  • Docker的網絡模式bridge、host、container 、overlay

概述

Docker 提供三種 user-defined 網絡驅動:bridge,overlay 和 macvlan

overlay 和 macvlan 用于創建跨主機的網絡

Swarm 集群產生兩種不同類型的流量:

  • 控制和管理層面:包括 Swarm 消息管理等,例如請求加入或離開Swarm,這種類型的流量總是被加密的。(涉及到集群內部的hostname、ip-address、subnet、gateway等)
  • 應用數據層面:包括容器與客戶端的通信等。(涉及到防火墻、端口映射、網口映射、VIP等)

在 Swarm Service 中有三個重要的網絡概念:

  • Overlay networks :管理 Swarm 中 Docker 守護進程間的通信。可以將服務附加到一個或多個已存在的 overlay 網絡上,使得服務與服務之間能夠通信。
  • ingress network :是一個特殊的 overlay 網絡,用于服務節點間的負載均衡,處理與群集服務相關的控制和數據流量。當任何 Swarm 節點在發布的端口上接收到請求時,它將該請求交給一個名為 IPVS 的模塊。IPVS 跟蹤參與該服務的所有IP地址,選擇其中的一個,并通過 ingress 網絡將請求路由到它。
    初始化或加入 Swarm 集群時會自動創建 ingress 網絡,大多數情況下,用戶不需要自定義配置,但是 docker 17.05 和更高版本允許你自定義。
  • docker_gwbridge :是一種橋接網絡,將 overlay 網絡(包括 ingress 網絡)連接到一個單獨的 Docker 守護進程的物理網絡。默認情況下,服務正在運行的每個容器都連接到本地 Docker 守護進程主機的 docker_gwbridge 網絡。
    docker_gwbridge 網絡在初始化或加入 Swarm 時自動創建。大多數情況下,用戶不需要自定義配置,但是 Docker 允許自定義。

在管理節點上查看網絡

$ docker network ls NETWORK ID NAME DRIVER SCOPE cb0ccb89a988 bridge bridge local 0174fb113496 docker_gwbridge bridge local 541b62778c0e host host local 8n7xppn5z4j2 ingress overlay swarm 369d459f340d none null local

overlay網絡驅動程序會創建多個Docker守護主機之間的分布式網絡。該網絡位于(覆蓋)特定于主機的網絡之上,允許連接到它的容器(包括群集服務容器)安全地進行通信。Docker透明地處理每個數據包與正確的Docker守護程序主機和正確的目標容器的路由。

自定義overlay 網絡

創建用于swarm服務的自定義的overlay網絡 命令:

docker network create -d overlay --attachable my-overlay# 注:overlay 網絡創建可以在 Swarm 集群下的任意節點執行,并同步更新到所有節點。

集群中部署了兩個服務 nginx、alpine,現在我們進入alpine,去訪問nginx。

$ docker exec -it test1.1.oonwl8c5g4u3p17x8anifeubi bash $ ping nginx ping: bad address 'nginx'$ wget 192.168.99.100:8080 Connecting to 192.168.99.100:8080 (192.168.99.100:8080) index.html 100% |**********************************************************************************************************| 612 0:00:00 ETA

發現集群中的各個服務不能用名稱訪問的,只能用集群服務發現的路由網絡訪問,若需要集群中的服務能通過名稱進行訪問,這就需要用到上面自定義的 overlay 網絡。

刪除啟動的服務,重新創建指定使用自定義網絡的服務。

docker service rm nginx alpine docker service create --name nginx -p 8080:80 --network my-overlay --replicas 3 nginx docker service create --name alpine --network my-overlay alpine ping www.baidu.com

進入alpine容器中,重新測試下:

$ ping nginx PING nginx (10.0.0.2): 56 data bytes 64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.120 ms 64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.094 ms 64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.108 ms $ wget nginx Connecting to nginx (10.0.0.2:80) index.html 100% |**********************************************************************************************************| 612 0:00:00 ETA

發現可以通過名稱進行集群中的容器間的訪問了。


Docker Stack 部署應用

概述

單機模式下,可以使用 Docker Compose 來編排多個服務。Docker Swarm 只能實現對單個服務的簡單部署。而Docker Stack 只需對已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群環境下的多服務編排。

stack是一組共享依賴,可以被編排并具備擴展能力的關聯service。


Docker Stack和Docker Compose區別

  • Docker stack 會忽略了“構建”指令,無法使用 stack 命令構建新鏡像,它是需要鏡像是預先已經構建好的。 所以 docker-compose 更適合于開發場景;
  • Docker Compose 是一個 Python 項目,在內部,它使用 Docker API 規范來操作容器。所以需要安裝 Docker -compose,以便與 Docker 一起在計算機上使用;Docker Stack 功能包含在 Docker 引擎中。你不需要安裝額外的包來使用它,docker stacks 只是 swarm mode 的一部分。
  • Docker stack 不支持基于第2版寫的 docker-compose.yml ,也就是 version 版本至少為3。然而 Docker Compose 對版本為2和 3 的文件仍然可以處理;
  • docker stack 把 docker compose 的所有工作都做完了,因此 docker stack 將占主導地位。同時,對于大多數用戶來說,切換到使用
  • 單機模式(Docker Compose)是一臺主機上運行多個容器,每個容器單獨提供服務;集群模式(swarm + stack)是多臺機器組成一個集群,多個容器一起提供同一個服務;

compose.yml deploy 配置說明

docker-compose.yaml 文件中 deploy 參數下的各種配置主要對應了 swarm 中的運維需求。

docker stack deploy 不支持的參數:

(這些參數,就算yaml中包含,在stack的時候也會被忽略,當然也可以為了 docker-compose up 留著這些配置)

build cgroup_parent container_name devices tmpfs external_links links network_mode restart security_opt userns_mode

deploy:指定與服務的部署和運行有關的配置。只在 swarm 模式和 stack 部署下才會有用。且僅支持 V3.4 及更高版本。

可以選參數:

  • endpoint_mode:訪問集群服務的方式。3.2版本開始引入的配置。用于指定服務發現,以方便外部的客戶端連接到swarm

    • vip:默認的方案。即通過 Docker 集群服務一個對外的虛擬 ip對外暴露服務,所有的請求都會通過這個虛擬 ip 到達集群服務內部的機器,客戶端無法察覺有多少個節點提供服務,也不知道實際提供服務的IP和端口。
    • dnsrr:DNS的輪詢調度。所有的請求會自動輪詢獲取到集群 ip 列表中的一個 ip 地址。客戶端訪問的時候,Docker集群會通過DNS列表返回對應的服務一系列IP地址,客戶連接其中的一個。這種方式通常用于使用自己的負載均衡器,或者window和linux的混合應用。
  • labels:在服務上設置標簽,并非附加在service中的容器上。如果在容器上設置標簽,則在deploy之外定義labels。可以用容器上的 labels(跟 deploy 同級的配置) 覆蓋 deploy 下的 labels。

  • mode:用于指定是以副本模式(默認)啟動還是全局模式

    • replicated:副本模式,復制指定服務到集群的機器上。默認。
    • global:全局模式,服務將部署至集群的每個節點。類似于k8s中的DaemonSet,會在每個節點上啟動且只啟動一個服務。
  • replicas:用于指定副本數,只有mode為副本模式的時候生效。

  • placement:主要用于指定約束和偏好。這個參數在運維的時候尤為關鍵

    • constraints(約束):表示服務可以部署在符合約束條件的節點上,包含了:

      node attributematchesexample
      node.id節點idnode.id == 2ivku8v2gvtg4
      node.hostname節點主機名node.hostname != node-2
      node.role節點角色 (manager/worker)node.role == manager
      node.platform.os節點操作系統node.platform.os == windows
      node.platform.arch節點架構node.platform.arch == x86_64
      node.labels用戶定義的labelsnode.labels.security == high
      engine.labelsDocker 引擎的 labelsengine.labels.operatingsystem == ubuntu-14.04
    • preferences(偏好):表示服務可以均勻分布在指定的標簽下。

    • preferences 只有一個參數,就是spread,其參數值為節點的屬性,即約束表中的內容

      例如:node.labels.zone這個標簽在集群中有三個值,分別為west、east、north,那么服務中的副本將會等分為三份,分布到帶有三個標簽的節點上。

    • max_replicas_per_node:3.8版本中開始引入的配置。控制每個節點上最多的副本數。

      注意:當 最大副本數*集群中可部署服務的節點數<副本數,會報錯

  • resources:用于限制服務的資源,這個參數在運維的時候尤為關鍵。

    示例:配置 redis 集群運行需要的 cpu 的百分比 和 內存的占用。避免占用資源過高出現異常。

    • limit:用于限制最大的資源使用數量
      • cpus:cpu占比,值的格式為百分比的小數格式
      • memory:內存的大小。示例:512M
    • reservation:為最低的資源占用量。
      • cpus
      • memory
  • restart_policy:容器的重啟策略

    • condition:重啟的條件。可選 none,on-failure 或者 any。默認值:any
    • delay:嘗試重啟的時間間隔(默認值:5s)。
    • max_attempts:最大嘗試重啟容器的次數,超出次數,則不再嘗試(默認值:一直重試)。
    • window:判斷重啟是否成功之前的等待時間(一個總的時間,如果超過這個時間還沒有成功,則不再重啟)。
  • rollback_config:更新失敗時的回滾服務的策略。3.7版本加入。和升級策略相關參數基本一致。

  • update_config:配置應如何更新服務,對于配置滾動更新很有用。

    • parallelism:同時升級[回滾]的容器數
    • delay:升級[回滾]一組容器的時間間隔
    • failure_action:若更新[回滾]失敗之后的策略:continue、 pause、rollback(僅在update_config中有) 。默認 pause
    • monitor:容器升級[回滾]之后,檢測失敗的時間檢測 (支持的單位:ns|us|ms|s|m|h)。默認為 5s
    • max_failure_ratio:最大失敗率
    • order:升級[回滾]期間的操作順序。可選:stop-first(串行回滾,先停止舊的)、start-first(并行回滾,先啟動新的)。默認 stop-first 。注意:只支持v3.4及更高版本

compose.yml 文件示例

version: "3" # 版本號,deploy功能是3版本及以上才有的 services: # 服務,每個服務對應配置相同的一個或者多個docker容器redis: # 服務名,自取image: redis:alpine # 創建該服務所基于的鏡像。使用stack部署,只能基于鏡像ports: # 容器內外的端口映射情況- "1883:1883"- "9001:9001"networks: # 替代了命令行模式的--link選項- fiwarevolumes: # 容器內外數據傳輸的對應地址- "/srv/mqtt/config:/mqtt/config:ro"- "/srv/mqtt/log:/mqtt/log"- "/srv/mqtt/data/:/mqtt/data/"command: -dbhost stack_mongo # 命令行模式中跟在最后的參數,此條沒有固定的格式,建議參照所部署的docker鏡像的說明文檔來確定是否需要該項、需要寫什么deploy:mode: replicatedreplicas: 6 # replicas模式, 副本數目為1endpoint_mode: viplabels: description: "This redis service label"resources:limits:cpus: '0.50'memory: 50Mreservations:cpus: '0.25'memory: 20Mrestart_policy:condition: on-failuredelay: 5smax_attempts: 3window: 120splacement:constraints:- "node.role==worker" # 部署位置,只在工作節點部署- "engine.labels.operatingsystem==ubuntu 18.04"preferences:- spread: node.labels.zoneupdate_config:parallelism: 2delay: 10sorder: stop-firstnetworks: # 定義部署該項目所需要的網絡fiware:

stack 常用命令

docker stack:編排部署應用

# 部署一個新的stack(堆棧)或更新現有的stack。別名:deploy, up docker stack deploy [OPTIONS] 自定義STACK名稱 # 選項: -c, --compose-file strings # Compose文件的路徑,或從標準輸入中讀取的“-” --prune # 表示削減不再引用的服務。可以把一些down掉的service進行自動清理。 --orchestrator string # 指定編排模式 (swarm|kubernetes|all) --resolve-image string # 請求倉庫來重新解析鏡像的摘要和支持的平臺。("always"|"changed"|"never") (默認 "always") --with-registry-auth # 發送倉庫的授權詳情到Swarm代理 --orchestrator # 使用的容器編排服務# 通過compose.yml文件指令部署 docker stack deploy -c 文件名.yml 自定義STACK名稱# 列出現有堆棧。別名:ls, list docker stack ls [OPTIONS]# 列出堆棧中的任務 docker stack ps [OPTIONS] STACK # 選項: --no-trunc # 輸出完整信息# 刪除一個或多個堆棧。別名:rm, remove, down docker stack rm [OPTIONS] STACK [STACK...] # 選項--orchestrator string # 指定適配器 (swarm|kubernetes|all)# 列出堆棧中的服務 docker stack services [OPTIONS] STACK

總結

以上是生活随笔為你收集整理的docker swarm 集群服务编排部署指南(docker stack)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。