Shopify的Docker实战经验(一)用Docker和CoreOS构建内部云

这是系列文章的第一篇,介绍我们如何借助容器让服务器更易于扩展和管理,从而跟上业务需求的步伐。

关键元素是:

  • Docker:容器技术,使应用更加便携和易于管理
  • CoreOS:提供最小化的操作系统,便于流程规划和Docker容器的运行

Shopify是一个大型的Ruby on Rails应用程序,这些年底层做过大规模的扩展。我们的生产服务器扩容到使用1700个核以及6 TB内存,能支持每秒超过8000次的请求。

Docker备受瞩目,因为其能够将应用打包进便携的容器,从而实现版本控制和快速部署。

容器听上去很像虚拟机(virtual machine,VM),它有独立的文件系统、网络环境等等。但是容器又比虚拟机更加轻量,能够更高效地利用硬件资源。Docker容器不是像VM一样去模拟物理硬件的行为,而是允许多个应用程序安全地共享Linux宿主机器,通过:

  • 内核命名空间使应用间相互隔离
  • cgroups限制资源的上限并实现计费
  • 多层文件系统减少容器的大小

Docker在开发和维护团队中迅速走红,主要是因为:

  • 快速启动:容器可以快速启动和运行,只需要几秒时间。如果需要,可以利用容器构建的时间做一些其他耗时的操作。快速启动意味着快速部署。
  • 超高利用率:容器最大限度地共享宿主机器(比如,单核机器),相比VM能更为有效地利用硬件资源。这意味着在同样的硬件配置上可以运行更多应用。
  • 一致性:容器确保每个实例启动时是完全一致。
  • 开发友好的工作流:容器由纯文本的Dockerfile构建,Dockerfile可以做版本控制从而帮助区分容器版本。另外,开发人员可以用很熟悉很像git的push/pull操作来发布容器。
  • 运维友好的工作流:容器包含操作系统,因此,如果你需要安装一个package或者自定义的配置,开发人员就可以完成这项工作,而不需要推给运维人员。这是工作职责的重要改变:开发人员负责容器,运维人员则可以关注于提供可靠的硬件和网络。

最重要的容器特性是可以实现一机多用。做不同工作的容器可以在相同的硬件系统上和平共处。这使得数据中心真正成为普遍意义上的计算资源。比如:

  • 可以很快很容易地增加应用服务器容器的数量,这意味着我们随时可以应对突然的流量尖峰。
  • 可以轻松地拿出生产服务器的闲置资源去进行所需资源密集型的操作,比如数据分析。

听上去不可抗拒吧?我们也有同感,而且我们已经准备来分享我们的经验,如何将这些愿景变为生产级别的现实。我们不仅仅高谈阔论,我们还会在社区里分享尽可能多的代码。

这里有很多内容可以讲,我们将分期介绍:

  • 容器化:如何以一种能让自以为是的开发团队满意的方式,将已有应用放到容器里?
  • 管理诀窍:真实的应用包括很多API秘钥和数据库密码,这些都需要安全得保存(最好是能版本控制,并能在Heartbleed这样的事件再次发生的时候迅速把它们找出来)。我们在这里有不错的解决方案。
  • 路由:怎样将容器连接到外部世界,并能和生产环境的基础架构(比如负载均衡器)完美合作?
  • 监控:我们的容器化架构需要达到或者超越Shopify的99.97%的在线时长。维护系统时需要花费大量的工作在问题变得严重之前发现并解决它。在容器化的世界里解决这个问题需要和纯物理机环境不同的解决方案。调整已有的监控系统来监控新环境是保证Shopify稳定性的重要环节。
  • 健壮性:优雅且可预见地抛错很难。我们在处理内存耗尽(out-of-memory),请求队列化和signal处理上的经验可以供大家参考。
  • 部署:我们的系统构建在Chef和Ubuntu之上,现在计划更新为纯物理机上的CoreOS。之后会介绍我们如何部署节点使其能够运行容器,并且在全是容器的世界里实现高效监控。

敬请关注今后各个话题上更深入的探讨。

时间: 2024-10-11 06:21:51

Shopify的Docker实战经验(一)用Docker和CoreOS构建内部云的相关文章

docker实战之Dockerfile(三层镜像的构建)

