• 当前位置: 首 页 > 教育百科 > 学历/技能 > 正文

    Docker 40个自动化管理脚本

    :2025年08月28日
    Nicholas与Pypi

    本文将介绍40个实用的自动化脚本,涵盖容器生命周期管理、资源监控、数据备份恢复、日志清理等各个方面,帮助开发者和运维人员提升效率,减少人为错误,构建更加健壮的Docker环境。

    djEvMnBWSVQzVlA0WkRtNl9ib1lhU2xiU09sUnF1YjBNTTYxZ0pfTUUtR0tCUC12RjU3M1BQellaV0xhNS1vaUYzSm5Mc3hOUFg2dEpXVHRLSjd3MTE5NzFfNl9ya2oxaXk1bVZqR01XNzhoSjQ9.jpg

    Docker作为当今最流行的容器化技术,已经彻底改变了应用程序的部署和管理方式。然而,随着项目规模的扩大和容器数量的增加,手动管理容器变得越来越繁琐且容易出错。本文将介绍40个实用的自动化脚本,涵盖容器生命周期管理、资源监控、数据备份恢复、日志清理等各个方面,帮助开发者和运维人员提升效率,减少人为错误,构建更加健壮的Docker环境。

    1. 自动化容器创建脚本

    #!/bin/bash

    IMAGE_NAME="nginx"CONTAINER_NAME="my_nginx"PORT_MAPPING="8080:80"ENV_VARS="ENV=production"

    docker run -d --name $CONTAINER_NAME -p $PORT_MAPPING -e $ENV_VARS $IMAGE_NAME

    脚本通过预定义配置自动创建容器,使用 -d 参数以分离模式运行,–name 指定容器名称,-p 映射端口,-e 设置环境变量。只需修改顶部变量即可快速创建不同配置的容器。

    2. 批量启动所有容器

    #!/bin/bash

    docker start $(docker ps -aq)

    此脚本通过 docker ps -aq 获取所有容器ID(包括停止的),然后使用 docker start 批量启动,特别适合系统重启或维护后快速恢复服务。

    3. 批量停止运行中容器

    #!/bin/bash

    docker stop $(docker ps -q)

    与启动脚本对应,docker ps -q 只列出运行中容器IDdocker stop 命令批量停止这些容器,适合需要快速关闭所有服务的场景。

    4. 批量删除停止的容器

    #!/bin/bash

    docker rm $(docker ps -aq -f "status=exited")

    通过 docker ps -aq -f “status=exited” 过滤出已停止的容器,然后使用 docker rm 删除它们,释放系统资源。

    5. 运行容器并在退出后自动清理

    #!/bin/bash

    IMAGE_NAME=$1

    docker run --rm $IMAGE_NAME

    使用 –rm 参数可以在容器停止后自动删除,非常适合执行一次性任务的临时容器。

    6. 自动重启关键容器

    #!/bin/bash

    CONTAINER_NAME=$1

    docker update --restart always $CONTAINER_NAME

    通过 docker update –restart always 为关键容器配置重启策略,确保它们在意外停止后能自动恢复,增强服务可靠性。

    7. 容器资源监控脚本

    #!/bin/bash

    CONTAINER_NAME="my_app"

    echo "资源使用情况:"

    docker stats --no-stream $CONTAINER_NAME

    echo "日志:"

    docker logs --tail 50 $CONTAINER_NAME

    该脚本结合 docker stats –no-stream 获取容器实时资源使用情况,以及 docker logs –tail 查看最新日志,是故障排查的利器。

    8. 监控所有容器资源使用

    #!/bin/bash

    docker stats --all

    更全面的监控方案,–all 参数包括停止的容器,提供系统整体资源消耗视图。

    9. 检查所有容器日志

    #!/bin/bash

    docker ps -q | xargs -I {} docker logs {}

    通过管道和 xargs 将运行中容器ID传递给 docker logs 命令,实现多容器日志的统一查看。

    10. 清理未使用资源脚本

    #!/bin/bash

    docker system prune -f --volumes

    docker system prune 是强大的清理工具,-f 跳过确认,–volumes 包括未使用的卷,定期运行可释放大量磁盘空间。

    11. 删除悬空镜像

    #!/bin/bash

    docker rmi $(docker images -q -f "dangling=true")

    docker images -q -f “dangling=true” 列出无标签的悬空镜像,docker rmi 删除它们,避免占用存储空间。

    12. 容器数据备份脚本

    #!/bin/bash

    CONTAINER_NAME="my_app"

    BACKUP_DIR="/backup"

    TIMESTAMP=$(date +%F)

    docker cp $CONTAINER_NAME:/data $BACKUP_DIR/$CONTAINER_NAME-backup-$TIMESTAMP

    使用 docker cp 将容器内数据复制到主机备份目录,并添加时间戳便于管理。可通过cron定时执行,如 0 2 * * * /path/to/backup_script.sh 实现每日自动备份。

    13. 容器文件系统完整备份

    #!/bin/bash

    CONTAINER_ID=$1

    BACKUP_FILE="${CONTAINER_ID}_backup_$(date +%F).tar"

    docker export $CONTAINER_ID > $BACKUP_FILE

    docker export 导出整个容器文件系统到tar文件,比单纯数据备份更完整。

    14. 从备份恢复容器

    #!/bin/bash

    BACKUP_FILE=$1

    docker import $BACKUP_FILE restored_container:latest

    与导出对应,docker import tar备份创建新镜像,可用于启动恢复后的容器。

    15. 数据卷备份到S3

    #!/bin/bash

    BACKUP_PATH="/path/to/backup"

    S3_BUCKET="s3://your-bucket-name/docker-volumes/"

    MAX_BACKUPS=5

    mkdir -p "$BACKUP_PATH"

    docker run --rm -v "$BACKUP_PATH:/backup" alpine tar czf /backup/backup-$(date +%Y%m%d%H%M%S).tar.gz /var/lib/docker/volumes/

    aws s3 cp "/backup/backup-$(date +%Y%m%d%H%M%S).tar.gz" "$S3_BUCKET"

    find "$BACKUP_PATH" -type f -name 'backup-*' -mtime +$MAX_BACKUPS -exec rm {} \;

    脚本将数据卷打包压缩后上传到S3,并自动清理旧备份,实现了异地容灾。

    16. Docker网络管理脚本

    #!/bin/bash

    NETWORK_NAME="custom_bridge"

    docker network create $NETWORK_NAME

    docker network connect $NETWORK_NAME my_container

    使用 docker network create 创建自定义网络,docker network connect 将容器接入网络,适合构建隔离的微服务环境。

    17. 列出所有容器暴露端口

    #!/bin/bash

    docker ps --format '{{.ID}}: {{.Ports}}'

    自定义格式输出容器ID和暴露端口,快速了解服务访问端点。

    18. 更新运行中容器

    #!/bin/bash

    CONTAINER_NAME=$1

    IMAGE_NAME=$(docker inspect --format='{{.Config.Image}}' $CONTAINER_NAME)

    docker pull $IMAGE_NAME

    docker stop $CONTAINER_NAME

    docker rm $CONTAINER_NAME

    docker run -d --name $CONTAINER_NAME $IMAGE_NAME

    通过 docker inspect 获取容器镜像名,拉取最新镜像后重新创建容器,实现无缝更新。

    19. 手动清理容器日志

    #!/bin/bash

    find /var/lib/docker/containers/ -name "*.log" -exec stat {} \;

    find /var/lib/docker/containers/ -name "*.log" -mtime +7 -exec rm -f {} \;

    第一条命令查看日志文件大小和修改时间,第二条删除7天前的日志文件,有效释放空间。

    20. 设置日志大小限制

    #!/bin/bash

    cat > /etc/docker/daemon.json <<EOF

    {

     "log-driver": "json-file",

     "log-opts": {

      "max-size": "50m",

      "max-file": "3"

     }

    }

    EOF

    systemctl restart docker

    通过修改daemon.json配置文件,限制单个日志文件最大50MB,最多保留3个,从根本上防止日志膨胀。

    21. 智能容器启停控制脚本

    脚本通过参数化设计实现了对容器状态的精确控制,可以根据传入参数决定是启动、停止还是重启容器集群。相比简单的批量操作,增加了状态检查逻辑,确保操作的安全性和可靠性。

    #!/bin/bash

    # 参数: start|stop|restart

    ACTION=$1

    case $ACTION in

      start)

        echo "启动所有停止的容器..."

        docker start $(docker ps -aq --filter "status=exited")

        ;;

      stop)

        echo "停止所有运行中的容器..."

        docker stop $(docker ps -q)

        ;;

      restart)

        echo "重启所有容器..."

        docker restart $(docker ps -q)

        ;;

      *)

        echo "用法: $0 {start|stop|restart}"

        exit 1

    esac

    22. 条件式容器清理脚本

    传统的清理脚本往往一刀切地删除所有停止的容器,而这个增强版脚本可以基于时间条件进行清理,保留最近使用过的容器。

    #!/bin/bash

    # 清理超过7天未使用的停止容器

    docker ps -a --filter "status=exited" --format '{{.ID}} {{.CreatedAt}}' | while read -r id date; do

      if [[ $(date -d "$date" +%s) -lt $(date -d "7 days ago" +%s) ]]; then

        docker rm $id

        echo "已删除容器 $id (创建于 $date)"

      fi

    done

    23. 容器健康状态重启脚本

    脚本会定期检查容器的健康状态,当检测到容器异常时自动重启,特别适合用于关键业务容器。

    #!/bin/bash

    CONTAINER_NAME=$1

    # 获取容器健康状态

    HEALTH=$(docker inspect --format='{{.State.Health.Status}}' $CONTAINER_NAME)

    if [ "$HEALTH" != "healthy" ]; then

      echo "$(date) - 容器 $CONTAINER_NAME 状态异常 ($HEALTH),执行重启..."

      docker restart $CONTAINER_NAME

    fi

    24. 容器配置自动更新脚本

    当容器配置发生变化时,脚本可以自动检测并重新创建容器,确保配置及时生效。

    #!/bin/bash

    CONTAINER_NAME="my_app"

    CONFIG_FILE="/path/to/app.conf"

    CONFIG_HASH=$(md5sum $CONFIG_FILE | awk '{print $1}')

    # 检查配置是否变化

    if [ "$CONFIG_HASH" != "$(docker inspect --format='{{.Config.Labels.config_hash}}' $CONTAINER_NAME)" ]; then

      echo "检测到配置变化,重新创建容器..."

      docker stop $CONTAINER_NAME

      docker rm $CONTAINER_NAME

      docker run -d --name $CONTAINER_NAME --label config_hash=$CONFIG_HASH -v $CONFIG_FILE:/etc/app.conf my_app_image

    fi

    25. 容器依赖关系启动脚本

    对于有启动顺序要求的容器组,脚本确保依赖容器先启动,解决了复杂微服务架构中的启动顺序问题。

    #!/bin/bash

    # 定义容器启动顺序

    CONTAINERS=("db" "redis" "app" "nginx")

    for container in "${CONTAINERS[@]}"; do

      echo "启动容器 $container..."

      docker start $container

      # 等待容器健康检查通过

      while [ "$(docker inspect --format='{{.State.Health.Status}}' $container)" != "healthy" ]; do

        sleep 1

      done

    done

    26. 智能镜像垃圾回收脚本

    脚本不仅删除悬空镜像,还能根据使用频率和大小智能保留常用镜像。

    #!/bin/bash

    # 删除超过30天未被使用的悬空镜像

    docker images --filter "dangling=true" --format "{{.ID}} {{.CreatedSince}}" | while read -r id time; do

      if [[ $time == *"months"* ]] || [[ $time == *"weeks"* ]]; then

        docker rmi $id

        echo "已删除悬空镜像 $id (创建于 $time)"

      fi

    done

    27. 磁盘空间预警清理脚本

    Docker磁盘使用率达到阈值时,自动触发清理操作,防止磁盘写满导致服务中断。

    #!/bin/bash

    THRESHOLD=80

    USAGE=$(df --output=pcent /var/lib/docker | tr -dc '0-9')

    if [ "$USAGE" -gt "$THRESHOLD" ]; then

      echo "Docker磁盘使用率已达 ${USAGE}%,执行清理..."

      docker system prune -af --volumes

    fi

    28. 按策略保留备份脚本

    在清理前自动备份重要容器数据,确保不会因清理操作导致数据丢失。

    #!/bin/bash

    BACKUP_DIR="/docker_backups/$(date +%Y%m%d)"

    mkdir -p $BACKUP_DIR

    # 备份所有运行中容器的数据卷

    docker ps --format '{{.Names}}' | while read -r name; do

      docker inspect --format='{{range .Mounts}}{{.Destination}} {{end}}' $name | tr ' ' '\n' | while read -r vol; do

        [ -n "$vol" ] && docker cp $name:$vol $BACKUP_DIR/${name}_$(echo $vol | tr '/' '_')

      done

    done

    # 执行清理

    docker system prune -af

    29. 资源使用限制检查脚本

    检查容器资源限制配置,防止单个容器占用过多资源影响系统稳定性。

    #!/bin/bash

    # 检查没有设置内存限制的容器

    docker ps --format '{{.Names}}' | while read -r name; do

      if [ -z "$(docker inspect --format='{{.HostConfig.Memory}}' $name)" ]; then

        echo "警告: 容器 $name 没有设置内存限制!"

      fi

    done

    30. 容器资源配额调整脚本

    根据当前系统负载动态调整容器资源配额,实现资源的弹性分配。

    #!/bin/bash

    CONTAINER_NAME=$1

    # 获取系统可用内存

    AVAIL_MEM=$(free -m | awk '/Mem:/ {print $7}')

    # 分配可用内存的50%给容器

    MEM_LIMIT=$((AVAIL_MEM / 2))m

    echo "调整容器 $CONTAINER_NAME 内存限制为 $MEM_LIMIT"

    docker update --memory=$MEM_LIMIT --memory-swap=$MEM_LIMIT $CONTAINER_NAME

    31. 容器综合监控仪表脚本

    脚本提供了一个简洁的监控面板,展示所有容器的关键指标,比单纯的 docker stats 更直观。

    #!/bin/bash

    echo "容器综合监控仪表板"

    echo "===================="

    docker ps --format "{{.Names}}" | while read -r name; do

      CPU=$(docker stats --no-stream --format "{{.CPUPerc}}" $name)

      MEM=$(docker stats --no-stream --format "{{.MemPerc}}" $name)

      STATUS=$(docker inspect --format "{{.State.Status}}" $name)

      HEALTH=$(docker inspect --format "{{.State.Health.Status}}" $name 2>/dev/null || echo "N/A")

      printf "%-20s %-10s %-10s %-10s %-10s\n" "$name" "$STATUS" "$HEALTH" "$CPU" "$MEM"

    done

    32. 异常日志实时报警脚本

    监控容器日志,当检测到错误关键词时立即触发报警,支持多种报警方式。

    #!/bin/bash

    CONTAINER_NAME=$1

    KEYWORDS="error|fail|exception|timeout"

    docker logs --since 5m --follow $CONTAINER_NAME | while read -r line; do

      if echo "$line" | grep -qE "$KEYWORDS"; then

        echo "$(date) - 检测到异常日志: $line"

        # 这里可以集成邮件、钉钉、Slack等报警方式

      fi

    done

    33. 容器网络连通性测试脚本

    定期检查容器间的网络连通性,及时发现网络分区等异常情况。

    #!/bin/bash

    # 测试所有容器之间的网络连通性

    CONTAINERS=$(docker ps --format "{{.Names}}")

    for src in $CONTAINERS; do

      for dst in $CONTAINERS; do

        if [ "$src" != "$dst" ]; then

          if docker exec $src ping -c 1 $dst >/dev/null 2>&1; then

            echo "$src -> $dst: 连通"

          else

            echo "$src -> $dst: 不通"

          fi

        fi

      done

    done

    34. 容器资源阈值报警脚本

    当容器资源使用超过阈值时发送报警,支持动态调整阈值。

    #!/bin/bash

    CONTAINER_NAME=$1

    CPU_THRESHOLD=80

    MEM_THRESHOLD=80

    while true; do

      CPU=$(docker stats --no-stream --format "{{.CPUPerc}}" $CONTAINER_NAME | tr -d '%')

      MEM=$(docker stats --no-stream --format "{{.MemPerc}}" $CONTAINER_NAME | tr -d '%')

      if (( $(echo "$CPU > $CPU_THRESHOLD" | bc -l) )); then

        echo "$(date) - CPU使用率过高: ${CPU}%"

      fi

      if (( $(echo "$MEM > $MEM_THRESHOLD" | bc -l) )); then

        echo "$(date) - 内存使用率过高: ${MEM}%"

      fi

      sleep 60

    done

    35. 容器安全漏洞扫描脚本

    定期检查运行容器使用的镜像是否存在已知漏洞,提升环境安全性。

    #!/bin/bash

    # 检查所有运行中容器使用的镜像

    docker ps --format "{{.Image}} {{.Names}}" | while read -r image name; do

      echo "扫描容器 $name (使用镜像 $image)..."

      docker scan --file Dockerfile $image

      # 检查镜像更新时间

      CREATED=$(docker inspect --format '{{.Created}}' $image)

      if [[ $(date -d "$CREATED" +%s) -lt $(date -d "6 months ago" +%s) ]]; then

        echo "警告: 容器 $name 使用的镜像超过6个月未更新!"

      fi

    done

    36. 容器数据增量备份脚本

    相比简单的全量备份,这个脚本实现了增量备份策略,节省存储空间。

    #!/bin/bash

    CONTAINER_NAME=$1

    BACKUP_DIR="/backups/$CONTAINER_NAME"

    TIMESTAMP=$(date +%Y%m%d_%H%M%S)

    # 创建备份目录

    mkdir -p $BACKUP_DIR

    # 使用rsync实现增量备份

    docker exec $CONTAINER_NAME sh -c "tar cf - /data" | \

      rsync --archive --backup --backup-dir=$BACKUP_DIR/$TIMESTAMP - /backups/latest/

    # 保留最近7天的备份

    find $BACKUP_DIR -type d -mtime +7 | xargs rm -rf

    37. 容器数据库自动转储脚本

    针对数据库容器的备份方案,支持MySQL、PostgreSQL等常见数据库。

    #!/bin/bash

    DB_CONTAINER=$1

    DB_TYPE=$2 # mysql or postgres

    BACKUP_FILE="/backups/${DB_CONTAINER}_$(date +%Y%m%d).sql"

    case $DB_TYPE in

      mysql)

        docker exec $DB_CONTAINER sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > $BACKUP_FILE

        ;;

      postgres)

        docker exec $DB_CONTAINER sh -c 'pg_dumpall -U postgres' > $BACKUP_FILE

        ;;

      *)

        echo "不支持的数据库类型"

        exit 1

    esac

    echo "数据库备份完成: $BACKUP_FILE"

    38. 容器数据一致性检查脚本

    验证备份数据的完整性和一致性,确保备份可恢复。

    #!/bin/bash

    BACKUP_FILE=$1

    # 模拟恢复备份并检查关键文件

    TEMP_CONTAINER=$(docker run -d --rm busybox tail -f /dev/null)

    docker cp $BACKUP_FILE $TEMP_CONTAINER:/backup.tar

    docker exec $TEMP_CONTAINER tar xf /backup.tar

    # 检查关键文件是否存在

    CHECK_FILES=("etc/passwd" "etc/group" "data/app.conf")

    for file in "${CHECK_FILES[@]}"; do

      if docker exec $TEMP_CONTAINER [ -f "/$file" ]; then

        echo "检查通过: /$file 存在"

      else

        echo "警告: /$file 不存在!"

      fi

    done

    docker stop $TEMP_CONTAINER

    39. 跨主机容器数据同步脚本

    实现容器数据在多主机间的同步,支持灾备和多活部署。

    #!/bin/bash

    SOURCE_CONTAINER=$1

    DEST_HOST=$2

    DEST_CONTAINER=$3

    # 创建数据快照并同步到远程主机

    docker exec $SOURCE_CONTAINER tar cf - /data | ssh $DEST_HOST "docker exec -i $DEST_CONTAINER tar xf - -C /"

    echo "数据同步完成: $SOURCE_CONTAINER -> $DEST_HOST:$DEST_CONTAINER"

    40. 容器数据加密备份脚本

    在备份时自动加密敏感数据,确保数据安全。

    #!/bin/bash

    CONTAINER_NAME=$1

    BACKUP_FILE="/backups/${CONTAINER_NAME}_$(date +%Y%m%d).tar.gpg"

    ENCRYPT_KEY="your_encryption_key"

    # 备份并加密数据

    docker exec $CONTAINER_NAME tar cf - /data | \

      gpg --batch --yes --passphrase "$ENCRYPT_KEY" --symmetric --cipher-algo AES256 -o $BACKUP_FILE

    echo "加密备份完成: $BACKUP_FILE"

    自动化不是目标而是手段,本文介绍的Docker自动化管理脚本从基础的启停操作到高级的监控报警,从简单的资源清理到复杂的数据备份策略。通过合理部署、调度和维护这些自动化脚本,可以构建一个高效、可靠的Docker容器管理系统,显著提升开发运维效率,减少重复性手动操作提高环境一致性,同时降低人为错误的风险。

    原文来源:https://mp.weixin.qq.com/s/-KOWYHtSj43bfbDvyXOnXA?click_id=24

    [编辑:宋聪乔 &发表于江苏]
    [我要纠错]

    来源:本文内容搜集或转自各大网络平台,并已注明来源、出处,如果转载侵犯您的版权或非授权发布,请联系小编,我们会及时审核处理。
    声明:江苏教育黄页对文中观点保持中立,对所包含内容的准确性、可靠性或者完整性不提供任何明示或暗示的保证,不对文章观点负责,仅作分享之用,文章版权及插图属于原作者。

    关键词: Docker 作为 当今 行的 容器
    有价值
    0
    无价值
    0
    猜您喜欢
    最热文章

    暂不支持手机端,请登录电脑端访问

    正在加载验证码......

    请先完成验证