使用Dockerfile来定制Docker镜像

Dockerfile定制镜像

Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令,Docker程序将读取Dockerfile,根据指令生成定制的image。

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层, 因此每一条指令的内容,就是描述该层应当如何构建。

一般的,Dockerfile 分为四部分:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

Dockerfile示例

#基础镜像信息
FROM ubuntu
#维护者信息
MAINTAINER docker_user docker_user@email.com
#镜像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
#容器启动时执行指令
CMD /usr/sbin/nginx

Dockerfile指令详解

指令 描述 示例示例
FROM 指定该镜像的基础镜像 FROM image 或 FROM image:tag
MAINTAINER 指定作者信息 MAINTAINER name
RUN 在构建镜像时执行脚本 RUN command
CMD 在运行容器时执行脚本 RUN command par1 par2
ENTRYPOINT 在运行容器时执行脚本 ENTRYPOINT command par1 par2
EXPOSE 让Docker暴露容器的端口号 EXPOSE port
ENV 指定环境变量 ENV key value
ADD 添加文件(夹)到容器,可以是URL ADD src dest
COPY 添加文件(夹)到容器 COPY src dest
VOLUME 创建挂载点 VOLUME path
WORKDIR 设置工作目录 WORKDIR path
USER 指定运行容器时的用户名或 UID USER daemon
ONBUILD 配置当所创建的镜像作为其它新创建镜像的基础镜像 ONBUILD INSTRUCTION
HEALTHCHECK 设置检查容器健康状况的命令 HEALTHCHECK cmmand

build命令

docker build命令用于根据给定的Dockerfile和上下文以构建Docker镜像。

docker build [OPTIONS] <PATH | URL | ->

常用OPTIONS选项说明:

选项 描述
–build-arg 设置构建时的环境变量
–no-cache 默认false。设置该选项,将不使用Build Cache构建镜像
–pull 默认false。设置该选项,总是尝试pull镜像的最新版本
–compress 默认false。设置该选项,将使用gzip压缩构建的上下文
–disable-content-trust 默认true。设置该选项,将对镜像进行验证
–file, -f Dockerfile的完整路径,默认值为‘PATH/Dockerfile’
–isolation 默认–isolation="default”,即Linux命名空间;其他还有process或hyperv
–label 为生成的镜像设置metadata
–squash 默认false。设置该选项,将新构建出的多个层压缩为一个新层,但是将无法在多个镜像之间共享新层
–tag -t 镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag
–network 默认default。设置网络
–quiet, -q 默认false。设置是否静默构建,不输出构建信息
–force-rm 默认false。设置该选项,总是删除掉中间环节的容器
–rm 默认–rm=true,即整个构建过程成功后删除中间环节的容器

精简Docker镜像

Dockerfile的语法非常简单,使用也很方便,但是如果使用不当就可能找出构建出来的镜像过大,下面几项技巧有助于精简Docker镜像

选择合适的基础镜像,不要安装不必要的包

通常的Dockerfile示例都会拿ubuntu来举例说明,但是ubuntu并不是基础镜像的最佳选择,因为里面包含了很多ubuntu运行需要的文件,但是对于运行应用来说大多文件其实是不需要的,可以适当的选择更小的基础镜像例如alpine或者scratch

将多个RUN指令合并为一个,每个RUN指令后删除多余文件

Docker镜像是分层的,Dockerfile中的每个指令都会创建一个新的镜像层。镜像层是不可变的,如果我们再某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,所以每个RUN指令后删除多余文件可以有助于大大的减小镜像大小。

串联你的Dockerfile指令的方式是将RUN指令通过 &&/ 支持将命令串联在一起

使用多阶段构建

Docker 17.05.0-ce 版本以后支持多阶段构建。使用多阶段构建,你可以在Dockerfile中使用多个FROM语句,每条FROM指令可以使用不同的基础镜像,这样您可以选择性地将服务组件从一个阶段COPY到另一个阶段,在最终镜像中只保留需要的内容。

压缩镜像

docker自带的一些命令还能协助压缩镜像,比如 exportimport

docker export 71b1c0ad0a2b | docker import - redis:lab-4

最终生成的镜像文件还可以使用gzip方式导出保存,这样也有助于镜像的进一步压缩。

参考资料

分类

开发
    --go (9)
    --java (5)
    --php (11)
    --mysql (9)
    --javascript (3)
    --html (1)
    --算法 (6)
架构
    --理论 (9)
    --网络 (3)
    --服务器 (2)
    --消息队列 (3)
    --容器 (5)
    --监控 (1)
    --搜索引擎 (3)
    --大数据 (0)
    --测试 (1)
系统
    --linux (10)
    --mac (2)
    --windows (1)
足球
    --世界杯 (60)
    --欧洲杯 (28)
    --文迷 (3)
大学时光
    --校园生活 (96)
    --假期生活 (17)
    --广院杯那些事 (14)
    --北京奥运 (6)
    --胡思乱写 (17)


最近发布

零拷贝技术介绍

服务网格技术简介

C语言标准和标准库简介

Kubernetes简介及环境搭建

Go语言开发的顶级项目


归档

2006 (109)
2007 (40)
2008 (47)
2009 (10)
2010 (6)
2012 (10)
2013 (14)
2014 (27)
2015 (15)
2016 (6)
2017 (8)
2018 (11)
2019 (17)
2020 (5)