在生产环境中使用Docker必须注意的事情

本文讲的是在生产环境中使用Docker必须注意的事情,【编者的话】本文以最近非常火的希特勒怒喷Docker的视频为线索,详细分析了Docker存在的一些问题和弱点,以及在生产环境中使用Docker所要注意的方面。这些问题包括隔离性、镜像安全、Docker缺省配置、发布及部署;文章的最后分析了微软最近在容器支持方面的动作。

我们不能否认Linux容器是一个非常强大的概念,它组合了众多优秀的Linux内核功能和Docker开源工具,任何背景知识的开发者都很容易使用。

在2016年容器峰会上,Bryan Cantrill深入的比较了容器技术造成的业界以及大众接受的问题与对新的用户可能出现的问题(链接中是大约48分钟的专题讨论)。

问题诸如:由于对新技术背后的支撑功能的理解不够深入而造成的技术不当使用以及使人不愉快的意外。

昨天,Avishai Ish-Shalom做了一个恶搞视频指出了在还没有准备好的情况下使用Docker带来的挫折、意外和震惊。

非常搞笑的视频,希特勒使用Docker:https://t.co/cmXB2Clj8D (译者注:该视频的中文版本在http://v.qq.com/page/n/u/a/n0193j4ylua.html)。

在这篇博文中,我们希望看一下其中的每一个陈述并解构它们,以更深入的理解是什么使得这个视频如此精巧,而同时也可以作为任何一个希望在生产环境中使用Docker的单位和个人的有益参考。

隔离性

视频以一个非常流行的CI/CD场景开始,使用Docker的公有镜像源、Docker Hub及其多容器管理工具Docker-Compose。应该指出的是,Docker的官方文档明确说明了Docker-Compose在目前主要是针对开发和测试环境的,并不适合在大规模的生产环境中使用。

这强调了共享内核带来的第一个问题:降低了可靠性与冗余。

我们相信,这一段的启示应该是:

如果你的基础设施的整体设计没有保证每一种资源的可靠性和冗余性则不要使用容器。

你或许可以通过很多技术的运用重新提升可靠性,例如使用共享存储、服务编排、监控以及带有自愈功能的框架如Swarm中的当有节点失败时进行容器重新调度;或者Kubernetes副本设置中的“The Reconciliation Loop”的概念。

但是这个视频中也犀利的指出了上面的技术运用方面的问题:

#GIFEE 

之后,视频指出了另外一个关于实施容器运行时隔离的问题:

神化Docker的想法的幻灭。

Jérôme Petazzoni在他的DockerCon EU 2015上的演讲包含了更多的细节,cgroups完整的涵盖了Linux容器对于资源管理的基本需求。对于视频里关于fork炸弹的吐槽,Docker 1.11包含了一个修改,详情见这个视频的作者和Docker的维护者@jfrazelle之间的一段Twitter会话:

@frazelledazzell @francesc @nixcraft @m1keil nproc cgroup的支持只会在1.11.0中https://t.co/lCKjdNmx5Y
— Avishai Ish-Shalom (@nukemberg) April 11, 2016

