Docker打包至云服务器
1.导出Docker镜像
预先拉取 busybox
镜像:busybox
镜像用于在容器内运行 tar
命令,将数据卷内容打包成一个归档文件并保存到主机上的备份目录中。这是因为我们需要一个轻量级的 Linux 环境来执行这些操作,而 busybox
非常适合这个用途。
docker pull busybox
创建export_all.sh 文件
#!/bin/bash
# 获取当前日期时间作为备份文件夹名称的一部分
backup_dir="docker_backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p $backup_dir
# 导出所有Docker镜像
echo "Exporting Docker images..."
docker images --format "{{.Repository}}:{{.Tag}}" | while read -r image; do
if [[ -n "$image" && "$image" != "<none>:<none>" ]]; then
echo "Saving image $image..."
tar_file="${backup_dir}/$(echo $image | sed 's/[\/:]/_/g').tar"
docker save -o "$tar_file" "$image"
fi
done
# 导出所有Docker容器数据卷
echo "Exporting Docker container volumes..."
docker ps -a --format "{{.Names}}" | while read -r container; do
if [[ -n "$container" ]]; then
echo "Saving volumes for container $container..."
tar_file="${backup_dir}/${container}_volumes.tar"
docker run --rm --volumes-from $container -v $(pwd)/$backup_dir:/backup busybox tar cvf /backup/$(basename $tar_file) /
fi
done
echo "Backup process completed. All files are saved in the $backup_dir directory."
运行:export_all.sh 脚本
sh export_all.sh
会得到 docker_backup_20240615_220510 文件【里面就是.tar和数据卷文件了】
2.在云服务器中安装yum和docker环境
这个就不多加赘述了网上的教程很多,建议也使用脚本安装【算了,还是加上吧】
centos yum 安装
一样的创建.sh为后缀的文件,sh xxx.sh执行 就好了
安装yum 和 切换 镜像
出问题了【Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist】就参考问题解决:Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist:…-腾讯云开发者社区-腾讯云 (tencent.com)
#!/bin/bash
# 更新系统
sudo yum update -y
# 安装yum工具
sudo yum install -y yum-utils
# 安装EPEL存储库
sudo yum install -y epel-release
# 清除缓存
sudo yum clean all
echo "Yum安装完成!"
#!/bin/bash
# 备份原有的Yum源配置文件
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
# 下载阿里云Yum源配置文件
sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清除缓存
sudo yum clean all
echo "Yum源已切换为阿里云!"
CentOS Docker 安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
或者
yum -y install docker
3.整体恢复脚本示例
先上传文件至云服务器上
创建文件:restore_all.sh
修改:backup_dir=“docker_backup_YYYYMMDD_HHMMSS” 为自己的文件名
#!/bin/bash
BACKUP_DIR="docker_backup_20240615_220510"
IMAGE_PATTERN="$BACKUP_DIR/*.tar"
VOLUME_PATTERN="$BACKUP_DIR/volumes/*.tar"
echo "Loading image from $IMAGE_PATTERN..."
# 加载 Docker 镜像
for tar_file in $IMAGE_PATTERN; do
if [ -f "$tar_file" ];then
docker load -i "$tar_file"
else
echo "Image file not found: $tar_file"
exit 1
fi
done
echo "Restoring volumes for containers..."
# 获取所有要恢复的卷
for volume_tar in $VOLUME_PATTERN; do
if [ -f "$volume_tar" ]; then
container_name=$(basename "$volume_tar" .tar)
volume_name="restore_${container_name}"
echo "Restoring volume for container $container_name..."
# 创建 Docker 卷
docker volume create $volume_name
# 创建一个临时容器来导入数据卷
docker run --rm -v $volume_name:/volume -v $(pwd)/$volume_tar:/backup/$container_name.tar busybox sh -c "cd /volume && tar xf /backup/$container_name.tar"
echo "Volume restored for container $container_name"
else
echo "Volume tar file not found: $volume_tar"
exit 1
fi
done
echo "Restore process completed!"
.将数据卷都放在volumes中
执行脚本