阅读本文前,请确保已经正确容器化一台机器并且能够使用docker-compose部署容器。如果没有,请参考编排文件

一个swarm集群中有两种节点,manager节点和worker节点。一个容器化的机器(可以是物理机器,也可以是虚拟机器)可以升级为一个swarm节点。所谓swarm单节点模式,就是swarm集群中只有一个manager节点。

为什么要把一个普通的容器化机器升级为一个swarm节点呢?

  • 普通容器化机器只有image和container概念,而swarm节点引入stack、service和task概念,可以更方便地创建、规模化和管理容器,也能方便地做负载均衡。
    在这里插入图片描述
  • 升级为swarm节点之后,能够和其他容器化机器一起组成swarm集群,跨节点进行管理。
//首先确保机器已经容器化,使用docker-machine创建或者Docker Desktop for **安装。
//创建覆盖网络
docker network create --driver overlay --scope swarm xxl
//将机器升级为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文件的语法编写部署配置文件,以下是参考(如果一个yml有太多服务,可以分为多个小的yml,分别部署,方便管理)

//服务之间可以通过服务名来访问,无需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部署升级为swarm单节点模式成功。这样,就不需要额外安装docker-compose了。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