概要
私はDockerコンテナにdocker runコマンドの-v, --volumeコマンドでNFS上のディレクトリをマウントしています. この状態でOSを再起動すると,DockerサービスがNFSのマウント前に起動してしまい,Dockerコンテナが正常にrestartできない問題が発生していました. 本記事ではこの問題の解決方法として,systemdのdrop-inファイルを使用して,NFSがマウントされるまでDockerサービスが起動しないように設定する方法をメモしておきます.
本記事の解決方法に行き着くにあたっては,下記の記事が参考になりました.
- Start docker after NFS mounts come online | The Danesh Project
- Ubuntu 20.04 LTS : NFS クライアント : Server World
- fstab - ArchWiki
私の開発環境は下記のとおりです.
OS | Ubuntu 20.04.4 LTS (amd64) |
---|---|
Docker version | 20.10.14, build a224086 |
NFSクライアントの設定
/etc/fstabには下記のように設定しています.systemdによるリモートファイルシステムの自動マウントの設定です.
1 | 192.168.0.128:/volume2/data /mnt/nas/data nfs defaults,noauto,x-systemd.automount,x-systemd.device-timeout=30,_netdev 0 0 |
設定変更した場合は,OSの再起動もしくはsudo mount /mnt/nas/dataでNFSをマウントします.
下記のコマンドで/mnt/nas/dataのマウントに対応するsystemdユニットを探します.ディレクトリパスのスラッシュ (/)をハイフン (-)に置き換えたものになっているようでした.
1 2 3 4 | $ systemctl list-units | grep automount (略) mnt-nas-data.automount loaded active running mnt-nas-data.automount (略) |
Dockerサービスの設定
drop-inファイルを格納するディレクトリを作成して,テキストエディタでdrop-inファイルを新規作成します.
1 2 | $ sudo mkdir -p /etc/systemd/system/docker.service.d/ $ sudo vi /etc/systemd/system/docker.service.d/wait-for-nfs.conf |
drop-inファイル,wait-for-nfs.confには下記のように設定を記述します. 設定の詳しい解説については,概要に記載した参考記事をご覧ください.
1 2 3 | [Unit] After=mnt-nas-data.automount Wants=mnt-nas-data.automount |
Dockerサービスの再起動と動作確認
Dockerサービスを再起動します.Drop-Inの項目で,drop-inファイルを認識しているか確認します. 問題がなければ,OSを再起動した後は,NFSがマウントされてからDockerサービスが起動するようになっています.
1 2 3 4 5 6 7 8 9 10 | $ sudo systemctl restart docker $ sudo systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset> Drop-In: /etc/systemd/system/docker.service.d └─wait-for-nfs.conf Active: active (running) since Sat 2022-03-26 12:17:31 JST; 46min ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com (略) |