乐趣区

关于docker:被遗忘的-Docker-Swarm

Docker Swarm 简介

Docker Swarm 是 Docker 官网推出的基于 Go 语言实现的容器集群治理平台,极大不便了咱们治理 Docker 主机、网络、存储。
一个 Swarm 群包含一个或多个 Docker 主机,这里的 Docker 主机能够是物理机、虚拟机、云主机等其余运行 Docker 环境的操作系统。

外围概念

Init

在 Docker 装置的时候曾经集成了 Swarm 集群能力,咱们只须要一行命令开启它

docker swarm init

Node

Node 示意的是 Swarm 集群中的一个节点,是一个大的调度单元,由集群管理者对立治理,在 Swarm 集群中咱们能够执行以下命令查看节点信息

docker node ls

Manager

Swarm 集群的管理者角色,一个集群中至多有一个 manager 它负责集群资源分配、任务调度,它也能够被本人获取其余 manager 调度,一个节点被退出集群的时候咱们能够指定
它的身份,能够通过以下命令查看退出集群 manager 角色的命令 \

Worker

Swarm 集群中只能被调度的工作节点,worker 节点仅负责运行工作,能够通过以下命令查看退出集群 worker 角色的命令 \

Service

Service 服务是 Swarm 集群中的最小执行单元,它具备资源限度、弹性伸缩、滚动降级和简略会滚的能力,咱们的利用均以 service 定义并运行在集群中

Config

config 配置管理,用于定义存储咱们的配置,例如利用启动须要的配置,能够应用以下命令创立咱们的配置

echo "application.name=demo" | docker application.properties -

Secret

secret 密钥治理,思考到配置平安,一些明感信息咱们能够抉择密钥存储,相似于 config 的应用形式

echo "123456" | docker mysql.password -

docker-compose

理解的 swarm 集群的基本概念,上面咱们将学习如何应用 docker-compose 语法来编写咱们的利用。这里仅做学习应用,redis、mysql 等存储监控组件均已单机版运行。

version: "3.2" #compose 版本号
services:
  redis: #服务名称
    image: redis #镜像地址
    logging: # 日志设置
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"
    command: --requirepass 123456 # 服务启动时执行的命令
    deploy:
      mode: global #指定服务模式为集群惟一
      placement:
        constraints: [node.labels.node == manager] #指定运行节点为 manager
  nacos:
    image: nacos/nacos-server
    depends_on: #指定服务启动程序,nacos 依赖 mysql
      - mysql 
    environment: #环境变量
      - MODE=standalone
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos_config
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=123456
    deploy:
      mode: global
      placement:
        constraints: [node.labels.node == manager]
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"
    ports:
      - "8848:8848"
  sentinel:
    image: registry.cn-hangzhou.aliyuncs.com/yaochengzhu/sentinel
    deploy:
      mode: global
      placement:
        constraints: [node.labels.node == manager] 
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"
    ports:
      - "8858:8858"
  mysql:
    image: registry.cn-hangzhou.aliyuncs.com/yaochengzhu/mysql:2021-04-10
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    volumes:
      - mysql:/var/lib/mysql
    command:
      --default-time_zone='+8:00'
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
    deploy:
      mode: global
      placement:
        constraints: [node.labels.node == manager]
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"
  order-center:
    image: registry.cn-hangzhou.aliyuncs.com/yaochengzhu/order-center:2020-12-04-18-09-19
    restart: always
    depends_on:
      - mysql
      - nacos
      - redis
    deploy:
      replicas: 2 #运行实例数量
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"
    environment:
      - SERVER_PORT=80
      - MYSQL_SERVER=jdbc:mysql://mysql:3306/order_center?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
      - MYSQL_USER_NAME=root
      - MYSQL_ROOT_PASSWORD=123456
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - REDIS_PASSWORD=123456
      - NACOS_SERVER=nacos:8848
      - LOG_LEVEL=INFO
    healthcheck: #监控查看
      test: ["CMD","curl","-f", "http://127.0.0.1/doc.html"] #查看命令
      interval: 5s #查看周期
      timeout: 5s #单次查看超时工夫
      retries: 100 #最大查看次数
  user-center:
    image: registry.cn-hangzhou.aliyuncs.com/yaochengzhu/user-center:2020-12-04-18-09-19
    restart: always
    environment:
      - SERVER_PORT=80
      - MYSQL_SERVER=jdbc:mysql://mysql:3306/user_center?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
      - MYSQL_USER_NAME=root
      - MYSQL_ROOT_PASSWORD=123456
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - REDIS_PASSWORD=123456
      - NACOS_SERVER=nacos:8848
      - LOG_LEVEL=INFO
    depends_on:
      - mysql
      - nacos
      - redis
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"
    healthcheck:
      test: ["CMD","curl","-f", "http://127.0.0.1/doc.html"]
      interval: 5s
      timeout: 5s
      retries: 100
  api-gateway:
    image: registry.cn-hangzhou.aliyuncs.com/yaochengzhu/api-gateway:2020-12-04-18-09-19
    restart: always
    environment:
      - SERVER_PORT=80
      - USER_CENTER_SERVER=lb://user-center
      - ORDER_CENTER_SERVER=lb://order-center
      - NACOS_SERVER=nacos:8848
      - SENTINEL_SERVER=sentinel:8858
      - LOG_LEVEL=INFO
    depends_on:
      - user-center
      - order-center
      - nacos
      - sentinel
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"
    healthcheck:
      test: ["CMD","curl","-f", "http://127.0.0.1/doc.html"]
      interval: 5s
      timeout: 5s
      retries: 100
  nginx:
    image: registry.cn-hangzhou.aliyuncs.com/yaochengzhu/nginx:api-gateway
    restart: always
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - api-gateway
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"
    healthcheck:
      test: ["CMD","curl","-f", "http://127.0.0.1/doc.html"]
      interval: 5s
      timeout: 5s
      retries: 100
