
私は Ubuntu 16.04 で Docker CE を使用しており、Docker のストレージとして ZFS を使用しています。セットアップはほぼ標準的です。
- 複数のディスクを持つzpoolがあります
- zpool には、マウントポイントを持つ zfs ファイルシステムがあります
/var/lib/docker
。 - DockerはファイルシステムがZFSであることを認識し、それを自動的に使用します。
ほとんどの場合、すべて正常に動作します。ただし、VM の起動時に、たまに zpool のマウントが失敗します。これは、ZFS ファイルシステムがマウントされる前に Docker サービスが起動し、実際に/var/lib/docker
ルート FS にフォルダーが作成されているためだと考えています (100% 確信はありませんが)。
すべての ZFS ファイルシステムがマウントされるまで Docker サービスが開始されないようにするにはどうすればよいですか?
答え1
私は 2 つのことを行うことでこの問題を解決できました。1 つだけでも十分な場合があることに注意してください。
まず、{"storage-driver": "zfs"}
ファイルに書き込むことで、Docker に ZFS をファイルシステムとして使用するように明示的に指示します/etc/docker/daemon.json
。(ファイルがディスク内に存在する場合は、ストレージ ドライバー キーを追加するだけです)
次に、ファイルに次の systemd ユニットを作成します/etc/systemd/system/docker-wait-zfs.service
。
[Unit]
Description=Wait for ZFS before starting Docker
RequiredBy=docker.service
Before=docker.service
Requires=zfs.target
After=zfs.target
[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
次に以下を実行します:
systemctl enable docker-wait-zfs.service
答え2
ここでの回答は、最近のアップデート後、私には役に立ちませんでした。ルート ドライブが ZFS を使用していない限り、"/etc/docker/daemon.json" に "{"storage-driver": "zfs"}" を含めることはできないようです。ZFS 上にあるコンテナーにフォルダーをマッピングしているだけなので、これは私には当てはまりませんでした。
これを修正するには、次の方法が有効です。
- sudo systemctl で docker.service を編集します。
次の内容を追加します。
After=zfs-mount.service Requires=zfs-mount.service Wants=zfs-mount.service BindsTo=zfs-mount.service
答えここ、各行の機能についての説明が含まれています。