🔹 Windows 一键脚本(PowerShell)
Write-Host "=== Docker 镜像备份/恢复脚本 ==="
Write-Host "1) 保存所有镜像"
Write-Host "2) 恢复所有镜像"
$choice = Read-Host "请输入选项 (1 或 2)"
if ($choice -eq "1") {
$images = docker images --format "{{.Repository}}:{{.Tag}}"
foreach ($image in $images) {
if ($image -ne "<none>:<none>") {
$safeName = $image -replace "[/:]", "_"
$fileName = "$safeName.tar"
Write-Host "正在保存 $image 到 $fileName ..."
docker save -o $fileName $image
}
}
Write-Host "✅ 所有镜像已保存完成!"
}
elseif ($choice -eq "2") {
Get-ChildItem *.tar | ForEach-Object {
Write-Host "正在导入 $($_.Name) ..."
docker load -i $_.Name
}
Write-Host "✅ 所有镜像已导入完成!"
}
else {
Write-Host "❌ 输入无效,请输入 1 或 2"
}
保存成 docker-backup.ps1,右键 → 用 PowerShell 运行,在预存放镜像文件夹里运行。
🔹 Linux / Mac 一键脚本(Shell)
保存成 docker-backup.sh,然后赋予执行权限:
chmod +x docker-backup.sh
./docker-backup.sh
#!/bin/bash
echo "=== Docker 镜像备份/恢复脚本 ==="
echo "1) 保存所有镜像"
echo "2) 恢复所有镜像"
read -p "请输入选项 (1 或 2): " choice
if [ "$choice" == "1" ]; then
images=$(docker images --format "{{.Repository}}:{{.Tag}}")
for image in $images; do
if [[ "$image" != "<none>:<none>" ]]; then
safeName=$(echo $image | tr '/:' '_')
fileName="${safeName}.tar"
echo "正在保存 $image 到 $fileName ..."
docker save -o "$fileName" "$image"
fi
done
echo "✅ 所有镜像已保存完成!"
elif [ "$choice" == "2" ]; then
for file in *.tar; do
echo "正在导入 $file ..."
docker load -i "$file"
done
echo "✅ 所有镜像已导入完成!"
else
echo "❌ 输入无效,请输入 1 或 2"
fi
默认会把镜像保存成 .tar 文件,存放在 你运行脚本的当前目录。
📍 举个例子:
- 如果你在 Windows 上,进入
D:\backup\文件夹,然后运行docker-backup.ps1
→ 镜像会保存到D:\backup\下面。 - 如果你在 Linux / Mac 上,在
/home/user/docker-backup/文件夹执行
→ 镜像会保存到/home/user/docker-backup/目录下。
📦 文件名规则
脚本会把镜像名里的 / 和 : 替换成 _,比如:
nginx:latest→nginx_latest.tarmysql:8.0→mysql_8.0.tarmyrepo/app:v1.2→myrepo_app_v1.2.tar
