一、Docker Swarm上的容器选择

并非所有服务都应该部署在Swarm集群内。数据库以及其他有状态服务就不适合部署在Swarm集群内。

理论上,你可以通过使用labels将容器部署到特定节点上,但是这样的话,Swarm集群外的节点就很难访问它们了(Docker 1.12没有很好的方法,但是1.13之后可以使用attachable network)。

如果你允许集群外的节点访问数据库,则所有节点都可以访问它,这显然不符合你的需求。

另外,Docker Swarm的跨节点数据卷(cross-host mounted volumes)并不可靠,一个简单的文件上传都可能引起问题。

无状态的容器就非常适合部署在Swarm集群中,它们可以由环境变量进行配置(使用ENV指令)。建议为开源工具构建镜像,例如,可以将Nginx的配置文件放到Docker镜像中。

在Swarm集群中的服务:

  • Django channels (网页应用)
  • Nginx(代理)
  • Celery(周期性任务)
  • Sensu(监控)

在Swarm集群之外的容器:

  • Mysql(数据库)
  • Redis(缓存)

由于一个获取真正IP的问题,我很可能会将Nginx运行在Swarm集群之外,或者采用host模式。

二、设置资源限制

就经验而言,可以为所有服务设置CPU使用限制。当某一个容器应用占用掉所有主机资源时,此限制可以避免这种情况发生。

当想把所有容器均匀地发布在所有主机上或是想确保有足够的资源来响应操作时,需使用Reserve-cpu这个参数。

例如:

# 限制服务占用的CPU资源
docker service update
--limit-cpu 0.25
--reserve-cpu 0.1
webapp

三、将半无状态的服务变得完全无状态

所谓半无状态服务,就是容器需要依赖一些不太重要的外部文件。你可以使用数据卷(volume),但是更好的选择是使用S3或者其他云存储服务。

记住,想要获得扩展性,云是最好的选择。

例如,我不得不构建Nginx镜像,将配置文件放到镜像中。使用数据卷挂载Nginx配置文件不是很方便。

四、创建可附加的网络

network是一个非常重要的特性。你最好使用它,否则docker run创建的容器将无法接入Swarm集群的网络,特别是跨宿主机通讯时。

这是Docker 1.13之后的版本才有的功能,也许你需要升级。

创建network的命令如下:

docker network create --driver=overlay --attachable core

五、增加环境变量

