阅读本文前,请确保已经正确容器化一台机器并且能够使用docker-compose部署容器。如果没有,请参考编排文件。
一个swarm集群中有两种节点,manager节点和worker节点。一个容器化的机器(可以是物理机器,也可以是虚拟机器)可以升级为一个swarm节点。所谓swarm单节点模式,就是swarm集群中只有一个manager节点。
为什么要把一个普通的容器化机器升级为一个swarm节点呢?
- 普通容器化机器只有image和container概念,而swarm节点引入stack、service和task概念,可以更方便地创建、规模化和管理容器,也能方便地做负载均衡。
- 升级为swarm节点之后,能够和其他容器化机器一起组成swarm集群,跨节点进行管理。
//首先确保机器已经容器化,使用docker-machine创建或者Docker Desktop for **安装。
//将机器升级为swarm管理节点。
docker swarm init //成功执行后,机器即升级为manager节点
//执行这句话之后可以得到一个token,后续凭借token和地址可以加入到集群中
docker swarm join --token ****** --listen-addr **
//如果忘记token,可以使用以下命令查询:
docker swarm join-token manager //加入管理节点token
docker swarm join-token worker //加入工作节点token
//管理节点的集群连接ip端口可以通过命令查询:
docker info
通过上述步骤,可以把一个容器化机器升级为一个swarm节点。
然后参考docker-compose文件的语法编写部署配置文件,以下是参考
//服务之间可以通过服务名来访问,无需links参数链接容器
version: "3.7"
networks:
xxl:
driver: overlay //创建overlay网络
ipam:
driver: default
config:
- subnet: 172.18.0.0/16
services:
nginx:
image: nginx //只能通过镜像来创建,不支持build参数
networks:
- xxl
ports:
- "0.0.0.0:80:80"
- "0.0.0.0:443:443"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf:ro"
- "./dist:/dist:ro"
deploy: //关键还是这个deploy参数,可以仔细看看
replicas: 1
placement:
constraints:
- node.role== manager
redis:
image: redis
networks:
- xxl
ports:
- "0.0.0.0:6379:6379"
volumes:
- "./redis/redis.conf:/etc/redis/redis.conf:ro"
- "./redis:/data:rw"
command: redis-server /etc/redis/redis.conf
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
mysql:
image: xxl-mysql
networks:
- xxl
ports:
- "0.0.0.0:33060:3306"
volumes:
- "./mysql:/var/lib/mysql:rw"
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
rabbitmq:
image: xxl-rabbitmq
networks:
- xxl
ports:
- "0.0.0.0:15672:15672"
- "0.0.0.0:1883:1883"
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
nexus:
image: sonatype/nexus3
networks:
- xxl
ports:
- "0.0.0.0:8081:8081"
volumes:
- "./nexus:/nexus-data:rw"
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
portainer: //用于查看集群情况
image: portainer/portainer
networks:
- xxl
ports:
- "0.0.0.0:8082:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
然后使用yml文件来创建容器,任务,服务和堆栈
//按照配置文件创建名为xxl的stack
docker stack deploy -c .\docker-compose.yml xxl
//移除名称为xxl的stack
docker stack rm xxl
由于服务中加入了portainer,可以访问http://localhost:8082/#/home查看集群的情况
至此,容器化机器+docker-compose部署升级为swarn单节点模式成功。这样,就不需要额外安装docker-compose了。