Skip to content

Docker 镜像管理

本文档详细介绍 Docker 镜像的构建、优化、管理和分发最佳实践。

🏗️ 镜像构建

基础构建

bash
# 基本构建命令
docker build -t myapp:latest .

# 指定 Dockerfile 路径
docker build -f docker/Dockerfile -t myapp:v1.0 .

# 指定构建上下文
docker build -t myapp https://github.com/user/repo.git#main

# 从标准输入构建
docker build -t myapp - < Dockerfile

构建参数

bash
# 传递构建参数
docker build --build-arg VERSION=1.0 --build-arg ENV=prod -t myapp .

# 设置标签
docker build -t myapp:latest -t myapp:v1.0 -t registry.com/myapp:latest .

# 设置目标阶段(多阶段构建)
docker build --target production -t myapp:prod .

构建优化

bash
# 使用缓存
docker build --cache-from myapp:latest -t myapp:new .

# 禁用缓存
docker build --no-cache -t myapp .

# 压缩镜像层
docker build --squash -t myapp .

# 设置内存限制
docker build --memory 2g -t myapp .

🔍 镜像分析

查看镜像信息

bash
# 列出镜像
docker images
docker image ls

# 查看镜像详细信息
docker inspect myapp:latest

# 查看镜像历史
docker history myapp:latest

# 查看镜像层
docker history --no-trunc myapp:latest

镜像大小分析

bash
# 查看镜像大小
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"

# 分析镜像层大小
docker history --format "table {{.CreatedBy}}\t{{.Size}}" myapp:latest

# 使用 dive 工具分析(需要安装)
dive myapp:latest

🏷️ 镜像标签管理

标签操作

bash
# 添加标签
docker tag myapp:latest myapp:v1.0
docker tag myapp:latest registry.com/myapp:latest

# 查看镜像标签
docker images myapp

# 删除标签
docker rmi myapp:v1.0

标签策略

bash
# 语义化版本标签
docker tag myapp:latest myapp:1.2.3
docker tag myapp:latest myapp:1.2
docker tag myapp:latest myapp:1

# 环境标签
docker tag myapp:latest myapp:dev
docker tag myapp:latest myapp:staging
docker tag myapp:latest myapp:prod

# Git 提交标签
docker tag myapp:latest myapp:$(git rev-parse --short HEAD)
docker tag myapp:latest myapp:$(git describe --tags)

📦 镜像仓库操作

推送镜像

bash
# 登录仓库
docker login registry.com

# 推送镜像
docker push registry.com/myapp:latest

# 推送所有标签
docker push --all-tags registry.com/myapp

# 推送到私有仓库
docker push localhost:5000/myapp:latest

拉取镜像

bash
# 拉取最新版本
docker pull nginx:latest

# 拉取指定版本
docker pull postgres:13.8

# 拉取所有标签
docker pull --all-tags alpine

# 从私有仓库拉取
docker pull registry.com/myapp:latest

🗂️ 镜像导入导出

导出镜像

bash
# 导出单个镜像
docker save -o myapp.tar myapp:latest

# 导出多个镜像
docker save -o images.tar myapp:latest nginx:alpine

# 压缩导出
docker save myapp:latest | gzip > myapp.tar.gz

导入镜像

bash
# 导入镜像
docker load -i myapp.tar

# 从压缩文件导入
gunzip -c myapp.tar.gz | docker load

# 从标准输入导入
cat myapp.tar | docker load

🧹 镜像清理

清理未使用镜像

bash
# 清理悬空镜像
docker image prune

# 清理所有未使用镜像
docker image prune -a

# 强制清理(不询问)
docker image prune -f

# 清理指定时间前的镜像
docker image prune --filter "until=24h"

批量删除镜像

bash
# 删除所有镜像
docker rmi $(docker images -q)

# 删除悬空镜像
docker rmi $(docker images -f "dangling=true" -q)

# 删除指定仓库的镜像
docker rmi $(docker images myapp -q)

# 删除指定模式的镜像
docker images | grep "^<none>" | awk '{print $3}' | xargs docker rmi

🔧 镜像优化技巧

减小镜像大小

dockerfile
# 1. 使用轻量级基础镜像
FROM alpine:latest
FROM node:16-alpine
FROM python:3.9-slim

# 2. 多阶段构建
FROM node:16 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

# 3. 合并 RUN 指令
RUN apt-get update && \
    apt-get install -y package1 package2 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 4. 使用 .dockerignore
# .dockerignore 文件内容
node_modules
.git
*.md
.env

缓存优化

dockerfile
# 先复制依赖文件
COPY package*.json ./
RUN npm install

# 再复制源代码
COPY . .

安全优化

dockerfile
# 使用非 root 用户
RUN adduser -D -s /bin/sh appuser
USER appuser

# 使用特定版本
FROM node:16.14.2-alpine

# 扫描漏洞
RUN apk add --no-cache --update && \
    apk upgrade

📊 镜像监控

镜像扫描

bash
# 使用 Docker Scout(Docker Desktop)
docker scout cves myapp:latest

# 使用 Trivy 扫描
trivy image myapp:latest

# 使用 Clair 扫描
clairctl analyze myapp:latest

镜像签名

bash
# 启用 Docker Content Trust
export DOCKER_CONTENT_TRUST=1

# 推送签名镜像
docker push myapp:latest

# 验证镜像签名
docker trust inspect myapp:latest

🔄 镜像版本管理

版本策略

bash
# 基于 Git 标签
VERSION=$(git describe --tags --always)
docker build -t myapp:$VERSION .

# 基于时间戳
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
docker build -t myapp:$TIMESTAMP .

# 基于构建号
BUILD_NUMBER=${CI_BUILD_NUMBER:-local}
docker build -t myapp:build-$BUILD_NUMBER .

自动化构建

yaml
# GitHub Actions 示例
name: Build and Push
on:
  push:
    tags: ['v*']

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Build image
        run: |
          docker build -t myapp:${GITHUB_REF#refs/tags/} .
          docker push myapp:${GITHUB_REF#refs/tags/}

🛠️ 实用工具

镜像分析工具

bash
# dive - 分析镜像层
dive myapp:latest

# docker-slim - 优化镜像
docker-slim build --target myapp:latest --tag myapp:slim

# hadolint - Dockerfile 检查
hadolint Dockerfile

镜像管理脚本

bash
#!/bin/bash
# cleanup-images.sh - 清理旧镜像

# 保留最新的 5 个版本
docker images myapp --format "{{.Tag}}" | \
  sort -V | \
  head -n -5 | \
  xargs -I {} docker rmi myapp:{}

通过这些镜像管理技巧,您可以更好地控制 Docker 镜像的生命周期,提高开发和部署效率。