设为首页 收藏本站
查看: 1107|回复: 0

[经验分享] 怎样构建一个好的 Docker 镜像

[复制链接]

尚未签到

发表于 2015-10-13 10:56:38 | 显示全部楼层 |阅读模式
  本文的原文地址是
What constitutes a good docker image?


  注:本文不会全部翻译,只会挑选个人认为有价值的部分进行摘取性翻译,如想详细阅读,请看原文


构建一个好的 Docker 镜像

debian 的基础镜像
  在撰写本文时,ubuntu:14.04 为 195 MB,然而 debian:wheezy 是 85 MB,但是 Ubuntu 额外的几百兆字节不会给你带来任何价值(我所知道的)。在一些极端情况下,甚至可能你的基础镜像是 2 MB
busybox。这可能仅仅实际上是二进制包的静态连接。

没有充足的原因,不要安装构建工具
  构建工具占用太多空间,并且从源码构建通常很慢。如果你只是安装别人的软件,通常不需要从源码构建,并且它应该被避免。比如,没有必要安装 python,gcc 等等。为了获取最新版本的 node.js 并运行在一台 Debian 主机上。在
node.js downloads page 这里有一个可用的二进制的压缩包。类似的,redis 可以通过包管理器安装。
  至少有几个很好的理由使用构建工具:


  • 你需要一个指定的版本(比如,在 Debian 仓库,redis 版本太老)
  • 你需要使用指定的选项编译
  • 你需要 npm install 安装一些模块来编译进二进制包
  在第二种情况下,好好的想清楚,你是否真应该这样做。在第三种情况下,我建议在另外一个 "npm installer" 镜像安装构建工具,基于最小的 node.js 镜像。

不要遗留临时文件
  下面的 Dockerfile 结果镜像大小是 109 MB:

FROM debian:wheezy
RUN apt-get update && apt-get install -y wget
RUN wget http://cachefly.cachefly.net/10mb.test
RUN rm 10mb.test

  在另一方面,这看似相当的 Dockerfile 结果镜像大小是 99 MB:

FROM debian:wheezy
RUN apt-get update && apt-get install -y wget
RUN wget http://cachefly.cachefly.net/10mb.test && rm 10mb.test

  因此看起来如果你在 Dockerfile 的两个步骤之间在磁盘空间留下了一个文件,当你删除这个文件的时候,空间不会被回收。也可以完全避免临时文件,仅仅在命令行之间管道输出。比如:

wget -O - http://nodejs.org/dist/v0.10.32/node-v0.10.32-linux-x64.tar.gz | tar zxf -

  将提取压缩文件,并没有把它放在文件系统上。

包管理后进行清理
  如果你运行 apt-get update 设置你的容器,它在 /var/lib/apt/lists/ 目录构成了数据,但是一旦镜像完成,这些数据是不需要的。你可以安全的清理那个目录来节约一些兆字节。
  这个 Dockerfile 生成一个 99 MB 镜像:

FROM debian:wheezy
RUN apt-get update && apt-get install -y wget

  然而这个生成一个 90 MB 的镜像:

FROM debian:wheezy
RUN apt-get update && apt-get install -y wget && rm -rf /var/lib/apt/lists/*

指定包的版本
  当一个 Docker 镜像是不可变的,一个 Dockerfile 是不保证在运行在不同的时间生成相同的输出。这个问题,当然,是外部状态,并且我们难以控制它。最好在某种程度上最小化你的
Dockerfile 外部状态的影响,这是有可能的。做这个的一个简单方式是指定包的版本,当通过包管理器更新的时候。这里有一个怎样做的示例:

# apt-get update
# apt-cache showpkg redis-server
Package: redis-server
Versions:
2:2.4.14-1
...
# apt-get install redis-server=2:2.4.14-1

  我们所能希望的是,但是这是没有保障的,包仓库从现在开始的一年仍然会是这个版本。尽管如此,明确的显示你镜像中依赖的软件版本是不可否认的价值。

组合命令
  如果你有一系列的相关命令,最好的方式是在一个命令中串联它们。这是一个更有意义的构建缓存(逻辑分组步骤集中到一个缓存步骤)并使得文件系统层级数量降下来了(我认为通常这是可取的,但是不知道在客观上是否是更好的)。
  反斜线符号 \ 在这里帮助你提升可读性:

RUN apt-get update && \
apt-get install -y \
wget=1.13.4-3+deb7u1 \
ca-certificates=20130119 \
...

使用环境变量避免重复
  这是我阅读官方的 node.js Docker 镜像的
Dockerfile 学来的一个技巧。此外,这个 Dockerfile 是非常棒的。我唯一的指责就是它是基于一个巨大的
buildpack-deps 镜像,带着各种各样我不需要或不想要的东西。
  你可以使用 ENV 定义环境变量,然后在一系列的命令中引用它们。下面,我从链接的 Dockerfile 中转述了摘要:

ENV NODE_VERSION 0.10.32
RUN curl -SLO "http://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" \
&& tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 \
&& rm "node-v$NODE_VERSION-linux-x64.tar.gz"

  上面这个版本信息,你只需要使用环境变量 NODE_VERSION 定义一次即可,而不用每次都写。

版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-126205-1-1.html 上篇帖子: 如何使用 docker 及常用命令(二) 下篇帖子: docker实现原理之namespace
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表