写点什么

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:564114
用户头像

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

关注

评论

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

c++ 读取数据库文件后将数据缓存到内存中

linux大本营

c++ stl C++ STL

架构设计通用原则

阿泽🧸

架构设计 三周年连更

iOS MachineLearning 系列(7)—— 图片相似度分析

珲少

如何使用 Gmail Smart Compose 更快地撰写电子邮件

外贸IT程序客

谷歌 youtube

ChatGPT 错误代码 1020:这是什么以及如何解决?

外贸IT程序客

ChatGPT 人工智能ChatGPT 吗? ChatGPT4

c++ 读取数据库文件后将数据缓存到内存中直到服务重启

linux大本营

c++ map stl C++ STL

nginx入门教程

linux大本营

nginx

怎样在 Gmail 中设置电子邮件自动提醒

外贸IT程序客

谷歌收录 youtube

C语言 unsigned long long 计算当前纳秒数时是否会越界

linux大本营

C'语言

SOS大规模敏捷开发实施全流程项目管理(Scrum of Scrums)

顿顿顿

Scrum 敏捷开发 项目管理工具 敏捷开发管理工具 研发管理软件

码住!Java架构师人手一份的RabbitMQ笔记

小小怪下士

Java 程序员 RabbitMQ 消息中间件

极客星球|数据分析引擎黑马ClickHouse技术研究与实践

MobTech袤博科技

K8s入门教程:10分钟带你速览全程

加入高科技仿生人

低代码 #k8s 容器化部署

posix协议挂载约束

linux大本营

posix

如何使用等待队列

linux大本营

队列

ChatGPT 不适合您吗?这是您可以尝试修复它的方法

外贸IT程序客

OpenAPI ChatGPT 人工智能ChatGPT 吗? ChatGPT4

ChatGPT 可以写你的论文,但你应该使用它吗?

外贸IT程序客

ChatGPT 人工智能ChatGPT 吗? ChatGPT4

c++ 使用Glog 按照功能模块划分日志文件。同时,日志文件中也存有各个对应的等级,如 debug、info等日志等级

linux大本营

c++ 日志 glog

c++11 实现内存缓存机制

linux大本营

内存管理 智能指针 C++11

如何将 Outlook 邮件自动转发到 Gmail

外贸IT程序客

谷歌 youtube

使用C++实现一个微积分的应用案例

linux大本营

c++

软件测试/测试开发丨面试题之计算机网络和数据库篇

测试人

软件测试 面试题 自动化测试 测试开发

怎样在 Gmail 中创建规则来过滤您的电子邮件

外贸IT程序客

谷歌 youtube

怎样在 Gmail 中查找、添加、编辑和删除联系人

外贸IT程序客

谷歌 youtube

如何更改 Gmail 主题–只需4步完成

外贸IT程序客

谷歌 youtube

急急急!Kafka Topic 资源权限紧张怎么办?

Zilliz

Zilliz mivlus kafkatopic

模型服务,支持渲染多张输出图片|ModelWhale 版本更新

ModelWhale

云计算 数据标注 数学模型 在线编程 数据门户

c++ 推荐几个线上观测的库

linux大本营

c++

C++存储改造,如何将Oracle语句改成使用MySQL语句

linux大本营

c++ MySQL 数据库 oracle

C++查询数据库后写入Qtableview中配合Qstandaritemmodel

linux大本营

c++ 数据库

如何按发件人、大小、日期和未读对 Gmail 中的电子邮件进行排序

外贸IT程序客

谷歌收录 youtube

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