通过视频总结(http://edu.51cto.com/center/course/lesson/index?id=71317)Dockerfile 放在git上面,才叫自动化.创建docker镜像,首先得有父镜像,Dockerfile生成docker镜像,每执行一条语句,就会生成docker镜像的一层layer.一般有基础镜像,中间件镜像,最后生成应用镜像 本文基于centos系统的前提条件: 首先 ,从git.oschina网上下载好相应的源码进行练习.源码为搜索docker-trainin

Docker实战之Consul集群

前言 最近参加了几场 Java 面试,发现大多数的微服务实践还是 Eureka 偏多,鉴于笔者的单位选型 Consul,这里对 Consul 做简单总结. 该篇是 Docker 实战系列的第三篇.传送门: Docker 实战之 MySQL 主从复制 Docker 实战之 Redis-Cluster 集群 为什么选 Consul? 首先 Consul 有以下几个关键特性: 服务发现:支持服务发现.你可以通过 DNS 或 HTTP 的方式获取服务信息. 健康检查:支持健康检查.可以提供与给定服务相关

有容云:实战总结之 利用Docker、Docker Compose &Rancher构建持续部署

前言: 本文由John Patterson . Chris Lunsford写于2016年4月4日,译者有容云张向波,转载请注明出处.(原文链接见文末) 作者John Patterson和Chris Lunsford 运营了一家提供运营和基础架构服务的公司,本文是他们给大家分享的内容:关于如何通过使用Docker.Docker-Compose和Rancher来实现容器部署落地. 我们想跟你一起从头开始体验整个过程,特别是之间遇到的一些痛点和所做的决策.目前,已经有许多的资源和工具可以与Docke

docker 实战---安装一个基础镜像 (一)

泡了几天官网,对docker有了一点了解.准备着手搭建一个公司的开发测试环境,包括java.python. 环境介绍 首先说明一下我的环境 2台物理服务器(后面简称主机) 主机A的配置如下: [[email protected] ~]# lsb_release -a LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:p

Docker学习总结(1)——Docker实战之入门以及Dockerfile(一)

一.Docker是什么? 首先Docker是软件工业上的集装箱技术 回顾,在没有集装箱出现以前,传统运输行业中,会存在这些问题: 在运输过程中,货物损坏 装卸.运输货物,效率低下 运输手续繁多及运输环节多 劳动强度大,及船舶周转慢 在集装箱出现后,完全改变了这种状况,是由于集装箱: 规则标准化,大大减少了包装费用 大大提升了货物装卸效率.及运输效率 不同种运输工具之间转换更容易 所以,集装箱出现是传统行业中的一次重大变革 传统软件行业中存在的问题 软件更新发布低效 业务无法敏捷 环境一致性,难于

写一个 docker 实战一个系列手册

感谢大家的关注,分享也是给自己一个重新学习.整理和总结的机会.接下来一段时间准备出一个关于 docker 实战应用的一个系列,其中一些内容之前发布过,这次准备重新进行修正和整理. 下面是一个基本的目录: 创建一个带 ssh 服务的基础镜像(修订版) 创建一个带 apache 服务的镜像 创建一个带 nginx 服务的镜像 创建一个带 tomcat 服务的镜像 创建一个带 weblogic 服务的镜像 创建一个带 CMS系列( Wordpress, Drupal, Typo3) 的镜像 创建一个带

二、docker实战

一.dcoker的一般应用场景 1.简化配置,统一配置,通过镜像快速启动(Simplifying) 2.代码流水线管理,开发环境->测试环境->预生产环境->灰度发布->正式发布,docker在这里实现了快速迁移(Code Oioeline Management) 3.开发效率,对开发人员,有了镜像,直接启动容器即可(Developer Productivity) 4.应用隔离,相对于虚拟机的完全隔离会占用资源,docker会比较节约资源(Applsolation) 5.服务器整合

Marathon+Mesos+Docker实战

Marathon+Mesos+Docker实战 Apache Mesos概述 Apache Mesos是一款基于多资源调度的开源集群管理套件,使容错和分布式系统更加容易使用实现,采用Master/Slave结构简化设计,将Master尽可能轻量级,进保存了Mesos Slave的状态信息 常见集群管理工具 工具 特点 优势 Apache Mesos 需要独立部署mesos-slave进程:依赖framework的功能:可管理docker容器:成本较高 应为经过许多互联网公司的大规模实践,稳定性具

【实战】Docker入门实践二:Docker服务基本操作 和 测试Hello World

操作环境 操作系统:CentOS7.2 内存:1GB CPU:2核 Docker服务常用命令 docker服务操作命令如下 service docker start #启动服务 service docker stop  #停止服务 service docker restart #重启服务 service docker status   #查看服务状态 启动Docker服务 docker是一个CS模型,需要先启动服务端,直接执行 sudo service docker start 启动docker