微容器:更小的,更轻便的Docker容器

本文讲的是微容器:更小的,更轻便的Docker容器,【编者的话】本文介绍了微容器的概念和好处,并用一些例子介绍了如何构建微镜像,从scratch到Alpine Linux,并推荐了一些已有的基础微镜像,方便为几乎所有主流语言的应用构建微镜像。本文也指出了构建微镜像的基本原理:将构建时依赖和运行时依赖分开,构建时所用的镜像包含所有构建所用的工具,它可以比较大,但运行时的基础镜像应该仅包含运行时依赖。使用微容器,no going back!

Docker 使你能把你的应用和应用的依赖打包到一个良好的自包含镜像中。然后你可以用该那个镜像来在容器中运行你的应用。问题是,你通常也打包了一些你可能不需要比你需要的更多的东西,最终座椅最重你得到了一个巨大的镜像和巨大的容器。大多数开始使用Docker的人会使用Docker的官方仓库作为他们的语言的选择,但是不幸的是,如果你使用官方镜像,你会得到一个巨大的镜像,而本来你可以得到一个小镜像的。你并不需要和这些官方镜像中一起的许多复杂的东西。例如,如果你使用官方的Node镜像构建一个你的应用的Node的镜像,它至少有643MB大,因为这是官方Node镜像的大小

我构建了一个简单的Hello World Node 应用,在官方Node镜像上构建,它的大小是644MB。

这太大了!我的应用加上依赖也不超过1MB,Node.js的运行时大概20MB,那是什么占据了剩下的620MB?我们应该能做得更好。

什么是微容器?

一个微容器仅包含OS库和运行应用所需要的语言依赖以及应用本身。其他都不需要。

与其包含所有,不如仅包含最基本的,在需要的时候添加依赖。

以上面的Node应用为例,使用一个小的基础镜像,然后安装核心的部分,即Node.js和它的依赖,它只有29MB,小了22倍(见下图)!

如果你想,现在试试运行这两个镜像,docker run –rm -p 8080:8080 treeder/tiny-node:fat 然后 docker run –rm -p 8080:8080 treeder/tiny-node:latest。完全一样的应用,而大小大不相同。

为什么微容器很棒?

有许多使用微容器的好处:

  • 大小 —— 微容器很小。像上面展示的,没有改变任何代码,镜像大小减少了22倍。
  • 快速/简单的发布 —— 因为镜像非常小,可以更快地从 Docker registry(例如 Docker Hub)下载镜像,因而可以更快地发布到不同的机器。
  • 提高安全性 —— 更少的代码和程序在容器中意味着更小的攻击面。基础OS就更安全(详见下文)。

这些好处和Unikernels的好处类似,没有任何缺点。

如何构建微容器

所有Docker镜像的基础镜像是scratch镜像。它本质上什么都没有。听起来它好像没什么无用,但是你可以用它创建你的应用的最小可能镜像,如果你把你的应用编译为一个没有依赖的静态二进制文件,像Go或C那样。例如,我的treeder/static-go 镜像 包含了一个Go的Web应用,则整个镜像(包括我的应用)是5MB。

这是关于如何得到尽可能小的镜像:scratch镜像+你的应用的二进制文件。

然而并不是所有人都是用Go,所以你可能有更多的依赖,并且你需要比scratch镜像要多一些的东西。关于Alpine Linux,我不会枯燥地告诉你关于它的细节,但是他们的广告语说出了全部:“Alpine Linux是一个面向安全的,轻量的Linux发行版,基于musl libc和busybox。” 你可以在这里得到详细说明,但是我们这篇文章最关心的是“轻量”的部分。基础的Alpine镜像只有5MB。

现在我们有一个非常好的OS作为一个基础镜像,它有一个很好的包管理系统来添加我们的依赖。对于我们的简单的Node应用而言,我们只需要Node自己,所以我们可以只添加Node包。我们的Dockerfile看起来像这样:

FROM alpine
RUN apk update && apk upgrade
RUN apk add nodejs

简单而整洁。现在我们只在镜像中有Node和Node的依赖。
现在为了添加我们的代码到镜像中,只需要在我们的Dockerfile中添加几行:

FROM alpine
RUN apk update && apk upgrade
RUN apk add nodejs
WORKDIR /app
ADD . /app
ENTRYPOINT [ "node", "server.js" ]

