SorryToPerson logo
返回
Docker2026-04-15·8 分钟

Docker 镜像构建与标签管理

介绍 Docker 镜像的构建、标签、缓存、推送与清理实战方法。

Docker 镜像构建与标签管理

1. 选择基础镜像

  • 优先选择官方镜像或经过认证的小体积基础镜像。
  • alpinedistrolessslim 常用于减小镜像体积。
dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . ./
CMD ["node", "server.js"]

2. 使用标签管理版本

bash
docker build -t myapp:1.0.0 .
docker build -t myapp:latest .
  • latest 适合默认镜像引用;生产环境应使用语义化版本号。
  • docker images 列出已有镜像。

3. 构建缓存优化

  • 将不常变化的层放在 Dockerfile 前部。
  • 使用 COPY package*.json ./ + RUN npm install,避免每次复制源代码后重新安装依赖。
dockerfile
COPY package*.json ./
RUN npm ci --production
COPY . ./
  • 通过 --cache-from 在 CI 中复用镜像缓存:
bash
docker build --cache-from myapp:latest -t myapp:1.0.0 .

4. 构建参数与 secrets

  • 使用 --build-arg 传递构建时变量。
  • 敏感信息不要写入镜像,改用 Docker buildkit 或运行时注入。
bash
docker build --build-arg NODE_ENV=production -t myapp:1.0.0 .

5. 多阶段构建

  • 多阶段构建适合前端资源编译、Go/Java 等需要编译的应用。
dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . ./
RUN npm run build

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm ci --production
CMD ["node", "dist/index.js"]

6. 推送到远程仓库

bash
docker tag myapp:1.0.0 registry.example.com/myorg/myapp:1.0.0
docker push registry.example.com/myorg/myapp:1.0.0
  • 使用私有仓库时,先 docker login registry.example.com
  • 常用仓库:Docker Hub、GitHub Container Registry、Harbor、阿里云镜像服务。

7. 镜像清理与空间管理

bash
docker image prune -a
docker system prune -a
  • image prune -a 删除未被容器引用的镜像。
  • system prune -a 会删除未使用的容器、网络、镜像和构建缓存。

8. 常见问题

  • 构建失败:检查 Dockerfile 语法、文件路径、上下文内容。
  • 镜像过大:减少层、删除开发依赖、使用多阶段构建。
  • 运行出现 no such file or directory:确认 WORKDIRCOPY 目标路径和可执行文件存在。
Docker镜像构建