如果你的 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
;