你可以获得示例代码并且在这里查看完整的构建指导。

同样的规则适用于所有其他的语言。

适用于所有语言的基础镜像

幸运的是,我们已经构建了一个适用所有主要语言的基础镜像,你可以在这里找到它们:https://github.com/iron-io/dockers

它们有一些优化来使它们尽可能的小,并且我们会定期更新,使用基础镜像使得它们比起你自己来更好。通过使用Iron.io的基础镜像,上面Node应用的Dockerfile变成这样:

FROM iron/node
WORKDIR /app
ADD . /app
ENTRYPOINT [ "node", "server.js" ]

另外,对于每一种其他语言,我们构建了两个版本的这种镜像,一个用于构建,另一个用于运行。用于构建的镜像有所有的构建工具在其中,所以可能比运行时要更大。

例如,为了构建Node的依赖,你要像这样使用iron/node:dev

docker run --rm -v "$PWD":/app -w /app iron/node:dev npm install

然后在你的Dockerfile中使用iron/node然后运行它:

docker run --rm -it -p 8080:8080 -v "$PWD":/app -w /app iron/node node server.js

上述方法同样适用于其他语言,但是你需要使用它们自己的build/vendor/run的指令。

如果你想要一个语言的不同版本,你可以改变tag,例如你可以使用iron/node:4.1或者iron/node:0.12。你可以在Docker Hub上找到每个语言的所有的版本tag。例如Node的tag在这里:https://hub.docker.com/r/iron/node/tags/。你可以在iron-io/dockers的项目里找到所有其他Docker Hub tags的链接。

如何为所有的语言构建和打包

这可能没那么幸运了,但是我们有一些例子可以让大多数主流语言使用上面的基础镜像:https://github.com/iron-io/dockerworker

你可以看看那个项目中的每个语言的README,它会指引你如何构建你的依赖,测试你的代码,构建一个小的Docker镜像和测试镜像。

没有回头

读完本文之后,你应该可以为你的应用创建只包含运行应用所需要的东西的Docker镜像。容器本质是一个镜像的实例,所以一旦你开始用你的镜像来运行容器,你就进入了微容器的世界。没有(理由)回头。

刚使用了你的“小镜像”技术在我的一个golang项目上,很棒!感谢这篇伟大的文章。竟然令人震惊地减小到5mb。 —— Harlow Ward @ Clearbit

原文链接:Microcontainers – Tiny, Portable Docker Containers (翻译:陈光 审校:高婧雅)

原文发布时间为:2016-02-20

本文作者:Casgy 

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

原文标题:微容器:更小的,更轻便的Docker容器

时间: 2024-11-20 13:31:57

微容器:更小的,更轻便的Docker容器的相关文章

如何优化Flash动画使文件更小播放更流畅

Flash作为网页制作与动画创作的专业软件,操作简便,功能强大,现已成为交互式矢量图形和Web动画事实上的标准. 但是,如果制作的Flash电影文件较大,动辄几百k的话,常常会让网上浏览者在不断等待中失去耐心.对Flash电影进行优化就显得很有必要了,但前提是我们不能有损电影的播放质量. 1.多使用符号(Symbol).如果电影中的元素有使用一次以上者,则应考虑将其转换为符号.重复使用符号并不会使电影文件明显增大,因为电影文件只需储存一次符号的图形数据. 2.尽量使用渐变动画.只要有可能,应尽量

新型全息存储技术亮相 体积更小存储容量更大

最近来自美国加州大学河滨伯恩斯工程学院和俄罗斯科学院研究人员演示了一种新型的全息存储器,结合了磁性数据存储和波基础的信息传输两者的优点,能为电子设备带来前所未有的数据存储和处理能力.全息技术是一种涉及面非常广泛的http://www.aliyun.com/zixun/aggregation/18665.html">应用领域,是利用干涉和衍射原理记录并再现物体真实的三维图像的记录和再现的技术. 它能为电子设备带来前所未有的数据存储和处理能力. 而本次研究的新型存储器利用的是自旋波而不是光束.

容器生态系统 - 每天5分钟玩转Docker容器技术(2)

