Docker 镜像构建的最佳实践(持续更新)

1. 尽可能的使用缓存

  • 首先,由于容器是短暂的,所以我们要尽量使用最少的配置和安装,尽量保持初始化容器内运行的应用程序所需的时间,以及终止或清理应用程序所需的时间。

  • 我们应该在 Dockerfile中对各个命令进行排序,以便我们尽可能利用缓存。

//比如下面的 Dockerfile

FROM node:9.4
RUN mkdir -p /app
WORKIR /app
COPY . /app
RUN npm install
CMD ["npm", "start"]

第四行由于会来回进行更改,相应的第5行也会随之进行改变,每次都必须重建该层。为避免这种情况,可以更改为:

FROM node:9.4
RUN mkdir -p /app
WORKIR /app
COPY package.json /app/
RUN npm install
COPY . /app
CMD ["npm", "start"]

2. 尽可能减少镜像的层

保持构建映像的图层数量尽可能的少。图像具有的层越少,容器的启动时间就越快。

但是我们怎样才能保持低层数?请记住,在Dockerfile中,以关键字开头的每一行(如FROM,COPY或RUN)都会创建一个新图层。减少层数的最简单方法是将多个单独的RUN命令组合成一个 - 例如,假设我们在Dockerfile中有以下内容:

RUN apt-get update
RUN apt-get install -y ca-certificates
RUN rm -rf /var/lib/apt/lists/*

可以组合为:

RUN apt-get update \
    && apt-get install -y ca-certificates \
    && rm -rf /var/lib/apt/lists/*
  • 尽可能保持映像的小巧
    • 使用 .dockerignore
    • 不必要的包不要安装到映像中
    • 可以使用多级构建

3. 使用适当的父镜像

构建有效的Docker映像时,使用适当的基本映像是关键建议之一。

在构建自定义Docker映像时,始终鼓励使用Docker Hub中的官方映像作为父映像。这些官方映像将确保遵循所有最佳实践,提供文档并应用安全补丁。例如,如果您的应用程序需要JDK(Java开发工具包),则可以使用openjdk正式的Docker映像而不是使用通用ubuntu映像并将JDK安装在ubuntu映像之上:

//不建议的

FROM ubuntu
RUN apt-get update && apt-get install -y openjdk-8-jdk

//建议的

FROM openjdk

4. 避免使用 latest 作为镜像的版本

在为生产环境创建 Docker 映像时,避免对父镜像使用 latest 标签。因为 latest 会随着新版本发布而发生改变,并且该新版本可能与您的应用程序不兼容,从而导致生产环境失败。相反,最佳做法是始终使用特定版本的标记作为父图像:

//不建议

FROM openjdk
FROM openjdk:latest

//建议

FROM openjdk:8

最后,使用最小版本的父映像对于获得最小尺寸的Docker映像至关重要。Docker Hub中的大多数官方Docker映像都具有围绕Alpine Linux映像构建的最小的映像。另外,在我们的示例中,我们可以使用JRE(Java运行时环境)来运行应用程序,而不是JDK,后者包含构建工具:

//不建议

FROM openjdk:8

//建议

FROM openjdk:8-jre-alpine

//它们之间的大小比较

$ docker images
REPOSITORY   TAG            IMAGE ID       CREATED         SIZE
openjdk      8              8ca4a86e32d8   4 days ago      514MB
openjdk      8-jre-alpine   f7a292bbb70c   20 months ago   84.9MB

你可能感兴趣的:(Docker,docker,devops)