Docker swarm實戰總結


Docker swarm實戰總結

一、簡介

Swarm 是 Docker 官方提供的一款集群管理工具 ,其主要作用是把若干臺 Docker 主機抽象為一個整體,並且通過一個入口統一管理這些 Docker 主機上的各種 Docker 資源。

Docker Swarm 包含兩方面:一個企業級的 Docker 安全集群,以及一個微服務應用編排引擎。

集群方面,Swarm 將一個或多個 Docker 節點組織起來,使得用戶能夠以集群方式管理它們, 可以自如地添加或刪除節點

編排方面,Swarm 提供了一套豐富的 API 使得部署和管理複雜的微服務應用變得易如反掌。通過將應用定義在聲明式配置文件中,就可以使用原生的 Docker 命令完成部署。

此外,甚至還 可以執行滾動升級、回滾以及擴縮容操作 ,同樣基於簡單的命令即可完成。

以往,Docker Swarm 是一個基於 Docker 引擎之上的獨立產品。自 Docker 1.12 版本之後, 它已經完全集成在 Docker 引擎中 ,執行一條命令即可啟用。

到2018年,除了原生 Swarm 應用,它還可以部署和管理 Kubernetes 應用。Swarm 和 Kubernetes 比較類似,但是更加輕,具有的功能也較 kubernetes 更少一些。

集群管理: docker swarm 子命令有 init, join, leave, update (docker swarm --help查看幫助)

節點管理: docker node子 命令有 accept, promote, demote, inspect, update, tasks, ls, rm (docker node --help查看幫助)

配置管理: docker config 子命令有 create, inspect, ls, rm (docker config--help查看幫助)

服務管理: docker service 子命令有 create, inspect, update, remove, tasks, ls, rm, ps (docker service--help查看幫助)

堆棧管理: docker stack 子命令有 deploy, services, ps, rm (docker stack--help查看幫助)

二、部署

Docker swarm實戰總結

前期工作

準備幾臺機器,安裝 docker v1.12+ ,添加私有鏡像倉庫源

<code>/etc/docker/daemon.json{ "insecure-registries":["xxx.xxx.xxx.xxx:5000"] }/<code>

集群節點之間保證 TCP 2377、TCP/UDP 7946和UDP 4789 端口通信(或者直接關閉防火牆 systemctl stop firewalld)

<code>firewall-cmd --zone=public --add-port=2377/tcp --permanent # 集群管理端口firewall-cmd --zone=public --add-port=7946/tcp --permanent # 節點之間通訊端口 firewall-cmd --zone=public --add-port=7946/udp --permanentfirewall-cmd --zone=public --add-port=4789/tcp --permanent # overlay網絡通訊端口 firewall-cmd --zone=public --add-port=4789/udp --permanentfirewall-cmd --reload/<code>


初始化swarm

<code>docker swarm init \\ #默認初始化節點為manager--advertise-addr 192.168.89.14 \\ # 多網卡的情況下,指定需要使用的ip--listen-addr 192.168.89.14:2377 # 指定監聽的 ip 與 port/<code>
Docker swarm實戰總結

添加工作節點

