1. 选择基础构建镜像
1.1 使用空镜像scratch
顾名思义,就是完全空壳,什么环境都没有,什么系统都没有,全部都得自己安装
1.2 使用专用镜像Alpine
Alpine 是一个高度精简又包含了基本工具的轻量级 Linux 发行版,基础镜像只有 4.41M,各开发语言和框架都有基于 Alpine 制作的基础镜像,但是太精简,可能出现一些奇怪的环境问题
1.3 使用工具镜像busybox
如果希望镜像里可以包含一些常用的 Linux 工具,busybox 镜像是个不错选择,镜像本身只有 1.16M,非常便于构建小镜像。
1.4 使用基础系统镜像
Debian和CentOS都是基于Linux内核的流行开源操作系统。虽然它们有一些相似之处,但它们之间也存在一些关键差异:
-
软件包管理:Debian使用apt软件包管理器,而CentOS使用yum或dnf软件包管理器。两个包管理器都能够安装、更新和删除软件包,但它们的命令和语法有所不同。
-
发布周期:Debian的发布周期比CentOS慢。Debian平均每两年发布一个新版本,而CentOS则更频繁地发布新版本,通常每隔几年发布一次。
-
默认软件:Debian和CentOS预装的默认软件包不同。Debian倾向于更精简的安装,重点是提供一个稳定的基础系统,而CentOS则包含更多预安装的软件包,适用于更广泛的用例。
-
社区:Debian由志愿者社区管理,而CentOS由一个商业公司(Red Hat)支持,并拥有更大的公司支持网络。
-
系统架构:Debian支持比CentOS更广泛的硬件架构,而CentOS主要设计用于x86和x86-64处理器。
1.5 尽量串联RUN指令
在定义 Dockerfile 时,如果太多的使用 RUN 指令,经常会导致镜像有特别多的层,镜像很臃肿,而且甚至会碰到超出最大层数(127层)限制的问题,遵循 Dockerfile 最佳实践,我们应该把多个命令串联合并为一个 RUN(通过运算符&&来实现),每一个 RUN 要精心设计,确保安装构建最后进行清理,这样才可以降低镜像体积,以及最大化的利用构建缓存。
RUN apt-get update && apt-get install wget && cd /
1.6 使用多阶段构建(如有需要)
Dockerfile 中每条指令都会为镜像增加一个镜像层,并且你需要在移动到下一个镜像层之前清理不需要的组件。实际上,有一个 Dockerfile 用于开发(其中包含构建应用程序所需的所有内容)以及一个用于生产的瘦客户端,它只包含你的应用程序以及运行它所需的内容。这被称为“建造者模式”。Docker 17.05.0-ce 版本以后支持多阶段构建。使用多阶段构建,你可以在 Dockerfile 中使用多个 FROM 语句,每条 FROM 指令可以使用不同的基础镜像,这样您可以选择性地将服务组件从一个阶段 COPY 到另一个阶段,在最终镜像中只保留需要的内容。
1.7 可将时区设置为东八区并安装bash
# 将时区设置为东八区并安装bash
RUN echo "https://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories \
&& echo "https://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories \
&& apk add --no-cache tzdata \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo Asia/Shanghai > /etc/timezone \
&& apk del tzdata \
&& apk update \
&& apk upgrade \
&& apk add --no-cache bash \
bash-doc \
bash-completion \
&& rm -rf /var/cache/apk/*
1.8 可将时区设置为东八区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo Asia/Shanghai > /etc/timezone
1.9 (nodejs项目)下载工具node-prune,清理node_modules
# 下载工具node-prune,清理node_modules的
RUN wget https://gobinaries.com/tj/node-prune && chmod +x node-prune && ./node-prune
# run node prune
RUN node-prune
1.10 (nodejs项目)使用npm清除开发测试等包
# 使用npm清除开发测试等包
RUN npm prune --production
1.11 RUN命令中执行apt、apk或者yum类工具技巧
如果在 RUN 命令中执行 apt、apk 或者 yum 类工具,可以借助这些工具提供的一些小技巧来减少镜像层数量及镜像大小。举几个例子:
(1)在执行 apt-get install -y
时增加选项--no-install-recommends
,可以不用安装建议性(非必须)的依赖,也可以在执行 apk add 时添加选项--no-cache
达到同样效果;
(2)执行 yum install -y
时候, 可以同时安装多个工具,比如 yum install -y gcc gcc-c++ make
。将所有 yum install 任务放在一条 RUN 命令上执行,从而减少镜像层的数量;
(3)组件的安装和清理要串联在一条指令里面,如 apk --update add php7 && rm -rf /var/cache/apk/*
,因为 Dockerfile的每条指令都会产生一个文件层,如果将 apk add … 和 rm -rf … 命令分开,清理无法减小apk命令产生的文件层的大小。 Ubuntu或 Debian可以使用 rm -rf /var/lib/apt/lists/*
清理镜像中缓存文件;CentOS 等系统使用 yum clean all
命令清理。
2. 根据tag标签选购现成镜像
2.1 Alpine,slim后缀
一般现成的一些开发环境镜像,比如nodejs,python等,都会出现后缀带有Alpine,slim
等字眼,比如node:20.0.0-alpine,node:20.0-slim
,alpine意思是最精简的版本了,如果要带一些现成工具,推荐使用slim
2.2 buster,stretch ,jessie,bullseye,bookworm后缀
代表不同的 bebian 版本号
- buster - debian 10
- stretch - debian 9
- jessie - debian 8
- bullseye、bookworm - 正在开发但尚未稳定版本