观点 | 容器内应该运行什么?


【编者的话】本文通过从目前人们如何使用容器的角度出发,分析探讨了人们到底应该在容器中运行什么。

今晚,我的一个朋友问我对单VS多进程的容器怎么看。我很高兴他这样问。在容器界这是一个热门的话题,但我没有过多的回答过。直到上个月,我不知道对此事发展的意见是否有了充分的理解。

有关多进程最好的文章是http://phusion.github.io/baseimage-docker/。解释一下,当你在容器内运行单进程的软件其实它是运行在分裂的上下文上。


你刚刚建立了一个容器,它包含了最小的操作系统,而且只能运行你的应用程序。但容器内的操作系统配置不正确。一个合适的Unix系统应该运行各种重要的系统服务。你的这个容器没有运行它们而仅仅运行你的应用程序。
当我读到这,我最初的直觉反应是消极的。究其原因是哲学。我的容器不应该包含一个操作系统。我用容器来隔离一个服务与系统的其他进程服务,并确保它们不会白白地创建混乱。我的想法是,我的系统中已经有一个init进程、SSHD和syslogd在运行。我想:“如果我需要的cron运行在我的容器,那我已经完全被打乱了。”用一个容器来代替虚拟机的整个要点是不用专门地运行整个操作系统。我是按自己的使用情况来阅读这篇文章的。

但后来我完成了这篇文章,复查之后,我不得不重新审视自己。我意识到这个是错误的原因。事实上复杂得多。

以下是一些有关人们会在容器中运行哪些软件的调查:
  • 需要这些服务
  • 纯粹的开箱即用(OOTB),从未考虑为容器而设计(需要这些服务)
  • 定制容器
  • 可定制,但没有为容器而设计
  • 专门为了使用容器而编写
  • 没有这些依赖而设计的


这些是人们在容器内运行软件的整个范围。这样做并没有对与错,也并不是非黑即白。重要的是该软件是如何工作的,只要都能够支持它、了解其效率的权衡以及了解你创建的系统中故障模式(译注:重要的是知道如何debug)。

有了这点想法后我的整个态度改变了。那篇文章是伟大的,因为它向人们讲解了常见的Unix系统组件。也许有些人会感到沮丧,但大多数人并不了解这些工具以及它们是如何结合在一起的。他们的基本镜像做的相当不错。我用了几次,但我的使用情况需要我避免使用容量大的镜像。

如果您想了解我是如何使用Docker……

《Docker in Action》中,我试着用一些诸如Busybox的工具,因为我不希望人们不得不要等待着下载一整天。

在生产环境中,我构建并使用明确、稳固以及简约的容器。我开始使用短小的镜像并清理掉我不需要的东西。我终止了SUID二进制。清楚我的服务(非root)应该运行在哪个UID/GID上。知道我的容器在运行时需要什么样的能力并尽可能地限制他们。我使用volumes来代替stdout/stderr。有时我为了提交配置使用镜像与volumes。我选择资源限制。我使用init进程。我用的其他的容器服务做健康监测、服务登记以及日志转发。我一次性提交容器到负载均衡群集节点并调整连接volume的网络堆栈。我创建廉价的部署与DNS搜索域连接起来。

如果我需要使用shell,我会CSSH到集群节点中运行的目标容器内。我会拉取toolbox镜像来创造一个新的附有合适的volumes和网络接口的容器。有任何提升的权限时,我只运行短暂的容器。

如果你想在容器内运行一个完整的Linux操作系统,基本上你可以使用Docker来做到这一点。你也可以运行单个NASM程序并创建最小镜像。请记住,这些都是运行在已正确配置的系统上。在适当的时候使用该系统。

与其担心别人让你应该这样做,还不如专注于你需要拿它做什么。做好这一点。如果你需要迭代并添加一些功能也是可以的。

Docker带来了希望以及简化了一些Linux最难理解的工作。在你尝试相当多的docker run my/image命令的同时,如果你花时间研究这些选项,你可以收获更多。这样做,你会更深入的理解操作系统以及帮助您如何具体地使用它。

我提起这些因为在你以不同方式使用单一VS多进程的容器会有某些特性。例如,如果你充分利用Linux的功能授权,想要给你的wirelog录NET_RAW能力,你不会想让它作为面向公众的Web应用程序来运行在同一个容器中。另一个例子是,如果你使用的AppArmor,你不会想在Web应用程序和数据库中都使用相同的配置文件。但如果是在同一容器中,那么在该容器的配置文件也会应用该容器内的两个应用程序。更糟的是如果你使用SELinux,你很难使这两个应用程序具有相同标签。

我是个现实主义者。我知道有些人只是想要一个基本能工作的镜像至于其他的一概忘掉。老实说,我认为这很好。phusion/baseimage-docker就不错。只是有一点要记住一定要用非root用户来运行容器。

我已经在起草《Docker in Action》的第6章(译注:目前在MEAP已有电子版)。如果你想了解如何使用Docker来隔离软件,你应该阅读这一章节。它涵盖了用户管理、内存共享、设备访问、资源限制、Linux的功能授权而且还涉及到如AppArmor和SELinux等其他工具。别让主题吓到你。我尽我所能来融会贯通这些复杂的主题并加以“你所需要知道的”和“如何使用Docker”之类的方式呈现给您。
1-Ic2Ph98v7Qt6wChLQtmpEw.jpeg

原文链接:Opinion: What Should I Run in My Containers? (翻译:田浩浩 审校:魏小红)

===========================

译者介绍
田浩浩,USYD研究生,专注Docker学习研究 - <htia6761@uni.sydney.edu.au>。

1 个评论

感谢帅明分享

要回复文章请先登录注册