volumes: #创立数据卷
  mysql:

将上述文件保留为 docker-compose.yaml 在文件所在目录执行 docker-compose up 即可启动服务。但在理论应用中,咱们可能会有多个环境,为了更加便于管理
咱们通常应用 docker stack 来隔离咱们的服务。

docker stack deploy --compose-file=demo-compose.yaml demo #在 demo 环境运行咱们的服务

查看咱们的服务 \

Portainer 可视化治理

通过后面对 swarm 集群的理解当前,咱们须要更加不便的治理集群,这里我为大家举荐 portainer 容器管理工具,尔后咱们所有的操作基本上都会在 portainer 提供的 UI 界面上实现。

装置 portainer

在 swarm 集群中装置

version: '3.2'
services:
  agent:
    image: portainer/agent:2.11.1
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - agent_network
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer-ce:2.11.1
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    ports:
      - "9443:9443"
      - "9000:9000"
      - "8000:8000"
    volumes:
      - portainer_data:/data
    networks:
      - agent_network
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]

networks:
  agent_network:
    driver: overlay #跨主机网络
    attachable: true
volumes:
  portainer_data:

执行装置命令

docker stack deploy --compose-file=portainer.yaml portainer_demo

期待装置胜利当前,浏览器 ip:9000 拜访 portainer 初始化界面并设置明码 \

登录进去当前呢就是这样子 \

针对罕用的几个性能我标注了一下,大家有趣味能够深刻理解下。\

咱们看下后面运行的 demo 成果 \

增加域名解析拜访接口地址 \

总结

到这里置信大家对 docker swarm 有了肯定的理解,绝对于 k8s 集群 swarm 显得瘦小了许多,swarm 集群适宜企业规模不大、利用不是很简单的场景。
阿里云在 2019 年 12 月 31 日下线了 swarm 集群,从此 swarm 跌落云端,k8s 日渐火爆起来。咱们在抉择技术的时候不仅仅是须要思考技术自身的优越性
也须要思考适用性,毕竟最合适的才是最好的,兴许你能够试试 swarm + portainer 或者 swarm + rancher。

参考资料

[1] docker: https://www.docker.com/

[2] swarm: https://docs.docker.com/engin…

[3] portainer: https://www.portainer.io/

更多精彩请关注咱们的公众号「百瓶技术」,有不定期福利呦!

退出移动版