热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

在,生产,环境,中,使用,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在目前主要是针对开发和测试环境的,并不适合在大规模的生产环境中使用。
caveat01.png

caveat02.png

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

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

如果你的基础设施的整体设计没有保证每一种资源的可靠性和冗余性则不要使用容器。
你或许可以通过很多技术的运用重新提升可靠性,例如 使用共享存储、服务编排、监控以及带有自愈功能的框架如Swarm中的当有节点失败时进行容器重新调度 ;或者Kubernetes副本设置中的“The Reconciliation Loop”的概念。

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

#GIFEE 

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

神化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 作为一个变通方案。

镜像安全

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

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

让我们在三明治的上下文中思考容器技术。通过观察,你可以轻易的了解到三明治的基本信息例如里面夹的是番茄还是生菜还是火腿或者火鸡肉;或许里面有些你看不到的东西,但是你基本上可以了解大部分的内容。这就跟容器类似,你可以了解到的信息诸如操作系统是Fedora或者RedHat或者Ubuntu,是否有httpd,shell类型,systemd的使用等等,但是里面也可能有你意想不到的隐藏问题,例如/bin/sh或许被替换成了一个Python脚本,这就像是三明治里在生菜后面藏着橄榄一样。
镜像内容的安全问题出现在2014和2015年的很多新闻中。Docker一直努力的为解决这个问题添加必须的功能。 内容可寻址镜像 层用来验证镜像的签名内容,有镜像抓取验证功能的镜像源不再将镜像ID作为保密内容,Docker Hub的 Nautilus深度检视 保证官方公共镜像的安全漏洞被及时被修复,另外Docker引擎还包含了诸如用 户名字空间,Secomp和AppArmor配置 以及其它一些 安全相关 的功能。

可以参考 Docker docs the Docker Security Portal

Docker缺省配置

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

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

容器vs 虚机

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

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

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

发布&部署

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

caveat07.png

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

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

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

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

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

微软

caveat10.png

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

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

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

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

Hacker-News上的讨论

参考: Ignore the Hype

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

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

原文发布时间为:2016-04-17
本文作者:liguangcheng 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:在生产环境中使用Docker必须注意的事情

推荐阅读
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • Python 3 Scrapy 框架执行流程详解
    本文详细介绍了如何在 Python 3 环境下安装和使用 Scrapy 框架,包括常用命令和执行流程。Scrapy 是一个强大的 Web 抓取框架,适用于数据挖掘、监控和自动化测试等多种场景。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
author-avatar
冷向泽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有