写点什么

Shopify 的 Docker 使用经验

  • 2014-12-01
  • 本文字数:1255 字

    阅读完需:约 4 分钟

Shopify 是一个电子商务平台,提供专业的网上店面。目前的客户超过 12 万,包括 GE、特斯拉汽车、GitHub 等。作为首家市值超过 10 亿美元的加拿大网络公司,Shopify 在欧美市场的影响力也与日俱增。Shopify 是一个大型的 Ruby on Rails 应用,其产品服务器能通过给 1700 个处理核心和 6TB RAM 分配任务来完成每秒处理 8000 多个请求。Shpify 为了更加便捷、跨平台跨版本地进行分包任务,采用了时下炙手可热的 Docker 封装技术。近日,Shopify 在其博客上分享了自己的 Docker 技术使用经验

关于封装格式的选择,Docker 提供很多封装格式,从轻量级的单进程容器到重量级的富应用容器,一应俱全。Shopify 的开发者选择“纤薄”路径的容器,并隔绝外部影响,目的就是为了减少 CPU 和内存的负担。不过虽然运行纤薄容器,但还有一个初始化进程 (PID=1) 使得监测工具、保密管理和服务能够紧密集成。除了初始化进程,还添加了一个在每个容器内占用 PID=2 并且简单启动应用进程(PID=3)的 ppidshim。有该 ppidshim,应用程序不会直接从 (i.e. ppid != 1) 继承。除此以外还提供了健康检查,以保证其正常运行。

有一个要特别注意的一点,Shopify 称之为“容器的 100 定律”。在选择将何种服务放入容器中时,假设一台主机中运行 100 个小容器,评估是需要运行一个给定服务 100 次,还是共享一台主机的服务更好。用于最佳效率的选择,这个评判标准在实际中很有用处。100 定律的使用需要一定的灵活性。一些情况下,仅仅需要写一下组件的“黏合器”,也可以通过配置来达到目的。最终,你应该获得一个容器,内含你的应用程序运行所需的东西,以及一个提供了 Docker 托管和共享服务的主机环境。

关于 Debug,没有特别需要注意的,容器内运行应用在绝大多数情况下和他们未封装时行为相同,而且,大多数标准的 Debug 工具和技术在 Docker 主机上能正常运行。所以开发者只需照常调试。

命名方面。选取容器名称的时候,尽量描述其工作内容(例如:unicorn-1, resque-2),为了便于追溯,还要结合主机名(例如 unicorn-1.server2.shopify.com.)。在使用过程中,将 Docker 的主机名标签也传入容器中,方便问题的追踪。

注册和部署。使用 GitHub 的提交挂钩触发一个容器生成每一个主推,并提交状态,表明构建是否成功。使用 Git 的提交 SHA 来 Docker tag 容器,如此可以一目了然容器中的代码是什么版本。还把 SHA 放入 (/app/REVISION) 文件夹,容器内的文件夹更容易进行 debug 和脚本使用。一旦构建成功,希望把容器推到一个中央注册处。开发者选择运行自己数据中心的注册表以加速部署和尽量减少外部依赖。运行 Nginx 的反向代理,可以缓存 GET 请求背后的标准 Python 注册表的多个副本。大型网络接口(10Gbps)和反向代理能有效处理“惊群效应”。代理方式也使我们能够运行多个注册,并在注册中断时提供自动故障切换。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-12-01 00:564140
用户头像

发布了 268 篇内容, 共 138.2 次阅读, 收获喜欢 24 次。

关注

评论

发布
暂无评论
发现更多内容

网络攻防学习笔记 Day77

穿过生命散发芬芳

网络攻防 7月日更

微信朋友圈的高性能复杂度

张文龙

#架构实战营

白嫖一份小白到进阶网络安全学习宝典【建议收藏】

网络安全学海

面试 网络安全 信息安全 渗透测试 开发安全

如何写出富含知识的代码

escray

学习 极客时间 7月日更 如何落地业务建模

模块二作业

Mr.He

架构实战营

心理韧性:如何让自己从逆境中走出来

石云升

学习 心理学 7月日更

Spark SQL和DataFrames:与外部数据源进行交互(五)

Databri_AI

sql spark

设计一个秒杀系统

卢卡多多

秒杀 7月日更

模块二作业

Geek_35a345

Vue进阶(幺肆捌):Vuex辅助函数详解

No Silver Bullet

Vue vuex 7月日更

丢失api-ms-win-crt-runtimel1-1-0

好孩子

华为数据治理及数据分类管理实践

王知无

模块二作业

SAKIN

架构实战营模块二作业

袁小芬

架构实战营

在线XML转JSON工具

入门小站

Data Mesh,数据网格的道与术

王知无

科学主义 -- 个人进步的杀手

俞凡

认知

云计算的革命尚未开始

大可不加冰

云计算 Cloud 基础设施即代码 Cloud Native

【面试&个人成长】2021年过半,社招和校招的经验之谈

王知无

八位阿里大牛耗时三年总结出Java面试复盘手册!带你实现逆风翻盘

第五周作业 - 知识星球加入星球的流程图

小夏

产品经理训练营 邱岳

大数据与分布式

喵叔

7月日更

和12岁小同志搞创客开发:检测按键状态的两件法宝

不脱发的程序猿

DIY 中断 创客开发 按键检测

【LeetCode】连续子数组的最大和Java题解

Albert

算法 LeetCode 7月日更

一文入门 Go 的性能分析

Rayjun

pprof Go 语言

17道题你能秒我?我Hbase八股文反手就甩你一脸

王知无

Vue进阶(幺伍零):Vue key应用

No Silver Bullet

Vue 7月日更 key

微信朋友圈的高性能复杂度分析

架构0期-Bingo

Linux之/etc/group文件

入门小站

Linux

分享几个团队敏捷转型过程中的故事

Bruce Talk

Scrum 敏捷 Agile

架构实战营 - 模块二作业

李东旭

「架构实战营」

Shopify的Docker使用经验_语言 & 开发_张天雷_InfoQ精选文章