サーバー運用において「マウント完了前に Docker が起動してしまう」問題は、バックアップデータや DB データを外部ストレージに置いている場合に 最も危険なポイント のひとつです。
❌ デフォルトのままだと「マウント完了前に Docker が起動してしまう」可能性があります。
✅ したがって、/mnt/2nd_storageのマウント完了を systemd で保証する設定が必要です。
Ubuntu などの systemd ベースのディストリビューションでは:
Docker サービス (docker.service) は、multi-user.target に紐づいており、
通常のファイルシステムマウントよりも 早く起動する ことがあります。
そのため、/mnt/2nd_storage がまだマウントされていない段階で Docker が起動し、
/mnt/2nd_storage/data/... 以下のボリュームが「空ディレクトリ」として初期化されることがあります。
結果:
docker.service に依存関係を追加最も確実でおすすめの方法です。
Docker サービスのオーバーライド設定を作成します。
sudo systemctl edit docker.service
エディタが開くので、次の内容を追加します:
[Unit]
After=mnt-2nd_storage-data.mount
Requires=mnt-2nd_storage-data.mount
⚠️
After=とRequires=の両方を指定するのがポイントです。
保存して閉じたら、設定をリロード:
sudo systemctl daemon-reload
Docker を再起動:
sudo systemctl restart docker
これで、/mnt/2nd_storage/data がマウントされるまで Docker は起動しません。
/etc/docker/daemon.json で root dir を安全に変更(補助)もし Docker のデータルートを /mnt/2nd_storage/data/docker にしているなら、
これも追加でやっておくと安全です:
sudo mkdir -p /mnt/2nd_storage/data/docker
sudo chown root:root /mnt/2nd_storage/data/docker
sudo chmod 711 /mnt/2nd_storage/data/docker
/etc/docker/daemon.json に以下を記載:
{
"data-root": "/mnt/2nd_storage/data/docker"
}
これで、Docker 自身のデータディレクトリも同じマウントに置けます。
ただし、上記の systemd 設定とセットで行うことが重要です。
再起動後に以下を実行し、起動順序を確認:
systemd-analyze blame | grep -E "docker|mnt"
または:
systemctl status mnt-2nd_storage-data.mount
systemctl status docker
docker が mnt-2nd_storage-data.mount より後に起動していることを確認します。
fstab の該当行に nofail,x-systemd.requires-mounts-for=/mnt/2nd_storage/data を入れることで、
mount の失敗時にブートを止めず、かつ systemd 依存が働くようにできます。
UUID=69e93aec-d21c-4289-9715-82d722e85318 /mnt/2nd_storage/data btrfs defaults,ssd,noatime,compress=zstd,discard=async,subvol=data,nofail,x-systemd.requires-mounts-for=/mnt/2nd_storage/data 0 0
| 状況 | 対応 |
|---|---|
| Docker がストレージより先に起動 | ❌ データ破損のリスクあり |
/etc/fstab に Btrfs 設定のみ |
⚠️ 不十分 |
systemctl edit docker.service で After=…mount 追加 |
✅ 推奨設定 |
nofail,x-systemd.requires-mounts-for を fstab に追加 |
✅ 補助的に安全性向上 |