问题: Docker镜像构建步骤

👇 点击展开/折叠 面试背诵模板(建议先背这个) Docker镜像构建的核心步骤:①编写Dockerfile定义构建流程;②准备.dockerignore排除无关文件;③执行docker build -t 镜像名:标签 . 命令构建;④Docker Daemon解析Dockerfile指令,逐条创建临时容器并commit为镜像层;⑤所有层合并生成最终镜像。核心优化包括多阶段构建分离编译与运行环境、利用分层缓存加速构建、使用非root用户运行提升安全性、优先选用slim/alpine基础镜像瘦身。
---

一、构建前的准备

① 安装Docker环境
确保目标环境已安装Docker运行时。可通过官方脚本一键安装主流Linux发行版(CentOS、Ubuntu等),安装后执行docker --version验证。

② 编写Dockerfile
Dockerfile是描述镜像构建过程的文本文件,是构建镜像的“标准化剧本”。它包含一系列指令,每条指令生成镜像的一层。核心指令包括:

  • FROM:指定基础镜像,必须是Dockerfile中非注释的第一个指令
  • WORKDIR:设置工作目录
  • COPY:拷贝文件或目录到镜像中
  • RUN:在构建过程中执行的命令
  • ENV:设置环境变量
  • EXPOSE:声明容器服务端口
  • CMD:容器启动时执行的命令
  • USER:指定运行用户,避免root权限

③ 准备.dockerignore文件
在构建上下文目录中创建.dockerignore文件,排除.git、node_modules、日志文件等无关内容,避免敏感信息泄露并减小镜像体积。

二、执行构建命令

① 执行docker build
在Dockerfile所在目录执行构建命令:

1
docker build -t 镜像名:标签 .
  • -t:指定镜像标签,格式为名称:标签
  • .:表示构建上下文为当前目录

② 构建流程(Docker Daemon内部)

  1. Docker Client将上下文(context)中的文件打包发送给Docker Daemon
  2. Daemon创建临时目录,将上下文文件解压到该目录
  3. 读取并解析Dockerfile,遍历每条指令
  4. 为每条指令创建一个临时容器,执行指令后commit为新的镜像层
  5. 所有层合并生成最终镜像,最后一次commit的ID即为最终镜像ID

③ 缓存机制
Docker默认缓存已有的镜像层。若某层指令与缓存匹配(ADD/COPY还会校验文件checksum),则直接复用缓存,大幅提升构建速度。可通过--no-cache=true禁用缓存。

三、验证与优化

① 验证镜像

1
docker images | grep 镜像名

查看镜像是否成功创建。

② 多阶段构建(生产级优化)
Docker 17.05+支持多阶段构建,通过多个FROM指令分离构建环境和运行环境:

1
2
3
4
5
6
7
8
9
10
11
# 第一阶段:构建(完整开发环境)
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

# 第二阶段:运行(最小基础镜像)
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]

最终镜像仅包含运行所需文件,体积显著减小。

③ 生产级最佳实践

  • 镜像瘦身:优先使用slim或alpine基础镜像;清理包管理器缓存
  • 安全加固:使用USER指令切换到非特权用户运行
  • 版本管理:采用语义化版本标签(如v1.0.0)和Git提交哈希双重标识
  • 分层优化:将频繁变更的操作(如代码复制)放在Dockerfile末尾,最大化利用缓存