目录
1 Docker镜像基础概念
1.1 什么是Docker镜像
1.2 镜像的分层结构
2 docker build命令详解
2.1 docker build基本语法
2.2 构建上下文概念
3 Dockerfile编写实践示例
3.1 Dockerfile指令详解
3.1.1 FROM
3.1.2 RUN
3.1.3 COPY vs ADD
3.1.4 CMD vs ENTRYPOINT
3.1.5 EXPOSE
3.1.6 ENV
3.2 多阶段构建
4 构建过程优化技巧
4.1 利用构建缓存
4.2 .dockerignore文件
4.3 构建参数(--build-arg)
4.4 镜像大小优化
5 常见问题与解决方案
5.1 构建速度慢
5.2 镜像体积过大
5.3 构建缓存失效
6 总结
1 Docker镜像基础概念
1.1 什么是Docker镜像
- Docker镜像是一个轻量级、可执行的独立软件包,包含运行某个软件所需的所有内容:代码、运行时环境、系统工具、系统库和设置
- 镜像采用分层存储结构,每一层都是只读的,这种设计使得镜像可以高效地共享和复用
- 镜像与容器的关系可以理解为:镜像是静态的定义,容器是镜像运行时的实体
- 容器可以被创建、启动、停止、删除、暂停等,而镜像是这些容器运行的基础
1.2 镜像的分层结构
Docker镜像采用分层(Layer)的架构,这种设计带来了诸多优势:
- 共享资源:多个镜像可以共享相同的底层镜像层
- 空间效率:当镜像更新时,只需传输变更的部分
- 快速构建:构建时可以复用已存在的层
- 不可变性:每一层都是只读的,确保一致性

典型的Docker镜像分层结构:
- 最底层是基础操作系统层
- 中间层包含运行环境和依赖
- 上层包含应用特定文件
- 最上层是容器运行时添加的可写层
2 docker build命令详解
2.1 docker build基本语法
- docker build命令用于根据Dockerfile构建镜像,其基本语法如下:
docker build [OPTIONS] PATH | URL | -
常用选项说明:
- -t, --tag:指定镜像名称和标签,格式为name:tag
- -f, --file:指定Dockerfile路径(默认是上下文路径下的Dockerfile)
- --build-arg:设置构建时的变量
- --no-cache:构建时不使用缓存
- --pull:总是尝试拉取新版本的基础镜像
- --target:多阶段构建时指定目标阶段
2.2 构建上下文概念
构建上下文(Build Context)是指docker build命令中PATH参数指定的目录及其子目录,Docker客户端会将整个上下文目录打包发送给Docker守护进程,因此:
- 上下文过大时会导致构建过程变慢
- 应该通过.dockerignore文件排除不必要的文件
- Dockerfile中的COPY/ADD指令只能操作上下文中的文件

- 客户端将构建上下文打包发送给守护进程
- 守护进程解析Dockerfile
- 按顺序执行构建指令
- 生成最终镜像并存储在本地
3 Dockerfile编写实践示例
3.1 Dockerfile指令详解
3.1.1 FROM
- 指定基础镜像,必须是Dockerfile的第一条有效指令:
FROM ubuntu:20.04
3.1.2 RUN
- 执行命令并创建新的镜像层,常用于安装软件包:
RUN apt-get update && apt-get install -y \package1 \package2 \&& rm -rf /var/lib/apt/lists/*
3.1.3 COPY vs ADD
两者都用于复制文件,但ADD有额外功能:
- COPY:简单复制文件/目录
COPY ./app /usr/src/app
- ADD:除复制外还能解压压缩文件、支持URL
ADD http://example.com/file.tar.gz /tmp/
3.1.4 CMD vs ENTRYPOINT
- CMD:提供容器默认的执行命令,可被覆盖
CMD ["python", "app.py"]
- ENTRYPOINT:配置容器启动时运行的命令,不易被覆盖
ENTRYPOINT ["python"] CMD ["app.py"]
3.1.5 EXPOSE
- 声明容器运行时监听的端口:
EXPOSE 8080
3.1.6 ENV
- 设置环境变量,可被后续指令使用:
ENV NODE_ENV=production
3.2 多阶段构建
- 多阶段构建可以显著减小最终镜像大小:

- 最终镜像只包含运行所需内容,不包含构建工具
- 减小镜像体积
- 提高安全性(减少攻击面)
4 构建过程优化技巧
4.1 利用构建缓存
Docker会缓存已构建的层,合理组织Dockerfile可以最大化利用缓存:
- 将变化频率低的指令放在前面
- 将变化频率高的指令(如COPY源代码)放在后面
- 合并相关RUN命令减少层数
4.2 .dockerignore文件
- 类似于.gitignore,用于排除不需要加入构建上下文的文件:
# 忽略git目录
.git/# 忽略日志文件
*.log# 忽略临时文件
tmp/# 忽略本地配置文件
config/local.ini
4.3 构建参数(--build-arg)
- 允许构建时传入变量,增加Dockerfile灵活性:
ARG VERSION=latest FROM ubuntu:$VERSION
- 构建时指定:
docker build --build-arg VERSION=20.04 -t myapp .
4.4 镜像大小优化
- 使用轻量级基础镜像(如alpine)
- 多阶段构建
- 清理不必要的文件(如apt缓存)
- 合并RUN指令减少层数
- 使用docker-slim等工具进一步优化
5 常见问题与解决方案
5.1 构建速度慢
可能原因及解决方案:
- 大构建上下文:优化.dockerignore,减少上下文大小
- 网络延迟:使用本地镜像仓库或国内镜像源
- 未充分利用缓存:合理组织Dockerfile指令顺序
- 复杂构建步骤:考虑使用多阶段构建分离构建和运行环境
5.2 镜像体积过大
- 使用docker history 分析各层大小
- 删除不必要的中间文件和缓存
- 使用alpine等小型基础镜像
- 采用多阶段构建
5.3 构建缓存失效
- 指令顺序改变
- 上游基础镜像更新
- 构建参数变化
- 上下文文件变化
6 总结
Docker镜像构建是容器化应用的关键环节,掌握docker build和Dockerfile的细节能够显著提高开发效率和部署质量。通过合理利用多阶段构建、构建缓存、.dockerignore文件等技术,可以创建出高效、安全且体积小的Docker镜像,为容器化应用奠定坚实基础。