备份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. 删除未使用的镜像

如果你想删除所有未使用的镜像(即悬挂镜像),可以使用以下命令:

docker image prune

 

这将删除所有未被容器使用的镜像。如果你想删除所有未使用的镜像(包括 dangling 和已停止的容器),可以加上 -a 参数:

docker image prune -a

 

2. 删除特定镜像

如果你想删除特定的镜像,可以先通过 docker images 列出所有镜像,然后用 docker rmi 删除:

docker images # 列出所有镜像 docker rmi <IMAGE_ID> # 删除指定镜像

 

3. 删除所有镜像

如果你想删除所有的镜像(请谨慎操作),可以使用以下命令:

docker rmi $(docker images -q)

 

4. 删除所有未使用的对象(镜像、容器、网络等)

如果你希望删除所有未使用的镜像、容器、网络等,可以使用 docker system prune 命令:

docker system prune

 

如果你还想删除已停止的容器、未使用的网络等,可以加上 -a 参数:

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 "所有容器恢复操作完成。"

 

posted @ 2024-08-17 23:04  狂奔的狼  阅读(65)  评论(0编辑  收藏  举报