纯干货
废话不多说,直接实操,当初上生产也踩了不少坑
构建swarm
前提
开启TCP/UDP端口7946 用于容器网络发现
开启UDP端口4789 用于容器覆盖网络
开启TCP/UDP端口2377 用于swarm调度管理
或者关闭防火墙
温馨提示
主从服务器都需要开启端口。部分云厂商4789端口可能被屏蔽,可能会导致集群不同。端口可以自定义,我这边使用的是5789端口
上代码
# 云主机看需求指定--advertise-addr,否则使用的是内网ip
# --data-path-port如果需要自定义容器覆盖网络的端口,必须指定对应
docker swarm init --advertise-addr 192.168.1.10 --data-path-port 5789
# 创建一个swarm器群容器运行的网段
docker network create -d overlay --gateway 10.0.1.1 --subnet 10.0.1.0/24 --attachable mynet
# worker子节点加入管理节点manager
# 如果manager节点有指定--advertise-addr,则从节点加入时也必须指定,否则集群容器ip会ping不通
docker swarm join --token xxxx --advertise-addr 192.168.1.10:2377
环境compose.yml
我这边使用的nacos、seata、rabbitmq、redis、sentinel都是单节点,dubbo服务部署的是集群,mysql使用的云
先部署nacos相关,因为像seata、sentinel,我这边是有注册到nacos的,如果同时部署会导致失败进行重试。所以环境相关的分俩个compose文件部署before-docker-compose.yml、after-docker-compose.yml
before-docker-compose.yml
# before-docker-compose.yml
version: '3.3'
services:
bld-redis:
image: redis:6.2.6
ports:
- 6379:6379
environment:
TZ: Asia/Shanghai
LANG: en_US.UTF-8
volumes:
- /opt/docker/env/redis/conf/redis.conf:/etc/redis.conf
- /opt/docker/env/redis/data:/data
command:
# 运行自己的redis配置
redis-server /etc/redis.conf
networks:
- mynet
deploy:
mode: global #replicated
placement:
constraints: [node.role == manager]
#replicas: 1
bld-rabbitmq:
# 这里是我自定义的延时插件镜像
image: rabbitmq-delayed:3.10.6
ports:
- 5672:5672
- 15672:15672
networks:
- mynet
environment:
TZ: Asia/Shanghai
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEF