使用 Docker Stack 部署多服务集群
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 Docker Stack 部署多服务集群相关的知识,希望对你有一定的参考价值。
参考技术A单机模式下,我们可以使用 Docker Compose 来编排多个服务,而在 上一篇文章 中介绍的 Docker Swarm 只能实现对单个服务的简单部署。于是就引出了本文的主角 Docker Stack ,通过 Docker Stack 我们只需对已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群环境下的多服务编排。
注意:如果有多个 manager 节点,portainer 和 visualizer 可能分别部署在两台机器上,所以ip可能会不一样。
评论区有小伙伴提到,容器间通过服务名 ( 比如文中的 nginx ) 通讯时,对应的 IP 却和容器的实际 IP 对不上。出现这个情况是因为负载均衡( 对外表现为一个服务,内部为多个服务 )。下面是我做的试验,希望能帮助大家理解。
总结下:
整个请求的调用流程应该就是: 通过服务名 nginx 访问 -- 指向 --> stack 集群网关 ( 10.0.6.5 ) -- 转发 --> stack 集群中,位于当前服务器的负载均衡实例 ( 10.0.6.4 ) -- 分发 --> 最终的应用 。
如果你还没玩过Docker Stack管理服务,你已经out了,(送Portainer集群管理教程)
在上面我们学会了如何配置一个swarm集群,并且知道如何在swarm集群上部署应用,现在,我们开始了解Docker层级关系中的最高一个层级——stack。一个stack就是一组有关联的服务的组合,可以编排在一起,一起管理。
单机模式下,我们可以使用 Docker-Compose来编排多个服务,而 Docker Swarm 只能实现对单个服务的简单部署。于是就引出了本文的主角 Docker Stack ,通过 Docker Stack 我们只需对已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群环境下的多服务编排。
集群搭建案例
应用部署情况
服务名称 | 数量 |
---|---|
mysql | 1 |
nacos | 1 |
learn-docker-gateway | 1 |
learn-docker-web | 2 |
learn-docker-storage | 2 |
创建docker-compose.yml
version: 3.9
services:
mysql:
image: mysql:5.7.33
networks:
- learn-docker-network
volumes:
- "/tmp/etc/mysql:/etc/mysql/mysql.conf.d/"
- "/tmp/data/mysql:/var/lib/mysql"
environment:
MYSQL_ROOT_PASSWORD: root
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.labels.role == data
restart_policy:
condition: on-failure
delay: 5s
nacos:
image: nacos/nacos-server
ports:
- "8848:8848"
networks:
- learn-docker-network
environment:
MODE: standalone
JVM_XMS: 128m
JVM_XMX: 128m
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
delay: 5s
learn-docker-web:
image: manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-web:1.0-SNAPSHOT
networks:
- learn-docker-network
depends_on:
- nacos
- mysql
deploy:
mode: replicated
replicas: 2
restart_policy:
condition: on-failure
delay: 5s
learn-docker-storage:
image: manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-storage:1.0-SNAPSHOT
networks:
- learn-docker-network
depends_on:
- nacos
- mysql
deploy:
mode: replicated
replicas: 2
restart_policy:
condition: on-failure
delay: 5s
learn-docker-gateway:
image: manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-gateway:1.0-SNAPSHOT
ports:
- "8888:8888"
networks:
- learn-docker-network
depends_on:
- nacos
- mysql
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
delay: 5s
visualizer:
image: dockersamples/visualizer
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
delay: 5s
networks:
learn-docker-network:
driver: overlay
配置介绍
Stack文件就是Docker Compose文件。唯一的要求就是version:一项需要是3.0或者更高的值。在Docker根据某个Stack文件部署应用的时候,首先会检查并创建networks:关键字对应网络。如果网络不存在,Docker会进行创建。下面我们详细看下这几个模块。
overlay网络
这里定义了1个网络,默认情况下网络都是使用overlay驱动,新建对应的覆盖类型的网络。
networks:
learn-docker-network:
driver: overlay
部署节点副本数
deploy:
mode: replicated
replicas: 2
restart_policy:
condition: on-failure
delay: 5s
- replicas: 2 设置了期望服务的副本数量为2,默认为1.如果服务正在运行,需要调整副本数。可以调整stack文件中的 replicas 的数值,然后重新部署stack。重新部署stack并不会影响那些没有改动的服务。
- restart_policy: 定义了Swarm针对容器异常退出的重启策略。当前服务的重启策略是:如果某个副本以非0返回值退出,会立即重启当前副本。重启最多尝试3次,每次都是等待之多120s来检测是否成功。每次重启的间隔是5s。
节点约束
mysql:
image: mysql:5.7.33
networks:
- learn-docker-network
volumes:
- "/tmp/etc/mysql:/etc/mysql/mysql.conf.d/"
- "/tmp/data/mysql:/var/lib/mysql"
environment:
MYSQL_ROOT_PASSWORD: root
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.labels.role == data
restart_policy:
condition: on-failure
delay: 5s
部署服务
部署应用
docker stack deploy -c docker-compose.yml learn-docker-test
查看部署情况
服务部署情况
查看nacos节点信息
测试访问服务
curl http://192.168.64.153:8888/employeapi/find/10001| python -m json.tool
集群管理
更新服务
参数详解
-
--force 强制更新重启服务,无论是否配置或镜像改变都更新
-
--image <image:tag> 制定更新的镜像
-
--with-registry-auth 向 Swarm 代理发送 Registry 认证详细信息,私有仓库需要携带该参数
更新镜像
#查看服务详情
docker service ls
# 更新服务
docker service update --image manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-storage:1.0-SNAPSHOT learn-docker-test_learn-docker-storage
删除应用
查看部署集群
执行删除
docker stack rm learn-docker-test
相关命令(手册)
docker stack 常用命令
命令 | 说明 |
---|---|
docker stack deploy | 部署新的堆栈或更新现有堆栈 |
docker stack ls | 列出现有堆栈 |
docker stack ps | 列出堆栈中的任务 |
docker stack rm | 删除堆栈 |
docker stack services | 列出堆栈中的服务 |
docker stack down | 移除某个堆栈(不会删除数据) |
docker service 常用命令
命令 | 说明 |
---|---|
docker service create | 部署服务 |
docker service inspect | 查看服务详情 |
docker service logs | 产看某个服务日志 |
docker service ls | 查看所有服务详情 |
docker service rm | 删除某个服务(-f 强制删除) |
docker service scale | 设置某个服务个数 |
docker service update | 更新某个服务 |
docker node 常用命令
命令 | 说明 |
---|---|
docker node ls | 查看所有集群节点 |
docker node rm | 删除某个节点(-f 强制删除) |
docker node inspect | 查看节点详情 |
docker node demote | 节点降级,由管理节点降级为工作节点 |
docker node promote | 节点升级,由工作节点升级为管理节点 |
docker node update | 更新节点 |
docker node ps | 查看节点中的 Task 任务 |
docker swarm 常用命令
命令 | 说明 |
---|---|
docker swarm init | 初始化集群 |
docker swarm join-token worker | 查看工作节点的 token |
docker swarm join-token manager | 查看管理节点的 token |
docker swarm join | 加入集群中 |
portainer集群管理(扩展)
Portainer介绍
Portainer 的目的是部署和使用一样简单。它由一个可以在任何 Docker 引擎上运行的单一容器组成(可以部署为Linux容器或Windows本地容器,也支持其他平台)。Portainer允许你管理所有的Docker资源(容器、镜像、卷、网络等等)。它与独立的Docker引擎和Docker Swarm模式兼容。
swarm集群安装Portainer
# 下载部署配置文件
curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml
# 部署节点
docker stack deploy -c portainer-agent-stack.yml portainer
注意:此方法将自动部署Portainer服务器的单个实例,并将Portainer代理作为全局服务部署到集群中的每个节点上。
portainer使用
注册用户
查看管理服务
查看swarm节点
管理微服务
服务部署情况
服务名称 | 数量 |
---|---|
mysql | 1 |
nacos | 1 |
learn-docker-gateway | 1 |
learn-docker-web | 2 |
learn-docker-storage | 2 |
准备工作
管理节点标签
添加网络信息
创建仓库配置
创建stack任务
查看节点部署情况
以上是关于使用 Docker Stack 部署多服务集群的主要内容,如果未能解决你的问题,请参考以下文章
如果你还没玩过Docker Stack管理服务,你已经out了,(送Portainer集群管理教程)