一, 简介
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 v1.12+, 添加私有镜像仓库源
- /etc/docker/daemon.JSON
- {
- "insecure-registries":["xxx.xxx.xxx.xxx:5000"]
- }
集群节点之间保证 TCP 2377,TCP/UDP 7946 和 UDP 4789 端口通信(或者直接关闭防火墙 systemctl stop firewalld)
- 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 --permanent
- firewall-cmd --zone=public --add-port=4789/tcp --permanent # overlay 网络通讯端口
- firewall-cmd --zone=public --add-port=4789/udp --permanent
- firewall-cmd --reload
初始化 swarm
- docker swarm init \ # 默认初始化节点为 manager
- --advertise-addr 192.168.89.14 \ # 多网卡的情况下, 指定需要使用的 ip
- --listen-addr 192.168.89.14:2377 # 指定监听的 ip 与 port
添加工作节点
--token 初始化时获取, 或者通过命令获取(docker swarm join-token worker)
- docker swarm join \
- --advertise-addr 192.168.89.15 \
- --listen-addr 192.168.89.15:2377 \ # 可不加, 根据实际需求
- --token SWMTKN-1-29ynh5uyfiiospy4fsm4pd4xucyji2rn0oj4b4ak4s7a37syf9-ajkrv2ctjr5cmxzuij75tbrmz \ # 节点 token
- 192.168.89.14:2377 # 管理节点
管理节点
- docker node ls # 查看节点
- docker node rm # 移除节点
- docker swarm leave # 退出节点(对应节点上运行)
更详细部署推荐>>> Docker Swarm 集群部署实践 https://www.jianshu.com/p/028b40ca4f2a
三, Docker config
17.06 引入了群体服务配置, 使您可以在服务映像之外或运行中的容器之外存储非敏感信息, 例如配置文件. 这使您可以保持映像尽可能通用, 而无需将安装文件绑定安装到容器中或使用环境变量.
可以随时在服务中添加或删除配置, 并且服务可以共享配置. 您甚至可以将配置与环境变量或标签结合使用, 以实现最大的灵活性. 配置值可以是通用字符串或二进制内容(最大 500 kb).
注意: Docker 配置仅适用于群集服务, 不适用于独立容器.
将配置添加到群集时, Docker 会通过双向 TLS 连接将配置发送到群集管理器. 该配置存储在 Raft 日志中, 该日志已加密. 整个 Raft 日志会在其他管理器之间复制, 以确保对配置的高可用性保证与其他集群管理数据一样.
当您授予对配置的新创建或正在运行的服务访问权限时, 该配置将作为文件安装在容器中. 容器中安装点的位置默认为 /<config-name>Linux 容器中的位置.
docker config create jmdiservice-application.properties ~/local/application.properties # 为创建服务所引用
四, Docker service
服务是自 Docker 1.12 后新引入的概念, 并且仅适用于 Swarm 模式.
使用服务仍能够配置大多数熟悉的容器属性, 比如容器名, 端口映射, 接入网络和镜像.
此外还增加了额外的特性, 比如可以声明应用服务的期望状态, 将其告知 Docker 后, Docker 会负责进行服务的部署和管理.
更多概念推荐>>> Docker 管理工具 - Swarm
服务创建
- 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
命令详解:
--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 service update --rollback 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.YAML QS
- # file: docker-compose.YAML
- version: "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
- Windows: 30s
- update_config: # 升级配置 [并发数, 延时, 失败处理, 监听时间, 更新规则]
- parallelism: 1
- delay: 5s
- failure_action: rollback
- monitor: 5s
- order: start-first
- resources: # 资源控制 [CPU,mem]
- limits:
- #cpus: '0.2'
- memory: 1024M
- configs: # 定义配置
- JmDiService-application.properties:
- external: true
- networks: # 定义网络
- overlay:
更多参数定义推荐>>> docker-compose 编排参数详解
作者: Leozhanggg
来源: https://www.cnblogs.com/leozhanggg/p/12061360.html