如何构建尽可能小的容器镜像?
dockerfile
FROM node:onbuild
EXPOSE 8080
通过使用较小的基础镜像(如Alpine),您可以显著减少容器的大小。Alpine Linux是一款体积小,轻量级的Linux发行版,在Docker用户中非常受欢迎,因为它与许多应用程序兼容,同时仍然保持小体积。幸运的是,Node.js(以及其他流行语言)有一个官方的Alpine图像,可以满足您的一切需求。与默认的node镜像不同,node:alpine会删除许多文件和程序,只留下足以运行您的应用程序的部分。基于Alpine Linux的Dockerfile创建起来有点复杂,因为你必须运行一些针对onbuild的命令。
dockerfile
FROM node:alpine
WORKDIR /app
COPY package.json /app/package.json
RUN npm install --production
COPY server.js /app/server.js
EXPOSE 8080
CMD npm start
但是,这是值得的,因为产生的镜像只有65MB!
dockerfile
FROM golang:onbuild
EXPOSE 8080
下一步是使用更小的基础镜像,也就是golang:alpine镜像。 到目前为止,这与我们针对解释型语言所遵循的过程相同。同样,使用Alpine基础镜像创建Dockerfile有点复杂,因为您必须运行一些执行onbuild镜像相关的命令。
dockerfile
FROM golang:alpine
WORKDIR /app
ADD . /app
RUN cd /app && go build -o goapp
EXPOSE 8080
ENTRYPOINT ./goapp
但同样,由此产生的镜像要小得多,大小只有256MB!
dockerfile
FROM golang:alpine AS build-env
WORKDIR /app
ADD . /app
RUN cd /app && go build -o goapp
FROM alpine
RUN apk update && \
apk add ca-certificates && \
update-ca-certificates && \
rm -rf /var/cache/apk/*
WORKDIR /app
COPY --from=build-env /app/goapp /app
EXPOSE 8080
ENTRYPOINT ./goapp
你看看现在! 这个容器镜像只有12MB大小!
对于每次构建,我都会删除缓存中的所有Docker镜像。构建(Build):
Go Onbuild: 35 Seconds
Go Multistage: 23 Seconds
对于较大的容器镜像,构建需要的时间大约是10秒左右。 虽然这个代价仅在初始构建时需要付出,但是如果您使用持续集成系统,则在每次构建时都要付出这个代价。下一个测试是将容器镜像推送到远程镜像仓库。 对于此测试,我使用Google Container Registry来存储镜像。推送(Push):
Go Onbuild: 15 Seconds
Go Multistage: 14 Seconds
这很有趣! 为什么需要花费相同的时间来推送12MB镜像和700MB镜像? 事实证明,Google Container Registry在幕后使用了很多技巧,包括许多流行基础镜像的全局缓存。最后,我想测试将镜像从远程镜像仓库库拉到本地计算机所需的时间。拉取(Pull):
Go Onbuild: 26 Seconds
Go Multistage: 6 Seconds
20秒的差距,这是使用两个不同容器镜像之间的最大差异。 您可以开始看到使用较小镜像的优势,尤其是在经常拉取镜像时。您还可以使用Google Container Builder在云中构建容器镜像,这样可以自动将它们存储在Google Container Registry中。构建(build)+ 推送(Push):
Go Onbuild: 25 Seconds
Go Multistage: 20 Seconds
再次证明,使用较小的镜像有一点小优势,没有我想象的那么大。在小型机器上构建镜像如果是在小型机器上构建镜像,那么使用较小的容器镜像是否有优势呢? 如果你有一个功能强大的笔记本电脑与快速互联网连接和/或容器生成器,优势并不明显。 但是,如果您使用功能较弱的机器,故事就会发生变化。 为了模拟这一点,我使用了一个Google Compute Engine f1-micro VM来构建,推送和拉取这些镜像,结果非常惊人!构建(build):
Go Onbuild: 52 seconds
Go Multistage: 6 seconds
推送(Push):
Go Onbuild: 54 seconds
Go Multistage: 28 seconds
拉取(Pull):
Go Onbuild: 48 Seconds
Go Multistage: 16 seconds
在这种情况下,使用较小的容器镜像确实非常有帮助!在Kubernetes上拉取镜像虽然您可能不关心构建和推送容器镜像所需的时间,但您应该非常关心拉取容器镜像所需的时间。 对于Kubernetes,这可能是您的生产集群最重要的指标。例如,假设您有一个三节点集群,其中一个节点崩溃。 如果您使用的是像Kubernetes Engine这样的托管系统,系统会自动生成一个新节点来代替它。但是,这个新节点将是全新的,并且必须先拉取所有容器镜像才能开始工作。 拉取容器镜像所需的时间越长,集群执行的时间就越长!当您增加群集大小(例如,使用Kubernetes Engine Autoscaling)或将节点升级到新版本的Kubernetes时,可能会发生这种情况(接下来的几集中会关注这个问题)。我们可以看到来自多个部署的多个容器的拉取性能可以在这里真正体现出来,使用小容器可能会浪费几分钟的部署时间!安全性和漏洞除了性能之外,使用较小的容器镜像还有很大的安全性提升。 与使用大基础镜像的容器镜像相比,小容器镜像通常具有较小的攻击面。 几个月前,我构建了Go onbuild和multi-age容器镜像,因此它们可能包含一些已被发现的漏洞。 使用Google Container Registry的内置漏洞扫描,可以轻松扫描容器中的已知漏洞。 让我们看看我们能找到些什么。
让我们深入了解更大容器镜像里面存在的问题。
使用小容器镜像的性能和安全优势不言而喻。使用小的基础镜像和builder pattern可以更容易地构建小镜像,并且还有许多其他技术可用于单个技术栈和编程语言,以最小化容器体积。 无论你做什么,你都可以确信你保持容器镜像最小化的努力是值得的!
原文发布时间为:2018-09-18
本文作者:kelvinji2009
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Terraform 部署容器服务Kubernetes集群及Wordpress应用
本文档介绍了如何通过 Terraform 在 VPC 环境下部署一个阿里云容器服务 Kubernetes 集群,并在该集群之上,部署一个 WordPress 样例应用。本文档提供一种构建阿里云基础设施的解决方案,让您通过代码来自动创建、编排和管理容器服务以及完成在容器集群上应用的自动化部署。 前提条件 需要开通阿里云容器服务,用户的账户需有 100 元余额并通过实名认证。 需要启用用户账号的 AccessKey,妥善保存和记录 AccessKey ID 和 AccessKey Secret。 步骤 1 安装 Terraform 详细信息参见 Terraform 部署容器服务Swarm集群及Wordpress应用 除了下载 Terraform 和阿里云的 Terraform Provider 之外,在运行 Wordpress 的模板之前,需要在
- 下一篇
2018杭州云栖 Clouder Lab云存储专场实验文档:企业数据湖搭建—大规模异构数据处理实践
9月20日 E2-5 现场开讲。 实验活动内容地址如下:1、在控制台使用OSS Select2、基于日志的安全分析实战3、智能媒体管理服务控制台功能体验4、企业办公数据处理和分发(函数计算篇)5、9.20 杭州云栖ClouderLab:环境准备 欢迎大家通过上面的网址进行动手试验课程。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Hadoop3单机部署,实现最简伪集群