1. 项目概述:为什么你需要掌握自定义 Docker 镜像?
如果你用过 Docker,大概率是从 Docker Hub 上拉一个现成的镜像,比如 nginx:latest 或者 ubuntu:20.04 。这很方便,但就像总吃外卖,偶尔也想自己下厨,根据口味调整配方。自定义 Docker 镜像就是这个“下厨”的过程。它不仅仅是把代码和依赖打包那么简单,更是将你的应用运行环境标准化、可复现、可移植的核心技能。无论是为了优化镜像体积、加速构建速度,还是为了在 CI/CD 流水线中实现一致性的部署,编写一个高效的 Dockerfile 都是现代开发者和运维工程师的必修课。很多人觉得这很复杂,其实不然,核心逻辑清晰明了。接下来,我会带你用 10 分钟理解其精髓,再用更深入的拆解让你能真正上手,写出专业级的 Dockerfile。
2. Dockerfile 核心语法与指令全解
Dockerfile 是一个文本文件,包含了一系列的指令(Instruction),每一条指令都会在构建镜像时创建一个新的层(Layer)。理解每条指令的用途和最佳实践,是写好 Dockerfile 的关键。
2.1 基础指令:构建镜像的基石
FROM:一切的开端 这是 Dockerfile 的第一条有效指令(除了 ARG),用于指定基础镜像。它决定了你的镜像的起点。
FROM ubuntu:22.04
注意 :强烈建议使用带有明确版本标签的镜像,如
ubuntu:22.04而非ubuntu:latest。这能确保构建的可重复性,避免因基础镜像的意外更新导致构建失败或运行时行为不一致。
RUN:执行命令 用于在镜像构建过程中执行命令,通常是安装软件包、创建目录等。每一条 RUN 指令都会创建一个新的镜像层。
RUN apt-get update && apt-get install -y \
curl \
nginx \
&& rm -rf /var/lib/apt/lists/*
实操心得 :将多个命令用
&&连接并在同一行执行,并用\换行保持可读性。这样做可以减少镜像层数(虽然层数在现代 Docker 中影响已减小,但仍是好习惯),并且清理 apt 缓存(rm -rf /var/lib/apt/lists/*)可以显著减小最终镜像的体积。
COPY 与 ADD:添加文件 两者都用于将构建上下文(Context)中的文件或目录复制到镜像中。
-
COPY <源路径> <目标路径>:功能纯粹,仅用于复制本地文件。 -
ADD <源路径> <目标路径>:在COPY基础上增加了两个功能:1) 解压本地 tar 归档文件;2) 从 URL 下载文件(但不推荐,因为无法在构建时清理下载的文件)。
最佳实践是优先使用 COPY ,除非你明确需要 ADD 的自动解压功能。
# 推荐
COPY ./app /usr/src/app
COPY requirements.txt /tmp/
# 特定场景使用 ADD
ADD application.tar.gz /opt/
WORKDIR:设置工作目录 设置后续指令(如 RUN , CMD , COPY , ENTRYPOINT )的工作目录。如果目录不存在,Docker 会自动创建它。使用绝对路径。
WORKDIR /app
COPY . . # 此时复制的是构建上下文的内容到 /app 目录下
这比使用 RUN cd /app && ... 更清晰、更可靠。
2.2 配置指令:定义容器行为
ENV:设置环境变量 设置的环境变量在构建阶段和容器运行时都可用。这对于配置应用程序行为非常有用。
ENV NODE_ENV=production
ENV APP_PORT=8080
ARG:构建时变量 定义仅在 Dockerfile 构建过程中有效的变量。可以通过 docker build --build-arg <varname>=<value> 从外部传入。它不会持久化到镜像中或容器运行时。
ARG VERSION=latest
FROM alpine:$VERSION
常用于动态指定软件版本。
EXPOSE:声明端口 这是一个文档性质的指令,用于声明容器运行时监听的网络端口。它并不会自动发布端口,实际端口映射需要在


2739

被折叠的 条评论
为什么被折叠?



