文档章节

十一条 Docker 守则

逆蝶_Snow
 逆蝶_Snow
发布于 2017/12/04 20:36
字数 1522
阅读 485
收藏 39
点赞 0
评论 0

很多人最终还是决定使用 Docker 解决问题。 Docker 的优点很多,比如:

  • 一体化——将操作系统、库版本、配置文件、应用程序等全部�打包装在容器里。�从而保证 QA 所测试的镜像 (image) 会携带同样的行为到达生产环境。
  • 轻量——内存占用极小,只为主要过程分配内存。
  • 快读——一键启动,就像启动常见的 linux 过程一样快。

尽管如此,众多用户仍然只是把容器当做常见的虚拟机,而忘记了容器的一个重要特性:

用后即弃

正因为这一特点,一些用户需要改变他们对容器的观念,为了更好的使用与发挥 Docker 容器的价值,有一些事情是绝对不应该做的: 1) Don’t store data in containers – A container can be stopped, destroyed, or replaced. An application version 1.0 running in container should be easily replaced by the version 1.1 without any impact or loss of data. For that reason, if you need to store data, do it in a volume. In this case, you should also take care if two containers write data on the same volume as it could cause corruption. Make sure your applications are designed to write to a shared data store.

  1. 不要在�容器(container)中存储数据 容器可能会被中断、被替换或遭到破坏。在容器中运行的 1.0 版应用程序很容易就会被 1.1 版取代,而不会对数据造成影响或导致数据丢失。因此,如果需要存储数据,请存储在卷 (volume) 中。在这一情况下,还应注意两个容器是否会在同一个卷上写入数据,这将导致损坏。请确保应用程序适用于写入共享的数据存储。

  2. 不要分两部分传送应用程序 有些人把容器当作虚拟机,所以他们大多会认为,应该将应用程序部署到现有正在运行的容器中。在需要不断部署和调试的开发阶段,可能确实如此;但对于 QA 和生产的持续交付 (CD) 渠道,应用程序应当是镜像的一部分。切记:容器转瞬即逝。

  3. 不要创建大尺寸镜像 大尺寸的镜像难以分配。请确保仅使用必需文件和库来运行应用程序。不要安装不必要的数据包,也不要运行“更新”(yum update),这些操作会把大量文件下载到新的镜像层。

  4. 不要使用单层镜像 为了有效利用多层文件系统,请始终为操作系统创建属于自己的基本镜像层,然后为用户名定义创建一个层,为运行时安装创建一个层,为配置创建一个层,最后再为应用程序创建一个层。这样,重新创建、管理和分配镜像就会容易些。

  5. 不要从正在运行的容器中创建镜像 换句话说,不要使用"docker commit"命令来创建镜像。这一镜像创建方法不可复制,因此应完全避免使用。请始终使用 Dockerfile 或其他任何可完全复制的 S21(从源代码到镜像)方法,如此一来,如果存储在源代码控制存储库 (GIT) 中,就可以跟踪 Dockerfile 的变更情况。

  6. 不要只使用“最新版”标签 最新版标签就像 Maven 用户的“快照”(SNAPSHOT) 一样。容器具有多层文件系统这一基本特征,所以我们鼓励使用标签。相信谁也不愿意在构建了几个月的镜像后,突然发现应用程序因为父层(即 Dockerfile 中的 FROM)被新版本取代而无法运行(新版本无法向后兼容或从构建缓存中检索的“最新“版有误)这样的意外吧?在生产过程中部署容器时也应避免使用”最新版“标签,这是因为无法跟踪当前运行的镜像版本。

  7. 不要在单个容器中运行一个以上进程 容器只运行一个�进程(HTTP 守护进程、应用程序服务器、数据库)时效果最佳,但如果运行一个以上进程,在管理和检索日志以及单独更新进程时就会遇到很多麻烦。

  8. 不要在镜像中存储�证书及使用环境变量。 不要在镜像中对任何用户名/密码进行硬编码操作。请使用环境变量从容器外部检索信息。Postgres 镜像就是这一原理的极佳诠释。

  9. 不要以 root 权限运行进程 “默认情况下,Docker 容器以 root 用户权限运行。(……)随着 Docker 技术日趋成熟,能够使用的安全默认选项越来越多。目前,要求 root 对其他用户来说较为危险,另外,不是所有环境都能够使用 root。镜像应使用 USER 指令来为容器的运行指定非 root 用户。”(摘自《Docker 镜像作者指南》(Guidance for Docker Image Authors))

  10. 不要依赖 IP 地址 每个容器都有自己的内部 IP 地址,如果启动然后停止容器,内部 IP 地址可能会发生变化。如果你的应用程序或微服务需要和另一个容器进行通信,请使用环境变量在容器之间传递相应的主机名和端口。

  11. 监控容器 Docker 监控已经越来越受到开发者们的重视,实时监控 Docker 的方法,这里推荐 Cloudinsight。 不同于一些需要自写脚本的监控手段,Cloudinsight 作为一家免费的 SaaS 服务,能够一键监控 Docker,�且拥有很棒的可视化界面。除此之外,Cloudinsight 还支持多种操作系统、数据库等的监控,能够�一体化展示�所有被监控的系统基础组件的性能数据。


