我如何将我的Docker服务器迁移到新系统
您是否考虑过将 Docker 容器从一台服务器迁移到另一台?我最近想升级我的家庭实验室,退休一台旧的机架式服务器,选择一台更新、更强大的系统,但迁移我的 Docker 容器却让我感到头疼,不知道该如何处理。
其实这并不是那么困难,更耗时间而不是让人感到恐惧或沮丧。这个迁移只需要几个命令和很多耐心(取决于你正在运行多少个Docker容器)。所以,这里是我如何将我的Docker服务器迁移到一个全新系统的方法(不包括移动虚拟机本身)。
迁移 Docker 主机不必让人感到不知所措
今年一月是我第一次迁移Docker容器。我从Unraid迁移到了一个在Ubuntu虚拟机上正确安装的Docker。这实际上是一次相当简单的迁移,我对一些应用程序使用了内置的备份方法,其他应用则是从头开始的。
然而,我最近决定将我的虚拟 Docker 主机从一台服务器迁移到另一台服务器。虽然我考虑过迁移虚拟机本身,但我决定采取不同的方式,将 Docker 安装迁移到一台全新的虚拟机上。
这让人感到相当压力很大。我需要将我的Docker容器停用一段时间来进行迁移,而在这个过程中有很多事情可能会出错。
然而,一旦我深入到这个过程,实际上并没有我想象中的那么糟糕。虽然这确实需要几个小时(我也遇到了一些问题),但总体来说,这个过程非常顺利,没有那么令人不知所措。
确保新系统已做好充分准备
我首先确保我的新虚拟机已经准备好。我首先确认我使用的是相同版本的Ubuntu:服务器24.04 LTS。Ubuntu服务器已经是我使用超过十年的首选,每当我需要Linux服务器时,我都会选择它。我对此感到很舒适。
一旦在新的虚拟机主机上安装了 Ubuntu Server 24.04,我确保配置好 Docker 以及我需要的任何其他依赖项并准备就绪。这包括 NVIDIA 或英特尔的任何额外驱动程序,并确保我与 Docker 需要的所有文件夹路径都已设置好。
在我配置好所有这些后,我使用以下命令停止了 Docker 服务和套接字:
systemctl stop docker.socket
systemctl stop docker
你可能不需要运行两个命令,但我这样做了。这基本上关闭了 Docker,这样我就可以对核心 Docker 文件系统进行更改,而不至于搞砸任何东西。
一旦完成这个,我就在旧系统上运行了完全相同的命令。我必须确保在收集文件之前旧系统上的Docker是关闭的,因为这可以确保从我开始迁移到完成迁移时,任何东西都不会改变。
这也意味着我所有的 Docker 容器都会关闭。老实说,这对我来说是最糟糕的部分。我的家庭实验室使用 Docker 运行我整个房子,从 Home Assistant 到 Audiobookshelf、Plex 以及其他许多服务。关闭 Docker 意味着要关闭这些系统,所以我不得不等待合适的时机来执行该操作。
最终,我找到了一个服务器空闲的时间,我能够通过关闭Docker来继续,然后进入下一步:准备转移所有文件。
收集所有的Docker文件
对我来说,这是这个过程中的最长部分。我最终删除了相当多的文件和文件夹,这些文件和文件夹来自我绑定挂载 Docker 卷的文件夹,以尽量加快这个过程,但仍然花了几个小时。
本质上,您需要将您的 Docker 文件夹打包,然后,如果您使用不同的区域作为卷挂载,那个文件夹也要打包。如果您只是使用 Docker 卷,那么它们将会被第一个命令捕获。
首先,我在我的旧服务器上运行了以下命令:
sudo tar -czvf docker-backup.tar.gz /var/lib/docker
这段话的意思是将 /var/lib/docker 文件夹备份到一个 tar.gz 文件中。根据你正在运行的容器数量,以及是否使用 Docker 卷,这可能需要一段时间。对我来说,大约花了 30 到 45 分钟。
接下来,我在我的旧服务器上运行了以下命令:
sudo tar -cvzf docker-files.tar.gz /portainer
由于我将 Portainer 作为我的 Docker 管理器,所以我把所有的 Docker 文件放在服务器的 /portainer 目录下。因此,我有 /portainer/audiobookshelf、/portainer/plex 等等。上述命令将 /portainer 文件夹打包成一个漂亮的小文件,方便移动。由于我的 Docker Volume 文件夹中有很多数据,这个备份大约花了一个小时。
一旦两个文件夹完成了打包,我就准备进入下一步:将压缩的档案转移到新服务器上。
将所有内容迁移到新系统是简单明了的
我家有一个2.5Gb/s的网络,我喜欢尽可能充分利用它。因此,我找到了一个命令,可以将文件从一个服务器移动到另一个服务器,同时在终端显示传输速度:
rsync -ah --info=progress2 docker-backup.tar.gz user@remote-host:/destination/path/
使用这个命令,我可以监控传输并确保一切都按计划进行。幸好,一切顺利。在几分钟内,文件从旧服务器移动到了新服务器,我准备继续进行。
当然,如果你更喜欢的话,你可以使用 USB 将文件从一台服务器移动到另一台服务器。我的旧服务器(一台戴尔 R720 机架系统)只有 USB 2.0,所以通过网络传输文件对我来说要快得多。
一旦文件在新服务器上,只需将它们解压到适当的位置。我从 Docker 文件夹开始:
sudo tar -xpf docker-backup.tar.gz -C /
当这结束时,我跑了。
sudo tar -xpf docker-files.tar.gz -C /
这将我所有的旧Docker文件和卷挂载都放回了它们应该去的地方,并且保持了权限设置的正确,这是迁移的主要部分。
实际上,打包Docker、移动tar文件以及解压文件是整个迁移中耗时最多的部分。总的来说,这三项操作在我的服务器上大约花费了三到四个小时才能完成。
然而,一旦我完成了这一切,我就离迁移完成只差一步。现在,是我在新服务器上启动Docker的时刻了。
在新系统上启动Docker,您的容器应该会启动
所有文件都到位后,我第一次启动了Docker,所有容器也到位。这很简单,只需要两个命令:
systemctl start docker
systemctl start docker.socket
在搬家后,我原本预期打开 Docker 时会有很多东西出现问题。结果大多数东西都能顺利启动并准备就绪。实际上,这就是在新机器上启动 Docker 的全部内容。
如果你旧系统和新系统之间的配置没有太大差别,那么一切应该都能够正常运行。不过,如果你像我一样,在这两个系统之间做了很多更改,那么有一些事情需要注意。
搬家时需要注意的事项
我必须修复的第一件事是将几个使用NVIDIA运行时的容器更改为使用Intel运行时。在我的旧服务器上,我有一块GTX 1650显卡来帮助进行AI处理和转码。新服务器配备了i9-13900K,具有Intel的集成显卡,能够处理相同的工作负载。
这需要一些巧妙安排,我仍然没有完全切换过来(我放弃了Scrypted,决定让它直接在处理器上运行,而不是iGPU),但总体来说这是一个相当简单的切换。
我在使用 Home Assistant 时遇到了一个相当大的问题。Home Assistant 的 Docker 容器出于某种原因,没有转移任何设置。我有一些配置文件存储在 /portainer/homeassistant,但它启动时就像我从未运行过 Home Assistant 一样。
这其实是一个简单的解决方案。我只需重新启动旧的虚拟机,进入Home Assistant,下载备份文件,然后在新的虚拟机上恢复该文件。这马上让我恢复了工作。
Docker的一些网络配置可能也需要检查一下。例如,Scrypted,我不得不将其从某种原因创建的新scrypted-default网络更改回主机网络。
我还需要在新的虚拟机上设置静态IP。然后,我还需要更新服务器周围的一些小细节,以使其与我传递的集成显卡顺利工作。
总体来说,这次迁移相当顺利,我对新的服务器非常满意。它比旧服务器更快、更灵敏、功能更强大,而且耗电更少。
这个操作相对简单,我很高兴我学会了如何将Docker容器从一个系统移动到另一个系统。我相信这在今后某个时候会派上用场!
如果你从未运行过Docker容器,或者刚刚开始,Docker是一个很棒的工具。它几乎独自运行了我整个家庭实验室。
这里有一些我最喜欢的Docker容器,我认为每个家庭实验室用户都应该运行。大多数容器设置简单,可以为你的系统增添很多价值。事实上,我的家庭实验室已经成为我家中最有用的东西之一。



