V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hansonwang99
V2EX  ›  程序员

Docker Swarm 的前世今生

  •  
  •   hansonwang99 ·
    hansonwang99 · 2018-06-19 07:08:19 +08:00 · 2543 次点击
    这是一个创建于 2374 天前的主题,其中的信息可能已经有所发展或是发生改变。

    心静只需一杯茗


    概述

    在我的《 Docker Swarm 集群初探》一文中,我们实际体验了 Docker Swarm 容器集群技术的魅力,与《 Kubernetes 实践录》一文中提到的 Kubernetes 集群技术相比,Docker Swarm 没有 Kubernetes 显得那么厚重,因此可以认为是更加轻量级的容器集群技术,这也就意味着上手更加方便快捷,使用起来也要省事很多。作为 Docker 集群技术三(或“四”)架马车之一的 Docker Swarm,它从一开始便是 Docker 官方的“亲儿子”,发展到现在也经历了很多阶段和迭代。作者在学习的过程中也了解了一点其发展历史,发现有几个概念还是挺容易混淆的,因此撰写成文,是梳理,也是总结。



    初出茅庐之:经典 Swarm

    早在 2014 年底,Docker 公司就设计了容器集群的方案组合:Machine + Swarm + Compose。其中 Machine 主要用于快速创建 Docker 运行环境,其支持在创建出来的节点上自动部署 Swarm,此时的 Swarm 我们称为 “经典 Swarm ”,它是一款整合跨节点网络的集群式容器服务,其利用 Docker 守护进程的 API,将多节点的计算资源进行汇总,并提供兼容 Docker 的运行 API,使用者只需要在执行 Docker 命令工具时,用--host 参数将目标设置为 Swarm 服务的 IP 和端口,即可操作整个容器集群。

    当然此时的 Swarm 局限性较大,比如:

    • 没有副本和负载均衡的概念,这导致服务无法高可用
    • 当然也更不存在什么服务网络管理和跨节点数据存储这些东西
    • 没有服务模型:集群中服务间关系和启动顺序编排也很复杂

    于是就有了下面的 SwarmKit 的诞生。



    发展壮大之:SwarmKit

    在 2016 年 2 月,Docker 公司开始了一个名叫 SwarmKit 的项目。而恰在 Docker 1.12 RC 之前的一段时间,Docker 发布了 Swarmkit,这是一个独立的、开源的容器编排项目。SwarmKit 不同于一开始的经典 Swarm,它从一开始就重新设计了一套独立的 API 和模型体系,并且采用独立的客户端命令行工具:swarmctl

    和上面的经典 Swarm 模型相比,它加入了如下特性:

    • 重新设计的一套独立的 API 和模型体系
    • 使用了自己的 CLI (swarmd命令负责管理,swarmctl命令用于控制)
    • 节点管理、服务模型更加自然,提供编排和调度服务
    • 将过去 Swarm 依赖的外部集群一致性存储组件 Etcd 的核心部分内置化

    然而此时的 SwarmKit 并没有提供诸如服务发现、负载均衡和路由等功能。尽管如此,SwarmKit 其实已经是我们今天广泛使用的 Docker Swarm 集群技术的基石。



    厚积薄发之:Swarm Mode

    Swarm Mode 则更进一步,它在 Docker 1.12 版本开始为大家所周知,一个 docker swarm命令 红遍大江南北,这个所谓的 Swarm Mode 其实就是我们今天所广泛使用的 Docker Swarm 集群技术。

    然而 Swarm Mode 并不是一个全新的东西,也并不是一个全新的模式,而是站在 SwarmKit 的巨人肩膀上发展起来的,是 Docker 中的一组与集群相关功能的统称而已。Docker 将 SwarmKit 的核心模块内嵌于 Docker 的后台服务之中,通过不同的命令允许使用者同时以“本节点”和“本集群”这两种视角来操作整个集群,增加了集群的管理、节点的管理、服务的管理和编排等等一系列高级特性,就像在我的《 Docker Swarm 集群初探》一文中体验的那样。

    因此总结一下 Swarm Mode 就是:

    • 基于 Swarmkit 编写
    • 支持服务模型以及服务发现、路由和负载均衡等新功能
    • 使用 Docker 原生态的 CLI 命令
    • 集成到了 Docker engine 中(强大的 docker swarm 命令)


    对比总结

    如果用一张图来表示 Docker、经典 Swarm、SwarmKit、Swarm Mode 四个概念之间的关系,则大致可以如下图所示:

    四者之间的关系

    正如图中所示,SwarmKit 和 Swarm Mode 重叠的部分表示的是相应的项目之间存在代码层面的互相引用或组件形式的依赖,其实 Swarm Mode 所创建的集群本质上并无异于 SwarmKit 集群。

    更细致一点,我们从 SwarmKit 和 Swarm Mode 二者在一些常用命令操作上的比较来看看二者的区别和联系:

    1. 创建集群

    • SwarmKit 方式:swarmd
    • SwarmMode 方式:docker swarm init

    2. 往集群中添加节点

    • SwarmKit 方式:swarmd --hostname worknode --join-addr [IP:端口] --join-token [Token]
    • SwarmMode 方式:docker swarm join --token [token] [IP:端口]

    3. 查看集群节点信息

    • SwarmKit 方式:swarmctl node ls
    • SwarmMode 方式:docker node ls

    4. 创建服务

    • SwarmKit 方式:swarmctl service create --name [服务名] --image [镜像名]
    • SwarmMode 方式:docker service create --name [服务名] [镜像名]

    5. 服务扩容

    • SwarmKit 方式:swarmctl service update [服务名] --replicas [副本数目]
    • SwarmMode 方式:docker service scale [服务名]=[副本数目]

    6. 服务(镜像)升级

    • SwarmKit 方式:swarmctl service update [服务名] --image [镜像名]
    • SwarmMode 方式:docker service update [服务名] --image [镜像名]

    从命令行操作来看,Swarm Mode 其实非常类似于 SwarmKit,然而前者更加靠近 Docker 原生态圈的命令,因此更加人性化。



    后记

    如果有兴趣,也可以抽点时间看看作者一些关于容器化、微服务化方面的文章:



    6 条回复    2018-06-19 09:44:37 +08:00
    artandlol
        1
    artandlol  
       2018-06-19 07:20:51 +08:00 via iPhone
    还是多研究研究 k8s 比较实在
    sdrzlyz
        2
    sdrzlyz  
       2018-06-19 08:36:46 +08:00 via Android
    。。。不是已经凉了?自己玩玩尚可,生产没人用啊
    letv
        3
    letv  
       2018-06-19 08:50:40 +08:00 via Android
    桌子上是两个 21:9 的显示器?
    broadliyn
        4
    broadliyn  
       2018-06-19 09:11:20 +08:00
    表带不错。。。lz 是基佬。。。。。?:doge。。
    mritd
        5
    mritd  
       2018-06-19 09:16:06 +08:00 via iPhone
    然而我选择了 k8s
    hansonwang99
        6
    hansonwang99  
    OP
       2018-06-19 09:44:37 +08:00 via iPhone
    mark
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   996 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:15 · PVG 05:15 · LAX 13:15 · JFK 16:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.