不建议docker-compose在生产环境中使用
- 适用于单机环境通过docker-compose启动多个容器协同工作的
- 单机工作存在单节点故障问题,生产环境是不可接受的,无法达到高可用
- 需要高可用的话,必须是多台物理机器协同工作的,docker-compose无法工作的
集群管理工具docker swarm 容器编排
核心功能
- Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。
- 集群方面,Swarm 将一个或多个 Docker 节点组织起来,使得用户能够以集群方式管理它们,可以自如地添加或删除节点。
- 编排方面,Swarm 提供了一套丰富的 API 使得部署和管理复杂的微服务应用变得易如反掌。通过将应用定义在声明式配置文件中,就可以使用原生的 Docker 命令完成部署。
- 原生 Swarm 应用,它还可以部署和管理 Kubernetes 应用。Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 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查看帮助)
开始部署
要用到的通信接口开放,集群节点之间保证2377/TCP、7946/TCP、7946/UDP和4789/UDP端口通信(或者直接关闭防火墙 systemctl stop firewalld)
代码语言:javascript复制# 集群管理端口
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
# overlay网络通讯端口
firewall-cmd --zone=public --add-port=4789/tcp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --reload
测试机IP说明
192.168.56.2、192.168.56.3、192.168.56.4
代码语言:javascript复制# --advertise-addr 多网卡的情况下,指定需要使用的ip
# --listen-addr 指定监听的 ip 与 port (默认就是使用的IP:2377)
docker swarm init --advertise-addr 192.168.56.2 [--listen-addr 192.168.56.2:2377]
192.168.56.3和192.168.56.4添加工作节点
代码语言:javascript复制# 192.168.56.3
docker swarm join --token SWMTKN-1-4c3sxt490hmca01w07dhidc121f3326w256i1rwd33scf9cdlv-dvini4wkay01vz5j7lky8zy14 192.168.56.2:2377
# 192.168.56.4
docker swarm join --token SWMTKN-1-4c3sxt490hmca01w07dhidc121f3326w256i1rwd33scf9cdlv-dvini4wkay01vz5j7lky8zy14 192.168.56.2:2377
# 查看节点情况
docker node ls
vagrant@swarm2:/etc/docker$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
lh8yowqifw8fvpefdpmhdxsvp * swarm2 Ready Active Leader 20.10.7
uwtk92kiuzccpdv6c6lcmha1y swarm3 Ready Active 20.10.7
zaos4mhr8jkwx2moks4mlr25y swarm4 Ready Active 20.10.7
其他
代码语言:javascript复制# 移除节点
docker node rm HOSTNAME
# 强制从集群中删除节点
docker node rm -f HOSTNAME
# 退出节点(对应节点上运行)
docker swarm leave
# 节点降级(将manager节点降为worker)
docker node demote HOSTNAME
# 节点升级(将worker节点提升为manager)
docker node promote HOSTNAME
部署多 service 应用
本次部署以文章为例进行集群搭建
在生产环境中,service服务应用很多,我们不可能一一创建,需要一个类似于单机环境docker-compose的工具,来帮助我们实现多service服务应用的创建和管理,而swarm stack刚好解决了这一点,它可以使用docker-compose.yml文件在集群里实现多service的创建等一系列工作。这样理解吧!stack可以理解成swarm版本的compose,docker-compose用于单机环境,docker stack用于swarm集群,下面我们会详细讲swarm stack使用。
在介绍stack之前,我们先简说一下docker service 常用的命令。docker service COMMAND --help
查看命令详细参数
docker service create
命令用于创建服务, 按照指定参数的描述创建一个服务,必须在管理器节点上运行此命令。docker service inspect
命令用于显示有关一个或多个服务的详细信息,必须以管理员节点为目标运行此命令,默认情况下,这将使JSON数组中的所有结果呈现,如果指定了格式,则将为每个结果执行给定的模板。docker service logs
命令用于获取服务的日志,docker服务记录命令批量检索执行时存在的日志。注意:此命令仅适用于使用json-file或日志记录驱动程序启动的服务。docker service ls
命令用于列出服务,此命令在运行定向管理器时,正在群集中运行的列表服务。docker service rm
命令用于删除一个或多个服务,从群集中删除指定的服务,必须以管理员节点为目标运行此命令。docker service scale
命令用于使您能够将一个或多个复制服务向上或向下缩放到所需数量的副本,此命令不能应用于全局模式的服务。该命令将立即返回,但服务的实际缩放可能需要一些时间。 要停止服务的所有副本,同时保持服务在群集中的活动,您可以将比例设置为0。docker service update
命令用于更新服务,它根据指定的参数更新服务。 必须以管理员节点为目标运行此命令
docker stack 部署多应用
大规模场景下的多服务部署和管理是一件很难的事情,Docker Stack由此而生。
docker stack 通过提供、、、、等特性简化了应用的管理,这些功能都封装在一个完美的声明式模型当中。
docker stack 能够在单个声明文件中定义复杂的多服务应用,还提供了简单的方式来部署应用并管理其完整的生命周期: -> -> -> -> 。
主要注意的是,我们操作都在manager的机器上,初始化节点为manager即192.168.56.2。
代码语言:javascript复制# 可以通过以下命令去查看详细参数
docker stack deploy --help
# 创建启动,在私有的dockerhub上拉去镜像需要加上 --with-registry-auth参数
vagrant@swarm2$ docker stack deploy -c docker-compose.yml app
Ignoring unsupported options: build, restart
Updating service app_adminer (id: rtml09uzy2yv3qly9p3j6pk0f)
Updating service app_web (id: pnm1h8n1gjiaxza0ifssghub6)
Updating service app_redis-server (id: ow9f63qmpxkq66urdrn3e3bl6)
Updating service app_mysql-server (id: yzu3gx8ddu2aludkl7t2obhz4)
vagrant@swarm2$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7a7cf965c36 niuzheng131400/web:1.0 "docker-php-entrypoi…" About a minute ago Up 54 seconds (health: starting) 80/tcp, 9000/tcp app_web.1.osvng4z3zq5qvxm3hbg0auf91
2e7444e6d9e6 redis:latest "docker-entrypoint.s…" 2 minutes ago Up 2 minutes (healthy) 6379/tcp app_redis-server.1.dxy4mxmib1dehiqy3zaptbpt1
75a2f27c4508 adminer:latest "entrypoint.sh docke…" 26 hours ago Up 28 minutes (healthy) 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp docker-compose1-adminer-1
0ec03fdbcdd9 mysql:5.7 "docker-entrypoint.s…" 26 hours ago Up 28 minutes (healthy) 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp docker-compose1-mysql-server-1
源码地址
github源码地址
dockerHub地址