我在 Ubuntu 16.04 上使用 Docker CE,使用 ZFS 作为 Docker 的存储。设置基本都是标准的:
- 有一个包含多个磁盘的 zpool
- 在 zpool 上,有一个带有 mountpoint 的 zfs 文件系统
/var/lib/docker
。 - Docker 发现文件系统是 ZFS,并自动使用它
大部分情况下一切都正常。但是,偶尔当我的虚拟机启动时,zpool 无法挂载。我相信(虽然我不是 100% 确定)这是因为 Docker 服务在挂载 ZFS 文件系统之前启动,事实上我看到/var/lib/docker
在根 FS 上创建了一个文件夹。
如何确保在所有 ZFS 文件系统都挂载后 Docker 服务才会启动?
答案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
答案这里,包含每行功能的解释。