关于 Docker Swarm,你可能需要了解更多实践经验

2017-05-04 18:25:48 +08:00
 dataman

数人云今天带来的本篇文章将分享 Docker 在应用程序生命周期每个阶段中所扮演的角色,以及迁移到 Swarm 集群时需要考虑的问题。

利用 Docker 来开发

Docker 让工作更轻松。如需要一个部署安装 MySQL 数据库,或者安装 Ghost,又或者 Redis 数据库,PostgreSQL,Ruby 等。实际上这些都已经被 Docker 化容器化和镜像化。

只需要一条命令即可运行:

docker run name_of_programe_you_need

下载(镜像)—使用完—丢掉,没有其他程序搞乱本地开发环境。

扩展现有的容器十分简单,只要拥有足够的 Docker 基础知识,就能判定从网上下载的 Docker 镜像是否是有用的镜像。

Docker 是开发人员的利器,添加到开发环境中好处无需多言。

若熟悉 Docker,  会经常使用 Docker-compose 一条命令来启动整个开发环境栈。

例如,很常见的 Docker-compose 文件是这样:

version: '2'  
services:  
  web:
    build: .
    command: npm run dev
    ports: 
      - 8080:80

  redis:
    image: redis

  database:
    image: postgres

然后运行:

docker-compose up # --build if you want to rebuild

PostgreSQL 访问地址:postgresql://database

Redis 访问地址: http://redis

这是一种极为简便的方法,整个开发环境栈用几行代码描述( development stack as a code ),并且内置版本控制功能。下面来讲下生产环境。

生产环境要求

生产环境非同一般。这里例举中等负载量的服务器要求——

Docker 作为一个准生产的解决方案,实际上被非常多的人低估了。约一年前,PvP Center ( https://beta.pvpc.eu/)过程中,因 Docker 文件系统问题,也经历了一些失败(目前,我使用 Overlay2 文件系统,问题不复存在),现在回头想一下,这是很好的决定。

生产部署是使用原始 Docker 命令还是 Docker-compose

若遇到这个问题,配置好 Ansible 自动下载新版本的应用,然后自动部署到容器即可( Ansible 配置文件: https://rock-it.pl/managing-multiple-environments-with-ansible-best-practices )。 接下来查看列表——

但以上的做法也会产生问题:

1、不能满足一些非常规要求(在要求部署应用的时候服务器零宕机) 因为要维护后端动态的负载均衡节点,不能轻易的扩容到多台服务器上。

2、需要极聪明的手段和方法才能整合 持续集成 /持续部署系统( CI/CD )。

3、如果分别存放特定应用程序,满足部署依赖在不同的架构仓库内 。当配置文件发生变化时,回滚变得非常困难。

坚持了这种做法一段时间,没有任何问题,但是总感觉缺失了什么东西,因为快速部署以及配置文件需要太多修改,Ansible 部署也刺激到了我(太慢了)。但是,真正促使往 Docker Swarm 迁移的决定性原因是——扩容到一台服务器以的特性。虽然可以使用相同的方式部署应用到云端,使用外部负载均衡器,但动态添加或者减少负载均衡节点依旧是痛点。把特定应用的配置文件从 Ansible 中移除,转而把这些配置文件发到应用仓库中。

Docker Swarm

Docker Swarm 设计的目的是方便地使用 Docker 命令来管理多台服务器之间的容器调度,是相当前沿的新功能新特性(从 Docker 1.12 版本开始)。

其中的一个 Master 节点是 Leader, 如果当前 Leader 宕机不可用,其他健康的 Master 中的一台会自动成为 Leader。如果 Worker 节点宕机不可用,宕机节点上的容器实例会被重新调度到其他健康的 Worker 节点上。

在什么时候才应该考虑使用 Docker Swarm

在考虑使用 Docker Swarm 前,先过一遍下面 5 个问题——

生产环境使用 Docker Swarm 经验

截止目前,应用跑在 Swarm 上面已经有六个月的时间,从 Docker-compose 迁移到 Swarm 花去一周的时间(包括学习如何迁移等)。需要调整配置文件,以便让应用容器完全是无状态的,使用外部集中式日志和指标收集。高峰时,共运行了 35 个节点。对集群的管理十分方便。

例如:

docker service scale name_of_service=30 or docker service update --env-add SECRET_ENV=youdontneedtoknowit name_of_service

截屏如下:

1.png 部署流程如下图:

在 Deploy 区域内,使用最新 Docker-compose v3 版的语法和 Docker stack deploy 命令。把发布应用容器的配置文件存储为 VCS 这项工作变得前所未有的简单。无需要手工修改任何配置,轻松地部署应用容器到 Swarm 集群。

配置文件例子:

version: '3' 
services: 
  web:
    image: registry.gitlab.com/example/example  # you need to use external image
    command: npm run prod
    ports:
      - 80:80
    deploy:
      replicas: 6
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

整个部署命令只有一行:docker stack deploy application . 当然,这里使用了 Gitlab.com 的流程,结果如下图所示:

可以在 Web 界面上进行回滚操作,甚至在手机上执行回滚操作。

结语

以上都是个人对 Docker Swarm 的观点。之前考虑过使用其他选项,但如果想让应用容器化,进而伸缩扩容到多台服务器上,目前这种方法是最好的选择。

原文作者:Jakub Skałecki 原文链接: https://rock-it.pl/my-experience-with-docker-swarm-when-you-need-it/

欢迎关注数人云微信公众号,如有后续文章,我们会在第一时间进行跟进

3865 次点击
所在节点    推广
1 条回复
YzSama
2017-05-05 00:25:03 +08:00
mark 一下。明天再看。。😏😏

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/359148

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX