
我在 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
最近更新後,這裡的答案對我來說不起作用。看來你的“/etc/docker/daemon.json”中不能再有“{”storage-driver”:“zfs”}”,除非根驅動器使用ZFS。這不適用於我,因為我只是將資料夾對應到恰好駐留在 ZFS 上的容器。
為了解決這個問題,以下方法有效:
- sudo systemctl 編輯 docker.service
添加以下內容:
After=zfs-mount.service Requires=zfs-mount.service Wants=zfs-mount.service BindsTo=zfs-mount.service
答案這裡,包含每行的作用的解釋。