遵守这十一条,你就是 Docker 高手了! 不是的话,�去找原作者,科科。
本文翻译改变自 Rafael Benevides 的文章 10 things to avoid in docker containers

© 著作权归作者所有

共有 人打赏支持
逆蝶_Snow
粉丝 4
博文 80
码字总数 128703
作品 0
深圳
前端工程师

暂无相关文章

Linux中的端口大全

1 被LANA定义的端口 端口 名称 描述 1 tcpmux TCP 端口服务多路复用 5 rje 远程作业入口 7 echo Echo 服务 9 discard 用于连接测试的空服务 11 systat 用于列举连接了的端口的系统状态 13 d...

寰宇01 ⋅ 14分钟前 ⋅ 0

Confluence 6 如何备份存储文件和页面信息

备份的 ZIP 文件包含有 entities.xml,这个 XML 文件包含有 Confluence 的所有页面内容和存储附件的目录。 备份 Zip 文件结构 页面的附件是存储在附件存储目录中的,通过页面和附件 ID 进行识...

honeymose ⋅ 17分钟前 ⋅ 0

【每天一个JQuery特效】根据状态确定是否滑入或滑出被选元素

主要效果: 本文主要采用slideToggle()方法实现以一行代码同时实现以展开或收缩的方式显示或隐藏被选元素。 主要代码如下: <!DOCTYPE html><html><head><meta charset="UTF-8">...

Rhymo-Wu ⋅ 20分钟前 ⋅ 0

度量.net framework 迁移到.net core的工作量

把现有的.net framework程序迁移到.net core上,是一个非常复杂的工作,特别是一些API在两个平台上还不能同时支持。两个类库的差异性,通过人工很难识别全。好在微软的工程师们考虑到了我们顾...

李朝强 ⋅ 26分钟前 ⋅ 0

请不要在“微服务”的狂热中迷失自我!

微服务在过去几年一直是一个非常热门的话题(附录1)。何为“微服务的疯狂”,举个例子: 众所周知,Netflix在DevOps上的表现非常棒。Netfix可以做微服务。因此:如果我做微服务,我也将非常...

harries ⋅ 27分钟前 ⋅ 0

oAuth2 升级Spring Cloud Finchley.RELEASE踩坑分享

背景 6.19号,spring团队发布了期待已久的 Spring Cloud Finchley.RELEASE 版本。 重要变化: 基于Spring Boot 2.0.X 不兼容 Spring Boot 1.5.X 期间踩过几个坑,分享出来给大伙,主要是关于...

冷冷gg ⋅ 57分钟前 ⋅ 0

OSChina 周一乱弹 —— 理发师小姐姐的魔法

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @冰冰棒- :分享田馥甄的单曲《My Love》 《My Love》- 田馥甄 手机党少年们想听歌,请使劲儿戳(这里) @Li-Wang :哎,头发又长了。。。又要...

小小编辑 ⋅ 今天 ⋅ 8

Kafka1.0.X_消费者API详解2

偏移量由消费者管理 kafka Consumer Api还提供了自己存储offset的功能,将offset和data做到原子性,可以让消费具有Exactly Once 的语义,比kafka默认的At-least Once更强大 消费者从指定分区...

特拉仔 ⋅ 今天 ⋅ 0

NEO智能合约之发布和升级(二)

接NEO智能合约之发布和升级(一),我们接下来说说智能合约的升级功能。 一 准备工作 合约的升级需要在合约内预先设置好升级接口,以方便在升级时调用。接下来我们对NEO智能合约之发布和升级...

红烧飞鱼 ⋅ 今天 ⋅ 0

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部