• Docker Swarm


    Docker Swarm提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。

    Swarm mode内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker原生的Swarm集群具备与Mesos、 Kubernetes 竞争的实力。

    基本概念

    Swarm 是使用SwarmKit构建的Docker引擎内置(原生)的集群管理和编排工具。

    节点

    运行Docker的主机可以主动初始化一个Swarm集群或者加入一个已存在的 Swarm 集群,这样这个运行Docker的主机就成为一个Swarm集群的节点 ( node ) 。节点分为管理节点和工作节点。

    • 管理节点用于Swarm集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行) 。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader ,leader通过raft协议实现。
    • 工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。可以通过配置让服务只运行在管理节点。

    任务

    任务(Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。

    服务

    服务 ( Services ) 是指一组任务的集合, 服务定义了任务的属性。服务有两种模式,两种模式通过 docker service create 的 --mode 参数指定。

    • replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
    • global services 每个工作节点上运行一个任务。

    服务和任务的关系如下图所示

    创建Swarm集群

    初始化集群

    使用docker swarm init命令。如果Docker主机有多个网卡,拥有多个IP,必须使用--advertise-addr指定IP。执行docker swarm init命令的节点自动成为管理节点。

    1. $ docker swarm init --advertise-addr 192.168.222.128
    2. Swarm initialized: current node (ni1omlgyo0vw1h8e93e124srk) is now a manager.
    3. To add a worker to this swarm, run the following command:
    4. docker swarm join    \
    5. --token SWMTKN-1-47jtzmzdyej3ey59gsgckk54gbt0cqe28gjvh9gg4j6uweccst-eugtpcgbm34370ljz1bvre6jy  \
    6. 192.168.222.128:2377
    7. To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

    增加工作节点

    使用docker swarm join命令加入到集群中。使用docker node ls查看集群。

    1. # 加入集群
    2. $ docker swarm join    \
    3. --token SWMTKN-1-2dqppg075l4xoozwsp8hts1v1ro750fhiawa28y8u9fpo0t0tf-74c7t1eglegf0h1z7jr6g6rjj    \
    4. 192.168.222.128:2377
    5. # 查看集群
    6. $ docker node ls
    7. # 将worker节点提升为manager节点,在manager节点执行如下命令:
    8. docker node promote 节点名称|节点ID
    9. # 将manager节点降低为worker节点,在manager节点执行如下命令:
    10. docker node demote 节点名称|节点ID
    11. # 在要脱离集群的节点上使用以下命令, 主动离开集群,让节点处于down状态,才能删除
    12. docker swarm leave
    13. # 节点脱离集群后,才能删除节点,删除节点使用如下命令
    14. docker node rm 节点名称|节点ID
    15. # 强制删除集群
    16. $ docker swarm leave --force

    部署服务

    使用docker service命令来管理Swarm集群中的服务,该命令只能在管理节点运行。

    1. # 创建服务
    2. docker service create --replicas 3 -p 3306:3306 --name db -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=sql_test    \
    3. -e MYSQL_USER=myuser -e MYSQL_PASSWORD=userpassword mysql            
    4. # 查看服务
    5. docker service ls            查看当前Swarm集群运行的服务
    6. docker service ps db       查看容器状态
    7. docker service logs db     查看服务日志
    8. docker service inspect nginx    查看服务的详细信息
    9. # 删除服务
    10. docker service rm db
    11. # 更新服务
    12. docker service update --image nginx:alpine nginx
    13. # 减少服务实例(这比直接删除服务要好)
    14. docker service scale nginx=0
    15. # 增加服务实例
    16. docker service scale nginx=5

    使用docker stack命令在集群中部署多个服务,docker stack文件内容和docker compose文件类似。

    • 其中image关键字是服务对象中唯一的必填项,docker stack和docker compose的区别是docker stack不支持构建,所有的镜像必须提前构建完成。
    • 在Docker Swarm中,虽然 --link 功能已被弃用,但可以通过使用服务发现机制来模拟 link 效果。给不同的服务指定相同的Overlay网络,就可以通过服务名实现互相访问。服务发现机制是自动的,无需手动配置。它使用DNS来解析容器名称,并在整个Overlay网络中实现容器之间的连接。例如下面的例子中,在bms服务中就可以通过bookmanage_db连接数据库。
    1. # 部署服务命令
    2. docker stack deploy -c docker-compose.yml boomanage
    3. # 删除服务命令
    4. docker stack rm boomanage
    5. # 查看容器状态
    6. docker stack ps boomanage

    yml文件内容如下:

    1. version: "3"
    2. services:
    3.   db:
    4.     image: mysql
    5.     networks:
    6.       - overlay
    7.     ports:
    8.       - "3306:3306"
    9.     environment:
    10.       MYSQL_ROOT_PASSWORD: password
    11.       MYSQL_DATABASE: sql_test
    12.       MYSQL_USER: myuser
    13.       MYSQL_PASSWORD: userpassword
    14.     volumes:
    15.       - /home/gowork/src/composebms/db/data:/var/lib/mysql
    16.     deploy:
    17.       placement:
    18.         constraints: [node.role == manager]
    19.   bms:
    20.     image: ubuntu:bms
    21.     command: bookmanger
    22.     networks:
    23.       - overlay
    24.     ports:
    25.       - "8999:8999"
    26.     deploy:
    27.       mode: replicated
    28.       replicas: 3
    29.  
    30. networks:
    31.   overlay:

  • 相关阅读:
    LVS+keepalived高可用集群
    15——go语言中的流程控制
    小米手机抓取hci log
    vscode 创建 运行c++ 项目
    Linux——ansible剧本
    整数和字符串比较的坑
    11月20日,每日信息差
    二十一、Java 继承
    logback--基础--03--配置--logger
    使用Docker安装MySQL5.7.36
  • 原文地址:https://blog.csdn.net/UFOfuck/article/details/132766531