文章目录
Docker作为当今最流行的容器化技术,已经彻底改变了应用程序的部署和管理方式。然而,随着项目规模的扩大和容器数量的增加,手动管理容器变得越来越繁琐且容易出错。本文将介绍40个实用的自动化脚本,涵盖容器生命周期管理、资源监控、数据备份恢复、日志清理等各个方面,帮助开发者和运维人员提升效率,减少人为错误,构建更加健壮的Docker环境。
1. 自动化容器创建脚本
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. 批量启动所有容器
docker start $(docker ps -aq)
此脚本通过 docker ps -aq 获取所有容器ID(包括停止的),然后使用 docker start 批量启动,特别适合系统重启或维护后快速恢复服务。
3. 批量停止运行中容器#!/bin/bash
docker stop $(docker ps -q)
与启动脚本对应,docker ps -q 只列出运行中容器ID,docker stop 命令批量停止这些容器,适合需要快速关闭所有服务的场景。
4. 批量删除停止的容器
docker rm $(docker ps -aq -f "status=exited")
通过 docker ps -aq -f “status=exited” 过滤出已停止的容器,然后使用 docker rm 删除它们,释放系统资源。
5. 运行容器并在退出后自动清理
IMAGE_NAME=$1
docker run --rm $IMAGE_NAME
使用 –rm 参数可以在容器停止后自动删除,非常适合执行一次性任务的临时容器。
6. 自动重启关键容器
CONTAINER_NAME=$1
docker update --restart always $CONTAINER_NAME
通过 docker update –restart always 为关键容器配置重启策略,确保它们在意外停止后能自动恢复,增强服务可靠性。
7. 容器资源监控脚本
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. 监控所有容器资源使用
docker stats --all
更全面的监控方案,–all 参数包括停止的容器,提供系统整体资源消耗视图。
9. 检查所有容器日志
docker ps -q | xargs -I {} docker logs {}
通过管道和 xargs 将运行中容器ID传递给 docker logs 命令,实现多容器日志的统一查看。
10. 清理未使用资源脚本
docker system prune -f --volumes
docker system prune 是强大的清理工具,-f 跳过确认,–volumes 包括未使用的卷,定期运行可释放大量磁盘空间。
11. 删除悬空镜像
docker rmi $(docker images -q -f "dangling=true")
docker images -q -f “dangling=true” 列出无标签的悬空镜像,docker rmi 删除它们,避免占用存储空间。
12. 容器数据备份脚本
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. 容器文件系统完整备份
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
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网络管理脚本
NETWORK_NAME="custom_bridge"
docker network create $NETWORK_NAME
docker network connect $NETWORK_NAME my_container
使用 docker network create 创建自定义网络,docker network connect 将容器接入网络,适合构建隔离的微服务环境。
17. 列出所有容器暴露端口
docker ps --format '{{.ID}}: {{.Ports}}'
自定义格式输出容器ID和暴露端口,快速了解服务访问端点。
18. 更新运行中容器
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. 手动清理容器日志
find /var/lib/docker/containers/ -name "*.log" -exec stat {} \;
find /var/lib/docker/containers/ -name "*.log" -mtime +7 -exec rm -f {} \;
第一条命令查看日志文件大小和修改时间,第二条删除7天前的日志文件,有效释放空间。
20. 设置日志大小限制
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个,从根本上防止日志膨胀。
“人的一生会经历很多痛苦,但回头想想,都是传奇”。