VMware虚拟机和Docker的备份与恢复

目录

[1. VMware虚拟机的快照备份](#1. VMware虚拟机的快照备份)

[1.1 VMware本机的快照备份](#1.1 VMware本机的快照备份)

[1.2 VMware快照备份到另一电脑](#1.2 VMware快照备份到另一电脑)

[2. Docker知识点](#2. Docker知识点)

[2.1 Docker镜像和容器的关系](#2.1 Docker镜像和容器的关系)

[2.2 Docker的存储卷](#2.2 Docker的存储卷)

[2.3 Docker命令简介](#2.3 Docker命令简介)

[2.4 删除Anylink镜像](#2.4 删除Anylink镜像)

[3. Docker备份和恢复](#3. Docker备份和恢复)

[3.1 确定要回滚的容器和版本](#3.1 确定要回滚的容器和版本)

[3.2 备份当前容器(可选)](#3.2 备份当前容器(可选))

[3.3 备份存储卷](#3.3 备份存储卷)

[3.4 停止并删除当前容器](#3.4 停止并删除当前容器)

[3.5 获取指定版本的镜像](#3.5 获取指定版本的镜像)

[3.6 运行指定版本的容器](#3.6 运行指定版本的容器)

[3.7 验证回滚和注意事项](#3.7 验证回滚和注意事项)


1. VMware虚拟机的快照备份

1.1 VMware本机的快照备份

VMware虚拟机的快照功能,应该能手动把所有东西都备份和恢复,包括Docker的镜像,如果是数据出问题,回滚到某个版本,应该手动把数据备份然后快照就行了,不过磁盘空间占用有点大。(虚拟机的备份与恢复也完成了Docker容器和存储卷的备份与恢复)

下面是步骤

将上面文件当成快照1保存,然后在此基础添加以下文件(圈出来的都是新加的,除了anylink镜像)

恢复到快照1

数据完全恢复到初始状态:

再恢复到快照2:

  • 创建快照:在VMware虚拟机安装或配置过程中,特别是在进行重要更改之前,应创建虚拟机的快照。这样,如果后续出现问题,可以从快照点快速恢复到之前的状态。
  • 恢复快照:在VMware vSphere Client或VMware Workstation中,找到虚拟机并选择"快照"选项。从快照列表中选择要恢复的点,然后点击"恢复到此状态"或类似选项。

注意:快照虽然方便,但过多或过旧的快照可能会占用大量磁盘空间并影响性能。因此,建议定期清理不再需要的快照。


1.2 VMware快照备份到另一电脑

VMware虚拟机快照保存位置应该就是保存在Windows电脑的磁盘上:

可以通过以下步骤把VMware快照备份到另一电脑

方法一:使用克隆功能(适用于VMware Workstation)

  1. 关闭虚拟机:首先,确保目标虚拟机已关闭。
  2. 克隆虚拟机:在VMware Workstation中,选中目标虚拟机,点击上方工具栏中的"虚拟机">"管理">"克隆"。
  3. 选择快照进行克隆:在克隆向导中,选择"现有快照(仅限关闭的虚拟机)",然后选择你想要克隆的快照。
  4. 设置克隆选项:选择克隆类型(链接克隆或完整克隆),并设置新虚拟机的名称和目标位置。
  5. 完成克隆:按照向导完成克隆过程。克隆完成后,你可以在另一台电脑上打开VMware Workstation,并导入克隆得到的虚拟机文件(.vmx文件)。

方法二:手动复制虚拟机文件(适用于VMware ESXi和Workstation)

  1. 关闭虚拟机:确保目标虚拟机已关闭。
  2. 访问数据存储:使用vSphere Web Client(对于ESXi)或Windows文件资源管理器(对于Workstation)访问虚拟机所在的数据存储。
  3. 复制虚拟机文件:找到虚拟机文件夹,复制其中的所有文件(包括快照文件)。
  4. 转移文件:将复制的文件转移到另一台电脑上的相应位置。
  5. 注册虚拟机:在另一台电脑上,使用vSphere Web Client(对于ESXi)或VMware Workstation(对于Workstation)注册新的虚拟机。选择复制过来的虚拟机文件夹中的.vmx文件进行注册。
  6. 恢复快照:注册完成后,打开虚拟机电源,并根据需要恢复特定的快照。

2. Docker知识点

2.1 Docker镜像和容器的关系

Docker镜像相当于C++/Java的"类",容器是"对象",是镜像的运行实体,是一个应用进程。如下图一个镜像可以启动多个容器,Docker daemon里放着存储卷,是存储在本机磁盘的。


2.2 Docker的存储卷

按照上面的类比(面向对象语言的"类和对象","镜像和容器很好理解",现在了解下"存储卷")

存储卷 就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录 建立绑定 关系(比如Anylink项目 conf 里的文件)。这就意味着,**在容器中的这个目录下写入数据时(如anylink网页操作就会往容器目录写数据),容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。**在宿主机上的这个与容器形成绑定关系的目录被称作存储卷。卷的本质是文件或者目录。

存储卷的特性:

  1. 可以绕过默认的联合文件系统,直接以文件或目录的形式存在于宿主机上。
  2. 宿主机的/data/web 目录与容器中的/container/data/web 目录绑定关系,然后容器中的 进程向这个目录中写数据时,是直接写在宿主机的目录上的,绕过容器文件系统与宿 主机的文件系统建立关联关系,使得可以在宿主机和容器内共享数据库内容,让容器直接访问宿主机中的内容,也可以宿主机向容器写入内容,容器和宿主机的数据读写是同步的。
  3. 容器销毁了,容器指定的存储卷不会销毁。

为什么需要存储卷?

  • 数据丢失问题, 容器按照业务类型,总体可以分为两类: ①无状态的 (数据不需要被持久化)②有状态的 (数据需要被持久化) 显然,容器更擅长无状态应用。因为未持久化数据的容器根目录的生命周期与容器的生命周期一样,容器文件系统的本质是在镜像层上面创建的读写层,运行中的容器对任何文件的修改都存在于该读写层,**当容器被删除时,容器中的读写层也会随之消失。 虽然容器希望所有的业务都尽量保持无状态,这样容器就可以开箱即用,并且可以任意调度,但实际业务总是有各种需要数据持久化的场景,**比如 MySQL、Kafka 等有状 态的业务。因此为了解决有状态业务的需求,Docker 提出了卷(Volume)的概念。
  • **性能问题,**UnionFS 对于修改删除等,一般效率非常低,如果对一于 I/O 要求比较高的应用,如 redis 在实现持化存储时,是在底层存储时的性能要求比较高。
  • **宿主机和容器互访不方便,**宿主机访问容器,或者容器访问要通过 docker cp 来完成,应用很难操作。
  • 容器和容器共享不方便。

存储卷的使用。

存储卷有三种,这里只介绍最常用的绑定卷。

-v 参数创建卷


2.3 Docker命令简介

docker 的常用命令:

bash 复制代码
#镜像命令
docker images:列出所有镜像
docker search [image]:搜索 Docker 镜像
docker pull [image]:拉取指定镜像
docker rmi [image]:删除指定镜像
#容器命令
docker ps:列出当前所有正在运行的容器
docker ps -a:列出所有容器,包括已经停止的容器
docker create [image]:创建一个新的容器,但不启动它
docker start [container]:启动一个容器
docker stop [container]:停止一个容器
docker rm [container]:删除一个容器
docker exec -it [container] [command]:在运行中的容器中执行命令
#其他命令
docker info:显示 Docker 系统信息
docker version:显示 Docker 版本信息
docker logs [container]:查看容器的日志
docker network ls:列出 Docker 网络
docker network create [network]:创建一个新的 Docker 网络
docker network connect [network] [container]:将容器连接到指定的 Docker 网络
docker network disconnect [network] [container]:将容器从指定的 Docker 网络中断开连接 

2.4 删除Anylink镜像

  1. 停止并删除使用该镜像的容器

    首先,你可以停止并删除正在使用这个镜像的容器。使用以下命令:

    |---|-----------------------------|
    | | docker stop 05d3701e38ad |
    | | docker rm 05d3701e38ad |

    然后,你可以尝试再次删除镜像:

    |---|-----------------------------|
    | | docker rmi bjdgyc/anylink |

    或者,如果你知道镜像的确切 ID 或部分名称,也可以使用:

    |---|---------------------------|
    | | docker rmi cfd0134cbd8a |

  2. 使用 --force-f 选项强制删除镜像

    如果你确定要删除镜像,即使它正在被使用,你也可以使用 --force-f 选项来强制删除。但请注意,这可能会导致使用该镜像的容器无法正常工作。

    |---|--------------------------------|
    | | docker rmi -f bjdgyc/anylink |

    或者,如果你知道镜像的确切 ID:

    |---|------------------------------|
    | | docker rmi -f cfd0134cbd8a |

  3. 检查并删除所有使用该镜像的容器

    如果你不确定哪些容器正在使用这个镜像,你可以使用以下命令来查找所有使用该镜像的容器,并逐一停止和删除它们:

    |---|--------------------------------------------------|
    | | docker ps -a --filter reference=bjdgyc/anylink |

    这个命令会列出所有使用 bjdgyc/anylink 镜像的容器。然后,你可以按照上面的方法停止并删除这些容器。

选择哪种方法取决于你的具体需求和你是否愿意冒删除正在运行的容器的风险。通常,停止并删除容器是最安全的方法。


3. Docker备份和恢复

当Docker数据出现问题时,回滚到某个版本通常涉及Docker镜像和容器的管理。以下是一系列步骤,可以帮助你回滚Docker数据到某个特定版本:

3.1 确定要回滚的容器和版本

首先,你需要确定哪个容器出现了问题,以及你想要回滚到的具体版本,(版本没有变化就不用标签)。这通常需要你事先已经为Docker镜像打上了不同的标签(tag),每个标签对应一个不同的版本。

3.2 备份当前容器(可选)

在回滚之前,强烈建议备份当前的容器状态,以防万一回滚后的版本不符合预期,可以恢复到当前状态。你可以使用docker commit命令将容器的当前状态保存为一个新的镜像。

|---|-------------------------------------------------------|
| | docker commit <container_id> <new_image_name>:<tag> |

备份演示:(备份成1.5,下下张图片是Anylink网页状态,四个组)

添加一组测试组后备份为标签1.6:(此时备份的时候是五个组)

3.3 备份存储卷

在根目录拷贝备份/conf文件为/conf2:


3.4 停止并删除当前容器

在回滚之前,你需要停止并删除正在运行的容器。这可以通过docker stopdocker rm命令来完成。

|---|-------------------------------|
| | docker stop <container_id> |
| | docker rm <container_id> |

现在停止正在运行的Anylink容器:


3.5 获取指定版本的镜像

如果你已经有一个带有特定版本标签的镜像,你可以直接拉取(如果镜像不在本地的话)或使用该镜像。如果镜像不在本地且你也没有拉取权限,你可能需要从镜像仓库中拉取。

|---|--------------------------------------|
| | docker pull <image_name>:<version> |

现在镜像在本地了,就不用操作了。


3.6 运行指定版本的容器

一旦你有了指定版本的镜像,你就可以使用docker run命令来启动一个新的容器,该容器将基于你选择的版本运行。

|---|----------------------------------------|
| | docker run -d <image_name>:<version> |

如果你需要挂载数据卷或设置其他启动参数,也可以在docker run命令中指定。

这里的 run 命令应该只用把宿主机的conf改名字就行,app/conf不用改,现在恢复到有测试组7的数据,此时假设出了问题,此时conf是存在的,或者之前某一时间段把conf拷贝备份成了一个目录(比如前面的conf2),也可以恢复到当时目录的状态,

现在在anylink创建一个问题组代表出问题了,(创建的测试组3_conf可以理解为正常的创建,或者现在先无视):

此时可以删除容器,或者是容器出问题自动删除,然后用之前备份的conf2文件再起一个容器:

bash 复制代码
docker run -d \
    --name anylink \
    --restart always \
    --privileged=true \
    -p 55555:443/tcp \
    -p 55555:443/udp \
    -p 8800:8800/tcp \
    -p 8800:8800/udp \
    -v /conf2:/app/conf \
bjdgyc/anylink -c=/app/conf/server.toml

此时就成功恢复到了没有问题组,即没有出问题的状态:

3.7 验证回滚和注意事项

启动新容器后,你应该验证回滚是否成功。这通常包括检查容器的运行状态、应用程序的日志以及数据是否按预期恢复。可以通过docker inspect 镜像名/ID来验证。

注意事项

如果是以下指令,就会恢复成初始状态了。因为app/conf2是原本不存在的:


  • 数据持久化:如果容器中的数据很重要,你应该在创建容器时使用数据卷(volume)或绑定挂载(bind mount)来持久化数据。这样,即使容器被删除,数据也会保留在宿主机上,并可以在新容器中重新挂载。
  • 版本控制:良好的版本控制实践是避免数据丢失和快速恢复的关键。为Docker镜像打上清晰的版本标签,并在每次重大更改后保存新的镜像版本。
  • 备份策略:定期备份Docker镜像和容器数据是确保数据安全的重要措施。你可以使用Docker提供的工具或第三方备份解决方案来制定和执行备份策略。
相关推荐
追风林5 分钟前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
€☞扫地僧☜€1 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
茶馆大橘1 小时前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
hjjdebug1 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
其乐无涯1 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流1 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
写bug的小屁孩1 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
斑布斑布1 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习
紅色彼岸花1 小时前
第六章:DNS域名解析服务器
运维·服务器
Spring_java_gg1 小时前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全