一、镜像操作命令大全

基础操作命令

# 查看镜像列表
docker images
docker image ls
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}"

# 搜索镜像
docker search ubuntu
docker search nginx --filter "is-official=true"

# 拉取镜像
docker pull ubuntu:20.04
docker pull nginx:latest
docker pull --platform linux/amd64 ubuntu  # 指定平台

# 查看镜像详情
docker image inspect ubuntu:20.04
docker image history nginx:latest

# 删除镜像
docker rmi ubuntu:20.04
docker image rm nginx:latest
docker rmi $(docker images -q)  # 删除所有镜像

标签管理

# 添加标签
docker tag ubuntu:20.04 my-ubuntu:v1
docker tag nginx:latest localhost:5000/my-nginx:prod

# 查看特定镜像
docker images ubuntu
docker images | grep -E "ubuntu|nginx"

构建镜像

# 从Dockerfile构建
docker build -t my-app:v1 .
docker build -t my-app:v1 -f Dockerfile.prod .

# 构建参数
docker build \
  --build-arg VERSION=1.0 \
  --no-cache \
  -t my-app:v1 .

# 多阶段构建
docker build -t my-app:multi-stage .

二、镜像导出导入示例

镜像导出到文件

# 导出单个镜像
docker save -o ubuntu-20.04.tar ubuntu:20.04
docker save ubuntu:20.04 > ubuntu.tar

# 导出多个镜像
docker save -o my-images.tar \
  ubuntu:20.04 \
  nginx:1.21 \
  redis:alpine

# 导出镜像到gzip压缩文件
docker save ubuntu:20.04 | gzip > ubuntu.tar.gz

从文件导入镜像

# 导入镜像
docker load -i ubuntu-20.04.tar
docker load < ubuntu.tar

# 导入压缩的镜像文件
gunzip -c ubuntu.tar.gz | docker load

导出导入容器为镜像

# 导出容器
docker export my-container > container.tar

# 从容器文件导入
cat container.tar | docker import - my-image:imported

# 带提交信息的导入
docker import container.tar --message "Imported from container" my-image:v1

镜像迁移示例

#!/bin/bash
# 镜像迁移脚本示例
SOURCE_IMAGE="my-app:production"
TAR_FILE="my-app-production.tar"
TARGET_REGISTRY="registry.company.com"

# 1. 保存镜像
echo "保存镜像到文件..."
docker save -o $TAR_FILE $SOURCE_IMAGE

# 2. 传输到目标机器(示例)
echo "传输文件..."
scp $TAR_FILE user@target-server:/tmp/

# 3. 在目标机器加载
ssh user@target-server "docker load -i /tmp/$TAR_FILE"

# 4. 重新打标并推送到私有仓库
ssh user@target-server "
  docker tag $SOURCE_IMAGE $TARGET_REGISTRY/$SOURCE_IMAGE
  docker push $TARGET_REGISTRY/$SOURCE_IMAGE
"

三、清理无用镜像技巧

查看磁盘使用情况

# 查看Docker磁盘使用
docker system df
docker system df -v

# 查看镜像大小排序
docker images --format "table {{.Size}}\t{{.Repository}}:{{.Tag}}" | sort -hr

清理悬空镜像

# 删除悬空镜像(无标签)
docker image prune
docker image prune -a  # 删除所有未被使用的镜像

# 强制删除,无需确认
docker image prune -f
docker system prune -f

# 删除指定时间前的悬空镜像
docker image prune --filter "until=24h"

清理特定镜像

# 删除指定名称模式的镜像
docker images | grep "none" | awk '{print $3}' | xargs docker rmi
docker images | grep "test-" | awk '{print $1":"$2}' | xargs docker rmi

# 删除指定时间之前的镜像
docker image prune -a --filter "until=2023-01-01T00:00:00"

批量清理脚本

#!/bin/bash
# 自动清理脚本

# 1. 停止所有容器
docker stop $(docker ps -aq)

# 2. 删除所有容器
docker rm $(docker ps -aq)

# 3. 删除所有悬空镜像
docker image prune -f

# 4. 删除所有未被使用的镜像
docker image prune -a -f

# 5. 清理构建缓存
docker builder prune -f

# 6. 清理卷
docker volume prune -f

# 7. 清理网络
docker network prune -f

# 8. 完整系统清理
docker system prune -a -f --volumes

按条件清理

# 删除超过100MB的镜像
docker images --format "{{.ID}} {{.Size}}" | \
  grep -E "[0-9]{3}MB|[0-9]GB" | \
  awk '{print $1}' | \
  xargs docker rmi

# 保留最近3个版本,删除旧版本
#!/bin/bash
IMAGE_NAME="my-app"
KEEP=3

# 获取镜像列表并按创建时间排序
docker images $IMAGE_NAME --format "{{.ID}} {{.CreatedAt}}" | \
  sort -rk2 | \
  awk -v keep=$KEEP 'NR > keep {print $1}' | \
  xargs -r docker rmi

定时自动清理

# 创建systemd定时服务
sudo tee /etc/systemd/system/docker-cleanup.service << EOF
[Unit]
Description=Docker Cleanup Service
After=docker.service

[Service]
Type=oneshot
ExecStart=/usr/bin/docker system prune -a -f --volumes
EOF

sudo tee /etc/systemd/system/docker-cleanup.timer << EOF
[Unit]
Description=Run docker cleanup weekly

[Timer]
OnCalendar=weekly
Persistent=true

[Install]
WantedBy=timers.target
EOF

# 启用定时任务
sudo systemctl enable docker-cleanup.timer
sudo systemctl start docker-cleanup.timer

最佳实践建议

  1. 日常维护

    # 每日清理建议
    docker image prune -f
    docker container prune -f
    
    # 每周深度清理
    docker system prune -a -f
    
  2. 构建优化

    # 使用多阶段构建减少镜像大小
    # 使用.dockerignore排除不必要的文件
    # 合并RUN命令减少镜像层
    
  3. 镜像管理策略

    • 使用标签规范(如:v1.0.0, latest, stable)
    • 定期扫描镜像安全漏洞
    • 使用私有镜像仓库管理企业镜像
  4. 监控告警

    # 监控Docker磁盘使用
    THRESHOLD=80
    USAGE=$(docker system df --format '{{.Percent}}' | tr -d '%' | head -1)
    
    if [ $USAGE -gt $THRESHOLD ]; then
      echo "警告: Docker磁盘使用率 ${USAGE}%"
      docker system prune -a -f
    fi
    

这些技巧可以帮助您有效地管理Docker镜像,保持系统清洁并优化存储空间使用。

更多推荐