--token 初始化時獲取,或者通過命令獲取( docker swarm join-token worker

<code>docker swarm join \\--advertise-addr 192.168.89.15 \\ --listen-addr 192.168.89.15:2377 \\ #可不加,根據實際需求--token SWMTKN-1-29ynh5uyfiiospy4fsm4pd4xucyji2rn0oj4b4ak4s7a37syf9-ajkrv2ctjr5cmxzuij75tbrmz \\ # 節點token192.168.89.14:2377 # 管理節點/<code>


管理節點

<code>docker node ls # 查看節點docker node rm # 移除節點docker swarm leave # 退出節點(對應節點上運行)/<code>
Docker swarm實戰總結

更詳細部署推薦>>> Docker Swarm集群部署實踐

三、Docker config

17.06引入了群體服務配置 ,使您可以在服務映像之外或運行中的容器之外存儲非敏感信息,例如配置文件。這使您可以保持映像儘可能通用,而無需將安裝文件綁定安裝到容器中或使用環境變量。

可以隨時在服務中添加或刪除配置,並且服務可以共享配置。您甚至可以將配置與環境變量或標籤結合使用,以實現最大的靈活性。配置值可以是通用字符串或二進制內容( 最大500 kb )。

注意:Docker配置 僅適用於群集服務 ,不適用於獨立容器。

將配置添加到群集時,Docker會通過雙向TLS連接將配置發送到群集管理器。該 配置存儲在Raft日誌中 ,該日誌已加密。整個Raft日誌會在其他管理器之間複製,以確保對配置的高可用性保證與其他集群管理數據一樣。

當您授予對配置的新創建或正在運行的服務訪問權限時,該配置將作為文件安裝在容器中。容器中安裝點的位置默認為 /<config-name> Linux容器中的位置。

docker config create jmdiservice-application.properties ~/local/application.properties # 為創建服務所引用

Docker swarm實戰總結

四、Docker service

Docker swarm實戰總結

服務是自 Docker 1.12 後新引入的概念,並且僅適用於 Swarm 模式。

使用服務仍能夠配置大多數熟悉的容器屬性 ,比如容器名、端口映射、接入網絡和鏡像。

此外還增加了額外的特性,比如可以聲明應用服務的期望狀態,將其告知 Docker 後,Docker 會負責進行服務的部署和管理。

更多概念推薦>>>Docker管理工具-Swarm

服務創建

<code>docker service create \\--with-registry-auth \\--mode global \\--name jmdiservice \\--config source=jmdiservice-application.properties,target=/root/application.properties \\--mount type=bind,source=/opt/lib,destination=/root/lib \\--env JAVA_OPTS="-Xms1024m -Xmx1024m" \\--publish 20036:20036 \\-td xx.xx.xx.xx:5000/zwx/jmdiservice:1123    /<code>

命令詳解:

--with-registry-auth:將registry身份驗證詳細信息發送給集群代理。

--mode global:全局模式,在這種模式下,每個節點上僅運行一個副本。

另一種是複製模式(--replicas 3),這種模式會部署期望數量的服務副本,並儘可能均勻地將各個副本分佈在整個集群中。

--name:服務名稱。(避免使用符號,容易解析錯誤)

--config:指定要向服務公開的配置。(添加配置參考docker config create)

--mount:將文件系統掛載附加到服務。(需要保留/讀取的容器外信息)

--env:設置環境變量。

--publish:將端口發佈為節點端口。(默認把需要發佈的端口映射到本地)

-td:分配偽TTY,並後臺運行。

注意:鏡像地址、名稱、標籤一定填寫正確

服務更新:

docker service update --args "ping www.baidu.com" redis # 添加參數

docker service scale redis=4 # 為服務擴(縮)容scale

docker service update --image redis:3.0.7 redis # 更新服務的鏡像版本

# 回滾服務

五、Docker stack

大規模場景下的多服務部署和管理是一件很難的事情,Docker Stack由此而生。

Stack 通過提供期望狀態、滾動升級、簡單易用、擴縮容、健康檢查等特性簡化了應用的管理,這些功能都封裝在一個完美的聲明式模型當中。

Stack 能夠在單個聲明文件中定義複雜的多服務應用,還提供了簡單的方式來部署應用並管理其完整的生命週期:

初始化部署 -> 健康檢查 -> 擴容 -> 更新 -> 回滾

步驟很簡單,在 Compose 文件中定義應用,然後通過 docker stack deploy 命令完成部署和管理。

export logpath=/home/jhmyPro/logs

export tag=latest # 使用環境變量,增強可用性

docker stack deploy --with-registry-auth -c docker-compose.yml QS

Docker swarm實戰總結

<code># file: docker-compose.ymlversion: "3.7"services:  JmDiService:  # 服務名    image: xx.xx.xx.xx:5000/zwx/jmdiservice:${tag}        environment:    # 環境變量      LOG_PATH: ${logpath}          PKG_NAME: "JmDiService"      JAVA_OPTS: "-Xms512m -Xmx1024m"        networks:    # 網絡設置      overlay:        ports:  # 端口映射 [宿主機:容器]      - 20036:20036        configs:    # 讀取配置 [配置名:容器]      - source: JmDiService-application.properties        target: /root/application.properties        volumes:    # 掛載數據卷 [宿主機:容器]      - ${logpath}:${logpath}      - /opt/lib:/root/lib      - /usr/local/nginx/html/clientexe:/usr/local/nginx/html/clientexe          deploy:     # 部署設置      mode: replicated      replicas: 3            restart_policy:   # 重啟策略 [條件,延時,最大次數,檢測時間]        condition: on-failure        delay: 5s        max_attempts: 3        window: 30s            update_config:    # 升級配置 [併發數,延時,失敗處理,監聽時間,更新規則]        parallelism: 1        delay: 5s        failure_action: rollback        monitor: 5s        order: start-first              resources:    # 資源控制 [cpu,mem]        limits:          #cpus: '0.2'          memory: 1024Mconfigs:      # 定義配置  JmDiService-application.properties:    external: true    networks:     # 定義網絡  overlay:/<code> 

出處: https://www.cnblogs.com/leozhanggg/p/12061360.html


分享到:


相關文章: