← 返回首页
🔧

Docker镜像管理:构建与优化

📂 devops ⏱ 2 min 392 words

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"]

总结

镜像优化是容器化运维的重要技能。通过多阶段构建、层优化和安全扫描,可以构建出安全、高效、体积小的生产级镜像。