Docker Swarm 简介
Docker Swarm 是 Docker 官网推出的基于 Go 语言实现的容器集群治理平台,极大不便了咱们治理 Docker 主机、网络、存储。
一个 Swarm 群包含一个或多个 Docker 主机,这里的 Docker 主机能够是物理机、虚拟机、云主机等其余运行 Docker 环境的操作系统。
外围概念
Init
在 Docker 装置的时候曾经集成了 Swarm 集群能力,咱们只须要一行命令开启它
docker swarm init
Node
Node 示意的是 Swarm 集群中的一个节点,是一个大的调度单元,由集群管理者对立治理,在 Swarm 集群中咱们能够执行以下命令查看节点信息
docker node ls
Manager
Swarm 集群的管理者角色,一个集群中至多有一个 manager 它负责集群资源分配、任务调度,它也能够被本人获取其余 manager 调度,一个节点被退出集群的时候咱们能够指定
它的身份,能够通过以下命令查看退出集群 manager 角色的命令 \
Worker
Swarm 集群中只能被调度的工作节点,worker 节点仅负责运行工作,能够通过以下命令查看退出集群 worker 角色的命令 \
Service
Service 服务是 Swarm 集群中的最小执行单元,它具备资源限度、弹性伸缩、滚动降级和简略会滚的能力,咱们的利用均以 service 定义并运行在集群中
Config
config 配置管理,用于定义存储咱们的配置,例如利用启动须要的配置,能够应用以下命令创立咱们的配置
echo "application.name=demo" | docker application.properties -
Secret
secret 密钥治理,思考到配置平安,一些明感信息咱们能够抉择密钥存储,相似于 config 的应用形式
echo "123456" | docker mysql.password -
docker-compose
理解的 swarm 集群的基本概念,上面咱们将学习如何应用 docker-compose 语法来编写咱们的利用。这里仅做学习应用,redis、mysql 等存储监控组件均已单机版运行。
version: "3.2" #compose 版本号
services:
redis: #服务名称
image: redis #镜像地址
logging: # 日志设置
driver: "json-file"
options:
max-size: "100m"
max-file: "3"
command: --requirepass 123456 # 服务启动时执行的命令
deploy:
mode: global #指定服务模式为集群惟一
placement:
constraints: [node.labels.node == manager] #指定运行节点为 manager
nacos:
image: nacos/nacos-server
depends_on: #指定服务启动程序,nacos 依赖 mysql
- mysql
environment: #环境变量
- MODE=standalone
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_DB_NAME=nacos_config
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=123456
deploy:
mode: global
placement:
constraints: [node.labels.node == manager]
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"
ports:
- "8848:8848"
sentinel:
image: registry.cn-hangzhou.aliyuncs.com/yaochengzhu/sentinel
deploy:
mode: global
placement:
constraints: [node.labels.node == manager]
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"
ports:
- "8858:8858"
mysql:
image: registry.cn-hangzhou.aliyuncs.com/yaochengzhu/mysql:2021-04-10
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
- mysql:/var/lib/mysql
command:
--default-time_zone='+8:00'
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
deploy:
mode: global
placement:
constraints: [node.labels.node == manager]
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"
order-center:
image: registry.cn-hangzhou.aliyuncs.com/yaochengzhu/order-center:2020-12-04-18-09-19
restart: always
depends_on:
- mysql
- nacos
- redis
deploy:
replicas: 2 #运行实例数量
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"
environment:
- SERVER_PORT=80
- MYSQL_SERVER=jdbc:mysql://mysql:3306/order_center?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
- MYSQL_USER_NAME=root
- MYSQL_ROOT_PASSWORD=123456
- REDIS_HOST=redis
- REDIS_PORT=6379
- REDIS_PASSWORD=123456
- NACOS_SERVER=nacos:8848
- LOG_LEVEL=INFO
healthcheck: #监控查看
test: ["CMD","curl","-f", "http://127.0.0.1/doc.html"] #查看命令
interval: 5s #查看周期
timeout: 5s #单次查看超时工夫
retries: 100 #最大查看次数
user-center:
image: registry.cn-hangzhou.aliyuncs.com/yaochengzhu/user-center:2020-12-04-18-09-19
restart: always
environment:
- SERVER_PORT=80
- MYSQL_SERVER=jdbc:mysql://mysql:3306/user_center?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
- MYSQL_USER_NAME=root
- MYSQL_ROOT_PASSWORD=123456
- REDIS_HOST=redis
- REDIS_PORT=6379
- REDIS_PASSWORD=123456
- NACOS_SERVER=nacos:8848
- LOG_LEVEL=INFO
depends_on:
- mysql
- nacos
- redis
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"
healthcheck:
test: ["CMD","curl","-f", "http://127.0.0.1/doc.html"]
interval: 5s
timeout: 5s
retries: 100
api-gateway:
image: registry.cn-hangzhou.aliyuncs.com/yaochengzhu/api-gateway:2020-12-04-18-09-19
restart: always
environment:
- SERVER_PORT=80
- USER_CENTER_SERVER=lb://user-center
- ORDER_CENTER_SERVER=lb://order-center
- NACOS_SERVER=nacos:8848
- SENTINEL_SERVER=sentinel:8858
- LOG_LEVEL=INFO
depends_on:
- user-center
- order-center
- nacos
- sentinel
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"
healthcheck:
test: ["CMD","curl","-f", "http://127.0.0.1/doc.html"]
interval: 5s
timeout: 5s
retries: 100
nginx:
image: registry.cn-hangzhou.aliyuncs.com/yaochengzhu/nginx:api-gateway
restart: always
ports:
- "80:80"
- "443:443"
depends_on:
- api-gateway
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"
healthcheck:
test: ["CMD","curl","-f", "http://127.0.0.1/doc.html"]
interval: 5s
timeout: 5s
retries: 100
volumes: #创立数据卷
mysql:
将上述文件保留为 docker-compose.yaml 在文件所在目录执行 docker-compose up
即可启动服务。但在理论应用中,咱们可能会有多个环境,为了更加便于管理
咱们通常应用 docker stack 来隔离咱们的服务。
docker stack deploy --compose-file=demo-compose.yaml demo #在 demo 环境运行咱们的服务
查看咱们的服务 \
Portainer 可视化治理
通过后面对 swarm 集群的理解当前,咱们须要更加不便的治理集群,这里我为大家举荐 portainer 容器管理工具,尔后咱们所有的操作基本上都会在 portainer 提供的 UI 界面上实现。
装置 portainer
在 swarm 集群中装置
version: '3.2'
services:
agent:
image: portainer/agent:2.11.1
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
networks:
- agent_network
deploy:
mode: global
placement:
constraints: [node.platform.os == linux]
portainer:
image: portainer/portainer-ce:2.11.1
command: -H tcp://tasks.agent:9001 --tlsskipverify
ports:
- "9443:9443"
- "9000:9000"
- "8000:8000"
volumes:
- portainer_data:/data
networks:
- agent_network
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
networks:
agent_network:
driver: overlay #跨主机网络
attachable: true
volumes:
portainer_data:
执行装置命令
docker stack deploy --compose-file=portainer.yaml portainer_demo
期待装置胜利当前,浏览器 ip:9000 拜访 portainer 初始化界面并设置明码 \
登录进去当前呢就是这样子 \
针对罕用的几个性能我标注了一下,大家有趣味能够深刻理解下。\
咱们看下后面运行的 demo 成果 \
增加域名解析拜访接口地址 \
总结
到这里置信大家对 docker swarm 有了肯定的理解,绝对于 k8s 集群 swarm 显得瘦小了许多,swarm 集群适宜企业规模不大、利用不是很简单的场景。
阿里云在 2019 年 12 月 31 日下线了 swarm 集群,从此 swarm 跌落云端,k8s 日渐火爆起来。咱们在抉择技术的时候不仅仅是须要思考技术自身的优越性
也须要思考适用性,毕竟最合适的才是最好的,兴许你能够试试 swarm + portainer 或者 swarm + rancher。
参考资料
[1] docker: https://www.docker.com/
[2] swarm: https://docs.docker.com/engin…
[3] portainer: https://www.portainer.io/