在云环境中另一个值得注意的问题是熵的消耗(译者注:entropy depletion https://en.wikipedia.org/wiki/ ... %2529),这在共享内核的场景中是非常有意义的,可以参考HAVEGED作为一个变通方案。

镜像安全

这个视频中强调的第二个问题是针对从公共镜像源中抓取的容器镜像的不当信任。

博文Sandwich Analogy深入的解释了为什么使用Docker Hub上的非官方公共镜像应该是使人担心的。

让我们在三明治的上下文中思考容器技术。通过观察,你可以轻易的了解到三明治的基本信息例如里面夹的是番茄还是生菜还是火腿或者火鸡肉;或许里面有些你看不到的东西,但是你基本上可以了解大部分的内容。这就跟容器类似,你可以了解到的信息诸如操作系统是Fedora或者RedHat或者Ubuntu,是否有httpd,shell类型,systemd的使用等等,但是里面也可能有你意想不到的隐藏问题,例如/bin/sh或许被替换成了一个Python脚本,这就像是三明治里在生菜后面藏着橄榄一样。

镜像内容的安全问题出现在2014和2015年的很多新闻中。Docker一直努力的为解决这个问题添加必须的功能。内容可寻址镜像层用来验证镜像的签名内容,有镜像抓取验证功能的镜像源不再将镜像ID作为保密内容,Docker Hub的Nautilus深度检视保证官方公共镜像的安全漏洞被及时被修复,另外Docker引擎还包含了诸如用户名字空间,Secomp和AppArmor配置以及其它一些安全相关的功能。

可以参考Docker docsthe Docker Security Portal

Docker缺省配置

正如博文Docker Internals强调的那样,如果你的Linux内核版本大于2.6.x,你需要关闭Docker守护进程上的userland-proxy以支持Hairpin NAT。

通常来说,需要仔细研究Docker的缺省值在你的环境和使用案例中是否是一种优化的配置。例如Docker文档中覆盖了如何选择COW文件系统的所有内容。

容器vs 虚机

容易在“应用打包”的场景中提供了比虚机更多的优势,容器可以更快的构造,更容易分享,也可以更快的启动和停止。

不幸的是,在Windows和OSX中,要使用Linux容器需要在虚拟化环境中运行Linux内核,如果这个问题没有被充分的理解则可能带来的问题和挫折。

Docker也正在通过Docker客户端来改善这个问题(在写这篇文章的时候这个新的Docker客户端版本还在Beta阶段)。新的Docker客户端所使用的解决方法是通过更为紧密的与宿主机操作系统整合来简化开发人员在非Linux操作系统上的体验。

发布&部署

Docker工具箱不仅使得容器技术更流行,也包含了关键的发布功能组件使得容器成为更流行的代码打包和部署方式。容器镜像使用已有的打包和部署工具解决了很多实际的问题。

然而,容器技术被大众接受的方式与虚拟机的使用方式并没有什么区别,镜像经常包含了整个Linux系统和大量非必须的二进制程序。这不但使得镜像文件变大进而使得部署变慢,也使得在生产环境中使用时增大了被攻击的可能性。

幸运的是社区已经接受了slim应用容器的概念,通过使用最小化的Linux发行版例如Alpine – 现在所有的Docker官方镜像都使用Alpine,Alpine包含了静态编译的仅依赖于其所编译的内核的二进制程序。

程序的可扩展性依然需要你自己去关注,需要去探索适合容器的用户场景。

容器Pods的概念鼓励将程序分解成更小、更专注、相互协作的模块。容器提供的隔离性足够允许通过可重用的模块提供比单个的容器更可靠,更可扩展和更快的服务。我们相信这些概念需要一种针对如何构建云环境中的应用的思考方式的变化。请参考容器编排模式

即使对于那些传统的不是那么“CloudNative”的应用,容器也提供了强大的部署模式例如Joyent倡导的自动驾驶模式

微软

微软前段时间承诺在Windows Server 2016中支持Windows容器的Docker API。在向Docker社区贡献代码使得Docke客户端工具可以在Windows工作之后,微软在Windows内核中实现了文件系统和容器基础功能,甚至开源了Dot Net核心CLR 。

微软似乎扩展了Astoria项目(一个Andriod模拟器)成为一个令人印象深刻的模拟Linux的Windows子系统(WSL),微软上周宣布了WSL使得整个业界感到震惊。

目前在Windows中集成的Linux内核API的目标是大部分的Linux系统调用,可以使得Windows对软件开发者来说成为一个更有吸引力的平台(仅对目前)。

将最近发生的一些事件通过一个如此精彩的方式来展现,我们向这个视频的创造者致敬!

Hacker-News上的讨论

参考:Ignore the Hype

原文链接:Docker Caveats(翻译:李光成)

========================================================
译者介绍
李光成,IBM中国研究院资深研究员,研究方向是云计算基础设施及技术。目前在做的是Docker资源隔离方面的研究项目。

原文发布时间为:2016-04-17

本文作者:liguangcheng 

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:在生产环境中使用Docker必须注意的事情

时间: 2024-11-11 03:13:18

在生产环境中使用Docker必须注意的事情的相关文章

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

本文讲的是生产环境中使用Docker Swarm的一些建议[编者的话]实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes,Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它们之中,Swarm是Docker原生的,同时也是最简单,最易学,最节省资源的,至少值得我们多了解一下.本文将介绍一些非常实用的建议. [深圳站|3天烧脑式Kubernetes训练营]培训内容包括:Kubernetes概述.架构.日志和监控,部

三个生产环境中使用Docker的案例

本文讲的是三个生产环境中使用Docker的案例[编者的话]本文为2017年初Docker线下见面会的记录,Solita.Zalando和Pipedrive公司做了Docker化经验分享,并对生产环境中使用Docker的细节进行讨论.本文还推荐了一些Docker生产环境中常使用的优秀工具. [3 天烧脑式 Docker 训练营 | 上海站]随着Docker技术被越来越多的人所认可,其应用的范围也越来越广泛.本次培训我们理论结合实践,从Docker应该场景.持续部署与交付.如何提升测试效率.存储.网

生产环境中Docker的持久化存储模式

本文讲的是生产环境中Docker的持久化存储模式[编者的话]在生产环境中使用Docker实现持久化存储一直是业界的热点问题,本文从到配置文件.机密材料.数据库.共享数据等方面做了些探讨,文中也谈到了一些需要避免的问题以及尽量将应用设计为无状态服务的原则. 一般看法认为容器对于无状态的应用程序是很好的,但是不适合有持久化数据的有状态应用.如果这是真的,这并不是因为技术不到位,而是因为管理持久化数据和有状态应用程序的模式并不总是为人们所熟知.你面临的挑战很多不是关于持久化状态的,而是如此操作不会影响

在生产环境中使用Apache Mesos和Docker

本文讲的是在生产环境中使用Apache Mesos和Docker,[编者的话]本文翻译自 IVO VERBERK博客,Docker容器软件已受到了从科技巨头到企业的广泛注意.但是,随着容器概念转变成为现实世界中的成熟技术,那么问题就变成了:怎么样才能快速把Docker应用于生产环境中呢? 介绍 在生产环境中安全有效地的运行Docker容器会有很多复杂的挑战.许多复杂性挑战都是在跨多主机间运行容器产生的.这些跨主机的容器可能需要保持或共享状态,也可能需要相互通信,还可能会随时消失.为了高容错性和可

生产环境中的容器之工作流

本文讲的是生产环境中的容器之工作流,[编者的话]很多公司已经在生产环境里大规模使用容器.前一篇文章里介绍了Spotify,DramaFever,Built.io和IIIEPE如何以及为什么使用容器.本文继续深入讨论这几个公司的工作流. 构建应用程序以及管理pull请求 在生产环境使用容器的一大吸引人之处是创建无缝的开发到生产环境的能力,最先代码在开发人员的笔记本上,然后能够整体移动到测试环境,并且随后直接部署,而不会因为底层基础架构环境的改动而导致问题. IIIEPE怎么做 Luis Elizo

IFTTT在开发环境中使用Docker的经验

本文讲的是IFTTT在开发环境中使用Docker的经验,[编者的话]IFTTT是"if this then that"的缩写,事实上是让你的网络行为能够引发连锁反应.让你使用更为方便,其宗旨是"Put the internet to work for you"(让互联网为你服务).Docker在IFTTT中也在开发实践,以下是Nicholas Silva的一些介绍. IFTTT是一款新兴的互联网工具型应用,正如他们给自己的介绍"If This Then T

IT生产环境中容器编排系统的五个最佳做法

本文讲的是IT生产环境中容器编排系统的五个最佳做法[编者的话]本文主要讲述了生产环境中使用容器编排系统需要注意的5个最佳做法. [深入浅出学习 etcd]etcd为分布式系统提供可靠.高效的配置管理服务,在Docker.Kubernetes.Mesos等平台中扮演了越来越重要的角色.作为2013年开始的项目,它还很年轻,官方文档中缺乏实现上全面.系统的介绍,本课程深入浅出地介绍了etcd的实现,并为运维和二次开发提供了系统的指导和建议. 如果您的企业IT运维组织结构已转移到Docker等容器技术

使用IBM性能分析工具解决生产环境中的性能问题

序言 企业级应用系统软件通常有着对并发数和响应时间的要求,这就要求大量的用户能在高响应时间内完成业务操作.这两个性能指标往往决定着一个应用系统软件能否成功上线,而这也决定了一个项目最终能否验收成功,能否得到客户认同,能否继续在一个行业发展壮大下去.由此可见性能对于一个应用系统的重要性,当然这似乎也成了软件行业的不可言说的痛 -- 绝大多数的应用系统在上线之前,项目组成员都要经历一个脱胎换骨的过程. 生产环境的建立包含众多方面,如存储规划.操作系统参数调整.数据库调优.应用系统调优等等.这几方面互

在生产环境中使用 NODEJS 一年记

本文讲的是在生产环境中使用 NODEJS 一年记, 本文是「我为什么弃 Python 从 Node.js」一文的续集.一年多前,我因为对 Python 的挫败,还想解释为什么转而尝试 Node ,故写下那篇文章. 一年后,公司内部的 CLI(命令行) 工具,客户项目以及我司产品的更新,这些都是我学到的.不仅仅是 Node,基本上对 JavaScript 也学到不少. 易学难精 Node 学起来很容易,尤其是对有 JavaScript 的基础的人.谷歌搜索一些入门教程,折腾一会儿 Express,