
如果你的 Docker 容器依赖远程存储(如 NFS 共享目录),而服务器开机时 挂载顺序晚于 Docker 启动,容器就会无法访问挂载点,频繁报错,甚至导致整个服务无法运行。 本文通过一个实际案例,手把手实现:CentOS 上自动挂载远程存储,并在挂载完成后再启动 Docker,并讲清楚 systemd 配置路径、Docker 配置两种修改方式,避免升级风险。
假设我们想把远程存储挂载到 /data,在 /etc/fstab 中写了:
storage.example.com:/share /data nfs defaults,_netdev 0 0重启后发现:
mount.nfs: Failed to resolve server … Name or service not known/data;systemctl start data.mount 却能正常挂载。启动时,systemd 只保证网络接口启动 (network.target),但:
有人会:
rc.local 或脚本里手动延迟挂载;restart: always,依赖自动重启。这些办法可能短期有效,但风险很大:
.mount 管理挂载创建 /etc/systemd/system/data.mount:
[Unit]
Description=Mount remote storage before Docker
Requires=network-online.target nss-lookup.target NetworkManager-wait-online.service
After=network-online.target nss-lookup.target NetworkManager-wait-online.service
Before=docker.service
[Mount]
What=storage.example.com:/share
Where=/data
Type=nfs
Options=_netdev,auto,timeo=500,retrans=86400,hard,bg,intr
[Install]
WantedBy=multi-user.target关键点:
NetworkManager-wait-online.service:等待网络和 DNS 就绪;Before=docker.service:挂载必须先于 Docker;_netdev:让 systemd 知道这是网络设备挂载。不建议直接修改 /usr/lib/systemd/system/docker.service,因为它里面已经有其他依赖,直接替换会破坏服务启动逻辑。
推荐方法:使用 override 文件,仅追加挂载依赖:
mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/override.conf添加以下内容:
[Unit]
# 仅追加 data.mount,不覆盖原有依赖
Requires=data.mount
After=data.mount然后重新加载,验证修改是否正确:
systemctl daemon-reload
systemctl show docker.service | grep -E 'Requires|After'你会看到原本的依赖(如 containerd.service、network-online.target)仍然存在,并额外加上了 data.mount。
重启docker服务
systemctl restart docker这样,docker.service 启动时既会依赖它原本的 containerd.service、network-online.target,也会等待 data.mount 完成后再启动。
如果你真的要直接改 /usr/lib/systemd/system/docker.service,必须小心:
Requires= 和 After=,把 data.mount 加进去,而不是覆盖;systemctl enable NetworkManager-wait-online.service
systemctl enable data.mount
systemctl daemon-reload
systemctl restart docker
reboot检查状态:
systemctl status data.mount
systemctl status docker挂载和 Docker 都会在启动时自动就绪,容器可直接访问 /data。
理解这三个目录,才能知道配置应该改哪里。
/usr/lib/systemd/system//run/systemd/system//lib/systemd/system//usr/lib/systemd/system 相同。/usr/lib/systemd/system 的符号链接。/etc/systemd/system/override.conf 可以覆盖系统服务而不修改原文件。优先级顺序:
/etc/systemd/system/ > /run/systemd/system/ > /usr/lib/systemd/system/ (/lib/systemd/system/)查看最终生效配置:
systemctl cat docker.service/etc/systemd/system/data.mount(使用时替换实际地址);这样,每次服务器重启时:
/data;