对于像容器这类平台级别的技术,通常涉及的知识范围会很广,相关的软件,解决方案也会很多,初学者往往容易迷失. 那怎么办呢? 我们可以从生活经验中寻找答案. 当我们去陌生城市旅游想了解一下这个城市一般我们会怎么做? 我想大部分人应该会打开手机看一下这个城市的地图: 城市大概的位置和地理形状是什么? 都由哪几个区或县组成? 主要的交通干道是哪几条? 同样的道理,学习容器技术我们可以先从天上鸟瞰一下: 容器生态系统包含哪些不同层次的技术? 不同技术之间是什么关系? 哪些是核心技术哪些是辅助技术? 首先得

外部世界如何访问容器? - 每天5分钟玩转 Docker 容器技术(37)

上节我们学习了容器如何访问外部网络,今天讨论另一个方向:外部网络如何访问到容器? 答案是:端口映射. docker 可将容器对外提供服务的端口映射到 host 的某个端口,外网通过该端口访问容器.容器启动时通过-p参数映射端口: 容器启动后,可通过 docker ps 或者 docker port 查看到 host 映射的端口.在上面的例子中,httpd 容器的 80 端口被映射到 host 32773 上,这样就可以通过 <host ip>:<32773> 访问容器的 web 服

容器服务中的节点失效时Docker容器重新调度介绍

    生产环境部署的服务都会考虑单点失效情况下的高可用性.在容器服务中,当节点失效的时候,能否重新调度容器到健康节点上继续提供服务对于生产环境中的服务高可用性尤为重要.下面我们就演示一下容器服务的重新调度功能.     首先创建一个含有3个节点的集群.       我们使用如下编排模板创建一个含有三个实例的nginx service,注意到添加了一个属性reschedule:on-node-failure意思是在节点失效的时候 会重新调度这个容器. web: image: nginx rest

Docker容器:更小不一定更好

本文讲的是Docker容器:更小不一定更好,[编者的话]按正常逻辑来说,我们应该选择体积较小的Docker容器.然而事实是,体积小却并不一定能带来性能上的优势.本文将介绍一个使用了一个体积稍大一点的容器,从而将性能提高30倍以上的例子. 按道理来说,我们应该选择体积较小的Docker容器.然而事实是,体积小却并不一定能带来性能上的优势.本文将介绍一个使用了一个体积稍大一点的容器,从而将性能提高30倍以上的例子. 摘要 当使用grep来处理大量的数据的时候,busybox中带的grep速度慢的让人

泰丰葛涵思:PE行业会变得更小更低调

不可否认,私募股权投资(PE)行业在今天遭遇了巨大的挑战.一些专家预计新的黄金时代即将到来,而另一些则在为私募基金撰写"讣告".实际情况是,这个行业的某些方面已发生变化,需要重新修复.但是,私募股权投资基金在整体经济和客户的投资组合中依然发挥着重要的作用. 目前围绕着杠杆收购的失败有许多讨论,实际上是在探讨私募股权投资模式是否注定会失败.有些人认为信贷市场的紧缩和杠杆资金的匮乏会导致私募股权投资行业的终结.这些观察家指出,这个行业的萎缩预示着私募股权作为一种所有权形式的衰退. 但我认为

传感器的发展趋势:更小更轻 TPMS传感器成为标杆

传感器是一种检测装置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输.处理.存储.显示.记录和控制等要求. 传感器技术是一项当今世界令人瞩目的迅猛发展起来的高新技术,也是当代科学技术发展的一个重要标志,它与通信技术.计算机技术构成信息产业的三大支柱之一.它是人类五官的延伸,万物互联的基础. 从智能工厂的应用,对电网.空气.公路等监测网络的实施,传感器的发展领域一直在不断的扩大,人们的生活方方面面都离不开最基础的传感器.近期,工信部正式

基于微服务和Docker容器技术的PaaS云平台架构设计

本文讲的是基于微服务和Docker容器技术的PaaS云平台架构设计[编者的话]在系统架构上,PaaS云平台主要分为微服务架构.Docker容器技术.DveOps三部分,这篇文章重点介绍微服务架构的实施. [3 天烧脑式容器存储网络训练营 | 深圳站]本次培训以容器存储和网络为主题,包括:Docker Plugin.Docker storage driver.Docker Volume Pulgin.Kubernetes Storage机制.容器网络实现原理和模型.Docker网络实现.网络插件.