Docker镜像管理:构建与优化
Docker镜像管理:构建与优化
镜像分层原理
Docker镜像采用分层(Layer)存储结构,每一层都是只读的。当容器运行时,会在镜像层之上添加一个可写层。
# 查看镜像分层
docker history nginx:latest
docker inspect nginx:latest | jq '.[0].RootFS.Layers'
Dockerfile详解
基本指令
# 基础镜像
FROM ubuntu:22.04
# 元数据标签
LABEL maintainer="devops@example.com"
LABEL version="1.0"
# 设置工作目录
WORKDIR /app
# 复制文件
COPY requirements.txt .
COPY . .
# 执行命令
RUN apt-get update && \
apt-get install -y python3 && \
rm -rf /var/lib/apt/lists/*
# 设置环境变量
ENV APP_ENV=production
# 暴露端口
EXPOSE 8080
# 启动命令
CMD ["python3", "app.py"]
镜像构建
# 基础构建
docker build -t myapp:1.0 .
# 不使用缓存构建
docker build --no-cache -t myapp:1.0 .
# 指定Dockerfile
docker build -f Dockerfile.prod -t myapp:1.0 .
# 构建时传入参数
docker build --build-arg VERSION=1.0 -t myapp:1.0 .
多阶段构建
多阶段构建可以显著减小最终镜像体积:
# 阶段1:构建
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .
# 阶段2:运行
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]
# 对比镜像大小
docker images myapp
# myapp 1.0 a1b2c3d4 10MB (多阶段构建)
# myapp 1.0 e5f6g7h8 800MB (单阶段构建)
镜像优化技巧
1. 使用小型基础镜像
# 不推荐
FROM ubuntu:22.04 # ~77MB
# 推荐
FROM alpine:latest # ~5MB
# 最小化
FROM scratch # 0MB
2. 减少层数
# 不推荐(多个RUN层)
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y git
RUN rm -rf /var/lib/apt/lists/*
# 推荐(合并为一个RUN层)
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
git && \
rm -rf /var/lib/apt/lists/*
3. 利用缓存
# 先复制依赖文件,再复制源代码
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile
COPY . .
镜像仓库管理
Docker Hub
# 登录
docker login
# 打标签
docker tag myapp:1.0 username/myapp:1.0
# 推送镜像
docker push username/myapp:1.0
# 拉取镜像
docker pull username/myapp:1.0
私有仓库
# 使用Harbor搭建私有仓库
# 安装Harbor
wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-offline-installer-v2.9.0.tgz
tar xzf harbor-offline-installer-v2.9.0.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml
# 修改harbor.yml配置
./install.sh
# 推送到私有仓库
docker tag myapp:1.0 harbor.example.com/myproject/myapp:1.0
docker push harbor.example.com/myproject/myapp:1.0
镜像扫描
# 使用Trivy扫描漏洞
trivy image nginx:latest
# 扫描并输出JSON
trivy image -f json -o result.json nginx:latest
# 仅显示高危漏洞
trivy image --severity HIGH,CRITICAL nginx:latest
镜像导出与导入
# 导出镜像为tar文件
docker save nginx:latest > nginx.tar
docker save nginx:latest | gzip > nginx.tar.gz
# 导入镜像
docker load < nginx.tar
docker load -i nginx.tar.gz
镜像清理
# 删除悬空镜像
docker image prune
# 删除所有无用镜像
docker image prune -a
# 清理构建缓存
docker builder prune
# 一键清理
docker system prune -a --volumes
实践:构建生产级镜像
# 1. 使用多阶段构建
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
FROM node:18-alpine
RUN addgroup -g 1001 -S appgroup && \
adduser -S appuser -u 1001
WORKDIR /app
COPY --from=builder --chown=appuser:appgroup /app/dist ./dist
COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules
COPY --from=builder --chown=appuser:appgroup /app/package.json .
USER appuser
EXPOSE 3000
CMD ["node", "dist/index.js"]
总结
镜像优化是容器化运维的重要技能。通过多阶段构建、层优化和安全扫描,可以构建出安全、高效、体积小的生产级镜像。