Docker 命令相似,但宿主机路径、权限、网络和面板习惯差异很大。
\n
FNOS、Synology 和普通 Linux 都能跑 Docker,compose 文件看起来也很像。但真正迁移服务时,差异往往不在 Docker 命令本身,而在宿主机路径、权限模型、网络入口和更新方式。把旧机器的配置原样复制过去,可能能启动,也可能在权限、端口或备份上留下隐患。
路径前缀不能照搬
不同宿主机的存储路径习惯差异很大。普通 Linux 可能使用 /srv/docker 或 /opt/app,Synology 有自己的共享文件夹和卷路径,FNOS 也会有面板管理下的应用目录。Compose 里写死旧路径,迁移后最常见的结果就是目录不存在、自动创建空目录,服务看似启动,实际用了全新的空数据目录。
迁移前我会先画一张路径映射表:旧宿主机项目目录、新宿主机项目目录、配置目录、数据目录、缓存目录、备份目录分别在哪里。然后用 docker compose config 看最终展开的挂载。只要发现某个挂载落到了意料之外的位置,就先停下来修路径,不继续启动服务。
权限模型要重新核对
uid/gid 不能从旧机器直接复制。Synology、FNOS 和普通 Linux 对用户、用户组、共享目录 ACL 的处理方式不完全一样。一个在旧机器上是 1000:1000 的服务用户,到新机器上可能对应另一个账号,或者根本不存在。页面上显示有权限,不代表容器内进程能写。
我会在新宿主机上重新执行 id、ls -ln、stat,看数字属主和组。对于支持 PUID/PGID 的镜像,要填新机器的实际值;对于不支持的镜像,要按镜像文档处理目录属主。不要用统一放宽权限来省事,因为多个服务共享资料目录时,权限污染会逐渐扩大。
网络入口和端口策略不同
普通 Linux 上开放端口可能只需要防火墙规则,Synology 和 FNOS 可能还叠加面板、防火墙、应用入口或反向代理设置。容器显示 running,不代表局域网能访问;宿主机本机能 curl 通,也不代表其他设备能打开。迁移时必须分层测试:容器内部、宿主机、同网段客户端、反向入口。
网络模式也不能盲目照搬。某些服务在旧机器上用 host 网络是为了发现局域网设备,迁移到另一套系统后可能和面板端口冲突。桥接网络更可控,但需要明确端口映射和服务间网络。每个服务都应记录为什么使用当前网络模式,而不是复制旧 compose 里的习惯。
更新方式要统一口径
普通 Linux 上可能习惯命令行 docker compose pull && docker compose up -d,Synology 或 FNOS 用户可能更常从面板更新。两种方式混用时,最怕面板改了配置但文件没回写,或者命令行升级后面板仍显示旧状态。长期维护最好确定一个事实来源:compose 文件、环境变量和维护记录说了算,面板用于查看和辅助。
镜像版本也要注意。迁移时顺手把 latest 拉成新版,等于同时做了宿主迁移和应用升级,出问题很难判断根因。我更愿意先固定旧版本完成迁移,确认数据和访问都正常,再单独安排升级窗口。一次只改变一个变量,排障会简单很多。
备份和恢复路径也要迁移
服务能跑起来只是迁移的一半。备份任务是否指向新目录,监控是否抓新地址,日志路径是否改变,恢复说明是否更新,这些都要同步。很多迁移事故不是当天发生,而是几个月后需要恢复时才发现备份一直在旧路径上成功运行。
所以我会把跨宿主迁移拆成清单:路径映射、权限核对、网络测试、版本固定、备份更新、监控更新、恢复演练。FNOS、Synology、普通 Linux 的 Docker 体验可以很接近,但底层宿主差异一直存在。承认这些差异,迁移就会稳很多。
外接存储和共享协议也会影响容器表现。同样一份目录,本地盘、USB 盘、网络挂载在锁、权限、延迟和断线恢复上都可能不同。数据库、照片索引、配置目录这类高频读写内容,更适合放在稳定本地存储;大体积只读资料可以再考虑共享挂载。宿主差异最终都会落到这些细节上。
系统更新也要单独看。NAS 面板更新、Docker 组件更新、内核更新、普通软件包更新,影响范围不同。迁移后的第一次系统更新前,我会确认重要服务有备份,并记录更新前后的 Docker 版本和网络行为。宿主机变化有时比应用升级更容易影响容器。
此处评论已关闭