← 返回目录

基本概念

  • Docker 最早是 dotcloud 公司出品的容器管理工具,后来公司也改名为 Docker。
  • Dockerfile 是 Docker 镜像的描述文件,可以理解成火箭发射的 A、B、C、D 步骤清单。
  • Docker 镜像通过 Dockerfile 构建,包含操作系统基础文件和软件运行环境,采用分层存储。
  • 容器是运行起来的镜像:镜像相当于程序,容器相当于进程。

核心构建指令

指令说明示例
FROM指定基础镜像,必须是第一条指令FROM ubuntu:20.04
WORKDIR设置工作目录,后续操作在此进行WORKDIR /app
COPY复制文件或目录到镜像中COPY . /app
ADD复制文件、URL 或压缩包,压缩包会自动解压ADD app.tar.gz /app
RUN在构建阶段执行命令RUN apt-get update
CMD容器启动时的默认命令,可被覆盖CMD ["python", "app.py"]
ENTRYPOINT容器入口点,不会被 docker run 的参数覆盖ENTRYPOINT ["python", "app.py"]

网络和存储指令

指令说明示例
EXPOSE声明容器监听的端口EXPOSE 8080
VOLUME创建挂载点VOLUME ["/data"]

环境配置指令

指令说明示例
ENV设置环境变量,构建与运行时都可见ENV NODE_ENV=production
ARG定义构建时变量,构建结束后失效ARG VERSION=1.0

元数据与高级指令

指令说明示例
LABEL添加镜像元数据LABEL version="1.0"
ONBUILD当镜像作为基础镜像时触发的指令ONBUILD COPY . /app
HEALTHCHECK定义容器健康检查HEALTHCHECK CMD curl -f http://localhost/ || exit 1
SHELL指定默认 ShellSHELL ["/bin/bash", "-c"]

CMD 与 ENTRYPOINT 的区别

  • CMD 提供默认参数,docker run 后面追加的命令会替换它。
  • ENTRYPOINT 定义固定入口,docker run 后面的参数会作为参数追加给它。
  • 两者常配合使用:ENTRYPOINT 指定可执行文件,CMD 提供默认参数。

一个多阶段构建示例

FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

多阶段构建能把编译工具链留在构建阶段,最终镜像只保留运行时产物,体积通常能缩小一个数量级。