Docker?40個實用的自動化管理腳本
前言
Docker作為當今最流行的容器化技術,已經徹底改變了應用程序的部署和管理方式。然而,隨著項目規(guī)模的擴大和容器數量的增加,手動管理容器變得越來越繁瑣且容易出錯。本文將介紹40個實用的自動化腳本,涵蓋容器生命周期管理、資源監(jiān)控、數據備份恢復、日志清理等各個方面,幫助開發(fā)者和運維人員提升效率,減少人為錯誤,構建更加健壯的Docker環(huán)境。
1. 自動化容器創(chuàng)建腳本
#!/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
腳本通過預定義配置自動創(chuàng)建容器,使用 -d 參數以分離模式運行,–name 指定容器名稱,-p 映射端口,-e 設置環(huán)境變量。只需修改頂部變量即可快速創(chuàng)建不同配置的容器。
2. 批量啟動所有容器
#!/bin/bash docker start $(docker ps -aq)
此腳本通過 docker ps -aq 獲取所有容器ID(包括停止的),然后使用 docker start 批量啟動,特別適合系統(tǒng)重啟或維護后快速恢復服務。
3. 批量停止運行中容器
#!/bin/bash docker stop $(docker ps -q)
與啟動腳本對應,docker ps -q 只列出運行中容器ID,docker stop 命令批量停止這些容器,適合需要快速關閉所有服務的場景。
4. 批量刪除停止的容器
#!/bin/bash docker rm $(docker ps -aq -f "status=exited")
通過 docker ps -aq -f “status=exited” 過濾出已停止的容器,然后使用 docker rm 刪除它們,釋放系統(tǒng)資源。
5. 運行容器并在退出后自動清理
#!/bin/bash IMAGE_NAME=$1 docker run --rm $IMAGE_NAME
使用 –rm 參數可以在容器停止后自動刪除,非常適合執(zhí)行一次性任務的臨時容器。
6. 自動重啟關鍵容器
#!/bin/bash CONTAINER_NAME=$1 docker update --restart always $CONTAINER_NAME
通過 docker update –restart always 為關鍵容器配置重啟策略,確保它們在意外停止后能自動恢復,增強服務可靠性。
7. 容器資源監(jiān)控腳本
#!/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. 監(jiān)控所有容器資源使用
#!/bin/bash docker stats --all
更全面的監(jiān)控方案,–all 參數包括停止的容器,提供系統(tǒng)整體資源消耗視圖。
9. 檢查所有容器日志
#!/bin/bash
docker ps -q | xargs -I {} docker logs {}通過管道和 xargs 將運行中容器ID傳遞給 docker logs 命令,實現多容器日志的統(tǒng)一查看。
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定時執(zhí)行,如 0 2 * * * /path/to/backup_script.sh 實現每日自動備份。
13. 容器文件系統(tǒng)完整備份
#!/bin/bash
CONTAINER_ID=$1
BACKUP_FILE="${CONTAINER_ID}_backup_$(date +%F).tar"
docker export $CONTAINER_ID > $BACKUP_FILEdocker export 導出整個容器文件系統(tǒng)到tar文件,比單純數據備份更完整。
14. 從備份恢復容器
#!/bin/bash BACKUP_FILE=$1 docker import $BACKUP_FILE restored_container:latest
與導出對應,docker import 從tar備份創(chuàng)建新鏡像,可用于啟動恢復后的容器。
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 創(chuàng)建自定義網絡,docker network connect 將容器接入網絡,適合構建隔離的微服務環(huán)境。
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 獲取容器鏡像名,拉取最新鏡像后重新創(chuàng)建容器,實現無縫更新。
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. 智能容器啟??刂颇_本
腳本通過參數化設計實現了對容器狀態(tài)的精確控制,可以根據傳入參數決定是啟動、停止還是重啟容器集群。相比簡單的批量操作,增加了狀態(tài)檢查邏輯,確保操作的安全性和可靠性。
#!/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
esac22. 條件式容器清理腳本
傳統(tǒng)的清理腳本往往一刀切地刪除所有停止的容器,而這個增強版腳本可以基于時間條件進行清理,保留最近使用過的容器。
#!/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 (創(chuàng)建于 $date)"
fi
done23. 容器健康狀態(tài)重啟腳本
腳本會定期檢查容器的健康狀態(tài),當檢測到容器異常時自動重啟,特別適合用于關鍵業(yè)務容器。
#!/bin/bash
CONTAINER_NAME=$1
# 獲取容器健康狀態(tài)
HEALTH=$(docker inspect --format='{{.State.Health.Status}}' $CONTAINER_NAME)
if [ "$HEALTH" != "healthy" ]; then
echo "$(date) - 容器 $CONTAINER_NAME 狀態(tài)異常 ($HEALTH),執(zhí)行重啟..."
docker restart $CONTAINER_NAME
fi24. 容器配置自動更新腳本
當容器配置發(fā)生變化時,腳本可以自動檢測并重新創(chuàng)建容器,確保配置及時生效。
#!/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 "檢測到配置變化,重新創(chuàng)建容器..."
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
fi25. 容器依賴關系啟動腳本
對于有啟動順序要求的容器組,腳本確保依賴容器先啟動,解決了復雜微服務架構中的啟動順序問題。
#!/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
done26. 智能鏡像垃圾回收腳本
腳本不僅刪除懸空鏡像,還能根據使用頻率和大小智能保留常用鏡像。
#!/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 (創(chuàng)建于 $time)"
fi
done27. 磁盤空間預警清理腳本
當Docker磁盤使用率達到閾值時,自動觸發(fā)清理操作,防止磁盤寫滿導致服務中斷。
#!/bin/bash
THRESHOLD=80
USAGE=$(df --output=pcent /var/lib/docker | tr -dc '0-9')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "Docker磁盤使用率已達 ${USAGE}%,執(zhí)行清理..."
docker system prune -af --volumes
fi28. 按策略保留備份腳本
在清理前自動備份重要容器數據,確保不會因清理操作導致數據丟失。
#!/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
# 執(zhí)行清理
docker system prune -af29. 資源使用限制檢查腳本
檢查容器資源限制配置,防止單個容器占用過多資源影響系統(tǒng)穩(wěn)定性。
#!/bin/bash
# 檢查沒有設置內存限制的容器
docker ps --format '{{.Names}}' | while read -r name; do
if [ -z "$(docker inspect --format='{{.HostConfig.Memory}}' $name)" ]; then
echo "警告: 容器 $name 沒有設置內存限制!"
fi
done30. 容器資源配額調整腳本
根據當前系統(tǒng)負載動態(tài)調整容器資源配額,實現資源的彈性分配。
#!/bin/bash
CONTAINER_NAME=$1
# 獲取系統(tǒng)可用內存
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_NAME31. 容器綜合監(jiān)控儀表腳本
腳本提供了一個簡潔的監(jiān)控面板,展示所有容器的關鍵指標,比單純的 docker stats 更直觀。
#!/bin/bash
echo "容器綜合監(jiān)控儀表板"
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"
done32. 異常日志實時報警腳本
監(jiān)控容器日志,當檢測到錯誤關鍵詞時立即觸發(fā)報警,支持多種報警方式。
#!/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
done33. 容器網絡連通性測試腳本
定期檢查容器間的網絡連通性,及時發(fā)現網絡分區(qū)等異常情況。
#!/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
done34. 容器資源閾值報警腳本
當容器資源使用超過閾值時發(fā)送報警,支持動態(tài)調整閾值。
#!/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
done35. 容器安全漏洞掃描腳本
定期檢查運行容器使用的鏡像是否存在已知漏洞,提升環(huán)境安全性。
#!/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
done36. 容器數據增量備份腳本
相比簡單的全量備份,這個腳本實現了增量備份策略,節(jié)省存儲空間。
#!/bin/bash
CONTAINER_NAME=$1
BACKUP_DIR="/backups/$CONTAINER_NAME"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# 創(chuàng)建備份目錄
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 -rf37. 容器數據庫自動轉儲腳本
針對數據庫容器的備份方案,支持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_CONTAINER39. 跨主機容器數據同步腳本
實現容器數據在多主機間的同步,支持災備和多活部署。
#!/bin/bash SOURCE_CONTAINER=$1 DEST_HOST=$2 DEST_CONTAINER=$3 # 創(chuàng)建數據快照并同步到遠程主機 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自動化管理腳本從基礎的啟停操作到高級的監(jiān)控報警,從簡單的資源清理到復雜的數據備份策略。通過合理部署、調度和維護這些自動化腳本,可以構建一個高效、可靠的Docker容器管理系統(tǒng),顯著提升開發(fā)運維效率,減少重復性手動操作、提高環(huán)境一致性,同時降低人為錯誤的風險。
總結
到此這篇關于Docker 40個實用的自動化管理腳本的文章就介紹到這了,更多相關Docker自動化管理腳本內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
docker配置skywalking 監(jiān)控springcloud應用的詳細步驟
本文分步驟給大家講解docker配置skywalking 監(jiān)控springcloud應用的方法,感興趣的朋友一起看看吧2025-04-04

