Docker之9 Dockerfile优化

简介: Docker优化

为什么要进行Dockerfile的优化?

在 Docker build 过程中,会占用 Dockerfile 并且在其自身临时的容器中一对一地运行每个可操作的指令。 结果是每个可操作的指令都有一个新映像层。Docker镜像应该是小而快的,如果不能构建一个良好的Dockerfile来帮助你提高构建缓存命中率,那么你的镜像构建过程将会变得相当的缓慢,并且镜像的体积将会很大。

如何进行优化Dockerfile

镜像体积最小化

-1. 基础镜像的选择:
常用的 Linux 系统镜像一般有 ubuntu、centos、debian,其中debian 更轻量,而且适用的用途很广。在运行某种应用例如PHP时,在业务需要满足下尽量适用官方的Docker镜像。
1

-2. 减少镜像层数:
在一个Dockerfile中每个命令都会在原来的基础上生成一层镜像,这毫无疑问将会对镜像增加体积,尽量将RUN命令进行组合,这将有效的减少镜像层数达到减少体积的效果。

#优化前
RUN wget jdk-8u191-linux-x64.tar.gz
RUN tar zxvf jdk-8u191-linux-x64.tar.gz
#优化后
RUN tar zxvf jdk-8u191-linux-x64.tar.gz && \
 mv jdk1.8.0_191 /usr/local/jdk

-3. 清除缓存和临时文件:
在镜像构建过程中,可能会适用apt-get或yum等方式进行包的安装,在完成后系统会残留一些不必要的文件,或者适用源代码进行编译某些应用时,源代码文件夹将会存放在镜像中,在镜像构建的最后步骤,可以将这些不必要的文件进行删除。

RUN rm -rf /usr/local/src/* && \
        yum clean all 

-4. 镜像服务化:
当有多个服务时,分开多个镜像去运行这些服务,各司其职,例如在同一个镜像中打包了Apache httpd、MySQL、PHP,这无疑造成该镜像耦合性太差且体积臃肿。建议采用不同的镜像去托管不同的应用。

构建速度最快化

-5. 构建缓存
在构建过程中,如果可以利用到缓存无疑将提升构建的速度,缓存的触发原则是单个指令的内容没有变化,则Docker构建时就会默认去使用缓存。我们可以通过将一些不变的操作独立成单独的指令,这样在构建时只会对有产生变化的指令构建,而不变的指令将会使用缓存。
2

-6. 删除构建目录额外的文件
在构建镜像时将会上传构建文件夹中的所有文件,但有时不是全部的文件都是构建所需的,可以通过.dockerignore文件进行过滤,这将提高构建的速度及镜像的大小。

-7. 优化网络请求
在构建镜像过程中,可能有指令需要使用网络去实现下载、安装等操作,由于网络的不确定性,可能会造成构建过程较久,而且构建的时间不一等问题,建议采用本地化引用网络资源来解决问题,例如Centos使用yum进行软件包的管理时,可以通过Nexus进行本地代理,从而减少网络请求的问题。

使用优化

-8. 使用CMD、VOLUME指令对Image进行服务化
在不同的业务场景中会对镜像有不同的应用,但如果每次需要进行手动添加一些业务特定的东西时是比较繁琐的,可以采用CMD、VOLUME指令进行镜像的服务化弹性定制。

-9. 使用LABEL对镜像进行元数据维护
在Docker镜像仓库中可能托管很多镜像,每一个镜像通途不一,但靠镜像名和标记是无法判断具体信息的,使用LABEL的方式可以对镜像的元数据进行管理,从而更清晰的知道镜像的信息。

-10. 使用变量
就像编程一样,当一个字符串出现多次时,请用ARG来声明变量取代hard code。

目录
相关文章
|
2月前
|
运维 云计算 Docker
深入理解与实践:基于Docker的微服务架构优化策略
本文旨在为软件开发和运维人员提供一个全面的指南,探讨如何通过Docker容器技术优化微服务架构。我们不仅深入分析了Docker在微服务环境中的关键作用,还提出了一系列实践策略,以提高部署效率、增强系统稳定性,并确保服务的可伸缩性和安全性。通过具体案例分析和比较传统部署方式的局限性,本文展示了Docker如何成为微服务架构优化不可或缺的工具,旨在帮助读者构建一个更加灵活、高效和可靠的服务环境。
151 1
|
3月前
|
Cloud Native NoSQL Redis
云原生 Docker Dockerfile 构建应用
【1月更文挑战第9天】云原生 Docker Dockerfile 构建应用
|
3月前
|
Cloud Native Docker 容器
云原生 Docker Dockerfile 构建配置
【1月更文挑战第9天】云原生 Docker Dockerfile 构建配置
|
4月前
|
Linux 开发工具 Docker
Docker dockerfile 案例:centos 支持 vim
Docker dockerfile 案例:centos 支持 vim
52 0
|
3月前
|
分布式计算 Java Linux
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
Docker 是一套构建在 Linux 内核之上的高级工具,旨在帮助开发人员和运维人员更轻松地交付应用程序和依赖关系,实现跨系统和跨主机的部署。使用安全且轻量级的容器环境来实现这一目标。容器可以手动创建,也可以通过编写 Dockerfile 自动创建。开发人员和运维人员可以将应用程序及其依赖打包到容器中,实现应用程序的可移植性和环境一致性。
120 5
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
|
3月前
|
Java 持续交付 Docker
Docker 项目如何使用 Dockerfile 构建镜像?
Docker 简介:讲述 Docker 的起源、它是如何革新现代软件开发的,以及它为开发者和运维团队带来的好处。重点强调 Docker 的轻量级特性和它在提高应用部署、扩展和隔离方面的优势。
|
4月前
|
存储 监控 持续交付
Docker容器的优化和性能调优技巧
Docker已经成为了现代应用程序开发和部署的核心工具之一。然而,要确保Docker容器在生产环境中运行稳定、高效,需要一些优化和性能调优的技巧。本文将介绍一些关键的Docker容器优化和性能调优策略,并提供丰富的示例代码,以帮助大家充分利用Docker的潜力。
|
1月前
|
Java 网络安全 开发者
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
44 0
|
2月前
|
JavaScript 安全 开发者
深入浅出:使用Docker优化你的开发环境
在软件开发的世界里,"它在我的机器上运行得好好的"这句话几乎成了一个笑话。这主要是因为环境配置差异所带来的挑战。本文将介绍如何使用Docker来创建一致的开发环境,解决环境差异带来的问题。我们将从Docker的基本概念入手,探讨其在开发流程中的应用,并通过实际案例演示如何构建、部署和管理容器化的应用。本文旨在为开发者提供一个清晰的指南,帮助他们利用Docker优化开发流程,提高生产效率。
23 2
|
3月前
|
运维 Ubuntu Docker
【Docker】Dockerfile 构建文件
【1月更文挑战第26天】【Docker】Dockerfile 构建文件