备份docker
一、备份步骤:
1、停止容器
sudo docker stop a9b763ee82a2
2、导出容器的文件系统
sudo docker export -o arl_web.tar a9b763ee82a2
3、获取镜像 ID
sudo docker images
4、导出 Docker 镜像
sudo docker save -o tophant_arl_v2.6.2.tar tophant/arl:v2.6.2
5、传输文件到新机器
scp arl_web.tar user@new_machine:/path/to/destination
scp tophant_arl_v2.6.2.tar user@new_machine:/path/to/destination
6、 导入 Docker 镜像
sudo docker load -i tophant_arl_v2.6.2.tar
7、 导入 Docker 容器
sudo docker import arl_web.tar new_arl_web_image
8、新镜像运行容器
sudo docker run -d --name new_arl_web new_arl_web_image
9、启动并验证容器
sudo docker ps
二、实验
1、备份images
└─$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nemo v2 9c06d79c7077 3 months ago 1.62GB
tophant/arl latest 826db31cea99 4 months ago 1.19GB
tophant/arl v2.6.2 826db31cea99 4 months ago 1.19GB
ubuntu 22.04 437ec753bef3 4 months ago 77.9MB
rabbitmq 3-management-alpine f4827796695c 5 months ago 180MB
rabbitmq 3.13.1-management-alpine f4827796695c 5 months ago 180MB
mysql 5.7 5107333e08a8 8 months ago 501MB
mongo 4.0.27 e305b5d51c0a 2 years ago 430MB
┌──(kali㉿kali)-[~/ARL_BACK]
└─$ sudo docker save -o ubuntu_22.04.tar ubuntu/22.04
Error response from daemon: No such image: ubuntu/22.04
┌──(kali㉿kali)-[~/ARL_BACK]
└─$ sudo docker save -o ubuntu_22.04.tar ubuntu:22.04
┌──(kali㉿kali)-[~/ARL_BACK]
└─$ sudo docker save -o rabbitmq_3-management-alpine.tar rabbitmq:3-management-alpine
┌──(kali㉿kali)-[~/ARL_BACK]
└─$ sudo docker save -o rabbitmq_3.13.1-management-alpine.tar rabbitmq:3.13.1-management-alpine
┌──(kali㉿kali)-[~/ARL_BACK]
└─$ sudo docker save -o mysql_5.7.tar mysql:5.7
┌──(kali㉿kali)-[~/ARL_BACK]
└─$ sudo docker save -o mongo_4.0.27.tar mongo:4.0.27
2、备份docker 容器
└─$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
caacf6e8fce1 rabbitmq:3.13.1-management-alpine "docker-entrypoint.s…" 3 months ago Up 41 minutes 4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 15691-15692/tcp, 25672/tcp arl_rabbitmq
979ff66176fa mongo:4.0.27 "docker-entrypoint.s…" 3 months ago Up 41 minutes 27017/tcp arl_mongodb
d4480e41f1b2 mysql:5.7 "docker-entrypoint.s…" 3 months ago Up 41 minutes 3306/tcp, 33060/tcp mysql
┌──(kali㉿kali)-[~/ARL_BACK]
└─$ sudo docker stop caacf6e8fce1
caacf6e8fce1
┌──(kali㉿kali)-[~/ARL_BACK]
└─$ sudo docker export -o arl_rabbitmq_containner.tar caacf6e8fce1
┌──(kali㉿kali)-[~/ARL_BACK]
└─$ sudo docker stop 979ff66176fa
979ff66176fa
┌──(kali㉿kali)-[~/ARL_BACK]
└─$ sudo docker export -o arl_mongodb_containner.tar 979ff66176fa
┌──(kali㉿kali)-[~/ARL_BACK]
└─$ sudo docker stop d4480e41f1b2
d4480e41f1b2
┌──(kali㉿kali)-[~/ARL_BACK]
└─$ sudo docker export -o arl_mysql_containner.tar d4480e41f1b2
三、自动化备份
#!/bin/bash # 获取所有镜像的列表 images=$(docker images --format "{{.Repository}}:{{.Tag}}") # 创建备份目录 backup_dir="docker_images_backup" mkdir -p "$backup_dir" # 遍历所有镜像并保存到备份目录 for image in $images; do echo "Backing up $image" # 使用日期时间作为文件名的一部分,以避免重复 timestamp=$(date +"%Y%m%d_%H%M%S") backup_file="$backup_dir/$(echo $image | sed 's/:/-/g')_$timestamp.tar" docker save -o "$backup_file" "$image" done echo "Backup completed. All images are saved in the $backup_dir directory."
docker其他命令
1. 删除未使用的镜像
如果你想删除所有未使用的镜像(即悬挂镜像),可以使用以下命令:
这将删除所有未被容器使用的镜像。如果你想删除所有未使用的镜像(包括 dangling 和已停止的容器),可以加上 -a
参数:
2. 删除特定镜像
如果你想删除特定的镜像,可以先通过 docker images
列出所有镜像,然后用 docker rmi
删除:
3. 删除所有镜像
如果你想删除所有的镜像(请谨慎操作),可以使用以下命令:
4. 删除所有未使用的对象(镜像、容器、网络等)
如果你希望删除所有未使用的镜像、容器、网络等,可以使用 docker system prune
命令:
如果你还想删除已停止的容器、未使用的网络等,可以加上 -a
参数:
这些命令会帮助你清理不再使用的缓存镜像和其他 Docker 资源。
自动化备份正在运行的docker容器:
#!/bin/bash
# 设置备份目录
BACKUP_DIR="./backup" # 替换为你希望存储备份文件的目录
# 创建备份目录(如果不存在)
mkdir -p "$BACKUP_DIR"
# 获取所有正在运行的容器的镜像 ID
containers=$(docker ps --format '{{.Image}}' | sort | uniq)
# 获取当前日期,以便命名备份文件
DATE=$(date +"%Y%m%d_%H%M%S")
# 循环处理每个容器镜像
for image in $containers; do
# 构造备份文件名
BACKUP_FILE="$BACKUP_DIR/${image//[:\/]/_}_backup_${DATE}.tar"
# 输出当前备份操作
echo "正在备份镜像: $image 到 $BACKUP_FILE..."
# 使用 docker save 命令创建镜像备份
docker save -o "$BACKUP_FILE" "$image"
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "备份成功: $BACKUP_FILE"
else
echo "备份失败: $image"
fi
done
# 提示完成
echo "所有备份完成。"
自动化还源备份的docker文件到docker容器:
#!/bin/bash # 设置备份目录 BACKUP_DIR="./backup" # 替换为实际存放备份文件的路径 # 设置容器配置 DOCKER_RUN_OPTIONS="-d --restart always" # 你可以自定义 docker run 的参数,例如端口映射、环境变量等 # 遍历备份目录,查找所有 tar 格式的镜像文件 for backup_file in "$BACKUP_DIR"/*.tar; do # 检查文件是否存在并且是 .tar 文件 if [ -f "$backup_file" ]; then echo "正在还原镜像:$backup_file" # 从 tar 文件中加载镜像 docker load -i "$backup_file" # 检查是否成功加载镜像 if [ $? -eq 0 ]; then # 获取镜像的名称(提取出镜像文件的名称) image_name=$(basename "$backup_file" .tar) echo "镜像加载成功: $image_name" # 获取原容器的名称,假设容器名称与镜像名称相同 # 如果你有原容器配置文件,可以通过它恢复容器名称 container_name="$image_name" echo "正在启动容器: $container_name..." # 重新创建并启动容器 docker run $DOCKER_RUN_OPTIONS --name "$container_name" "$image_name" if [ $? -eq 0 ]; then echo "容器启动成功: $container_name" else echo "容器启动失败: $container_name" fi else echo "镜像加载失败: $backup_file" fi else echo "找不到备份文件: $backup_file" fi done echo "所有容器恢复操作完成。"