如果创建Docker镜像的时候,遵循了最佳实践原则(https://rock-it.pl/how-to-wri...),允许在运行的时候通过环境变量设置一切配置项,那么把应用迁到Swarm的过程完全没有问题。

相关命令:

# 创建服务时指定环境变量
docker service create \
--env VAR=VALUE \
--env-file FILENAME \
...

# 增加、删除环境变量
docker service update \
--env-add VAR=NEW_VALUE \
--env-rm VAR \
..

六、设置适当实例和批量更新

保持适当数量的实例,以应对高流量和实例或者节点不可用的情况。同时太多的实例数也会占用CPU和内存,并且导致争抢CUP资源。

update-parallelism的默认值是1,默认只有一个实例在运行。但这个更新速度太慢了,建议是 replicas / 2。

相关命令:

# 将同时更新的容器数设为10
docker service update \
--update-parallelism 10 \
webapp # 同时增加多个服务的容器数
docker service scale redis=1 nginx=4 webapp=20 # 查看服务状态
docker service ls # 查看服务的详情(排除关闭的容器)
docker service ps webapp | grep -v "Shutdown"

七、把Swarm配置保存为代码

最好使用Docker Compose v3版本的语法(https://docs.docker.com/compo...)。

他允许使用代码指定几乎所有的服务选项。作者在开发的时候使用 Docker-compose.yml,在生产环境(swarm)配置使用 Docker-compose.prod.yml . 部署Docker-compose文件中所描述的服务,需要Docker stack deploy 命令(属于新版本 Stack命令集合中的一部分[https://docs.docker.com/engin...

Docker compose v3例子:

version: '3'
services:
webapp:
image: registry.example.com/webapp
networks:
- ingress
deploy:
replicas: ${WEBAPP_REPLICAS}
mode: replicated
restart_policy:
condition: on-failure proxy:
image: registry.example.com/webapp-nginx-proxy
networks:
- ingress
ports:
- 80:80
- 443:443
deploy:
replicas: ${NGINX_REPLICAS}
mode: replicated
restart_policy:
condition: on-failure networks:
ingress:
external: true

部署的例子(创建或者更新服务):

export NGINX_REPLICAS=2 WEBAPP_REPLICAS=5

docker login registry.example.com
docker stack deploy \
-c docker-compose.prod.yml\
--with-registry-auth \
frontend

提示:Docker-compose文件支持环境变量 (${VARIABLE}), 所以,可以动态调整配置作为测试等。

八、配置日志收集服务

使用分布式系统时,集中管理日志是非常必要的。我们有很多方案,包括开源工具或者SaaS服务,比如ELK,Grafana, Graylog…自己搭建完整的系统是非常复杂的,所以我建议搭建先使用SaaS服务(比如LogglyLogentries),当费用太高时,则自己搭建一个系统。ELK可以这样配置:

docker service update \
--log-driver gelf \
--log-opt gelf-address=udp://monitoring.example.com:12201 \
--log-opt tag=example-tag \
example-service

参考:https://www.cnblogs.com/fundebug/p/6823897.html

Docker Swarm(十一)生产环境使用的一些建议的更多相关文章

  1. Docker Swarm 集群环境搭建及弹性服务部署

    上一篇文章<Docker Swarm 集群管理利器核心概念扫盲>中我们把 Swarm 重要的概念性知识给大家讲解了一波,理论完事就该实战了,这篇文章带大家从零开始,搭建 Docker Sw ...

  2. 建设Kubernetes生产环境的16条建议

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! Kubernetes是用于构建高度可扩展系统的强大工具. ...

  3. 生产环境下,不建议用早期版本的Mono........

    一个BUG修复需要4年!!!!!!!!!!!!!也是醉了....不造被微软收购后的Xamarin会不会好起来

  4. Docker Swarm 集群管理利器核心概念扫盲

    Swarm 简介 Docker Swarm 是 Docker 官方推出的容器集群管理工具,基于 Go 语言实现.代码开源在:https://github.com/docker/swarm 使用它可以将 ...

  5. 生产环境中使用Docker Swarm的一些建议

    译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...

  6. Docker Swarm(一)集群部署

    一.机器环境 机器规划 172.16.0.89 swarm的manager节点 manager-node 172.16.0.90 swarm的node节点 node1 机器版本(均是:CentOS L ...

  7. Docker Swarm 创建服务

    Docker Swarm 创建服务 环境: 系统:Centos 7.4 x64 应用版本:Docker 18.09.0 管理节点:192.168.1.79 工作节点:192.168.1.78 工作节点 ...

  8. Docker Swarm 服务版本更新与回滚

    Docker Swarm 服务版本更新 环境: 系统:Centos 7.4 x64 应用版本:Docker 18.09.0 管理节点:192.168.1.79 工作节点:192.168.1.78 工作 ...

  9. 云计算之路-阿里云上-2017年最错误的选择: 生产环境使用 docker swarm

    2017年12月29日 10:18 ~ 11:00 左右,由于整个 docker swarm 集群宕机,造成我们迁移至 .net core 跑在 docker swram 上的所有站点无法正常访问,由 ...

随机推荐

  1. [Fundamental of Power Electronics]-PART I-4.开关实现-4.3 开关损耗/4.4 小结

    4.3 开关损耗/4.4 小结 使用半导体器件实现开关后,我们现在可以讨论变换器中损耗和低效的另一个主要来源:开关损耗.如前所述,半导体器件的导通和关断转换需要几十纳秒到几微秒的时间.在这些开关转换期 ...

  2. 201871030135-姚辉 实验二 个人项目—《D{0-1} KP》项目报告

    项目 内容 课程班级博客链接 课程班级博客链接 这个作业要求链接 这个作业要求链接 我的课程学习目标 (1)掌握软件项目个人开发流程.(2)掌握Github发布软件项目的操作方法. 这个作业在哪些方面 ...

  3. OO_Unit4暨学期总结

    OO_Unit4暨学期总结 一.本单元架构设计 1.1 第13次作业架构设计 就我个人而言,这次作业应该是本单元难度最大的一次作业,原因在于陡然转向UML后,对UML各个元素的关系理解需要先下一番功夫 ...

  4. SqlServer存储过程应用二:分页查询数据并动态拼接where条件

    前言 开发中查询功能是贯穿全文的,我们来盘一盘使用存储过程分页查询,并且支持动态拼接where条件. 划重点:支持动态拼接where条件 对存储过程的使用有疑问的同学去[SqlServer存储过程的创 ...

  5. python基础(补充):lambda匿名函数,用了的,都说好!

    lambda函数又叫做"匿名函数".当你完成一件小工作时,直接使用该函数可以让你的工作得心应手. lambda函数介绍 在Python中,定义函数使用的是def关键字,但是通过la ...

  6. Github Pages+Gridea搭建个人博客

    1 概述 Github Pages可以用来托管个人网站,静态的,便于用来实现博客,可以在一个仓库的settings中开启: Gridea是一个静态博客写作客户端,所有文件都在本地,没有数据库,实现简单 ...

  7. Spring Cloud Alibaba(4)---Nacos(注册中心)

    Nacos(注册中心) 有关Spring Cloud Alibaba之前写过三篇文章. Spring Cloud Alibaba(1)---入门篇 Spring Cloud Alibaba(2)--- ...

  8. IDEA中Maven的配置

    Maven安装 下载Maven 官网:https://maven.apache.org/ 下载完成后,解压即可: 配置环境变量 在本机电脑的系统环境变量中 配置如下配置: 路径:此电脑-->高级 ...

  9. rabbitmq五种模式详解(含实现代码)

    一.五种模式详解 1.简单模式(Queue模式) 当生产端发送消息到交换机,交换机根据消息属性发送到队列,消费者监听绑定队列实现消息的接收和消费逻辑编写.简单模式下,强调的一个队列queue只被一个消 ...

  10. VsCode调试vue项目

    VsCode调试vue项目 VsCode如何调试vue项目,VsCode需要安装插件以及配置launch.json文件. 找到"扩展"或者按快捷键"Ctrl+Shift+ ...