---
description: Learn how to optimize your use of ZFS driver.
keywords: 'container, storage, driver, ZFS '
title: ZFS storage driver
aliases:
- /storage/storagedriver/zfs-driver/
---
ZFS is a next generation filesystem that supports many advanced storage
technologies such as volume management, snapshots, checksumming, compression and
deduplication, replication and more.
It was created by Sun Microsystems (now Oracle Corporation) and is open sourced
under the CDDL license. Due to licensing incompatibilities between the CDDL and
GPL, ZFS cannot be shipped as part of the mainline Linux kernel. However, the
ZFS On Linux (ZoL) project provides an out-of-tree kernel module and userspace
tools which can be installed separately.
The ZFS on Linux (ZoL) port is healthy and maturing. However, at this point in
time it is not recommended to use the `zfs` Docker storage driver for production
use unless you have substantial experience with ZFS on Linux.
> [!NOTE]
>
> There is also a FUSE implementation of ZFS on the Linux platform. This is not recommended. The native ZFS driver (ZoL) is more tested, has better performance, and is more widely used. The remainder of this document refers to the native ZoL port.
## Prerequisites
- ZFS requires one or more dedicated block devices, preferably solid-state
drives (SSDs).
- The `/var/lib/docker/` directory must be mounted on a ZFS-formatted
filesystem.
- Changing the storage driver makes any containers you have already
created inaccessible on the local system. Use `docker save` to save containers,
and push existing images to Docker Hub or a private repository, so that you
do not need to re-create them later.
> [!NOTE]
>
> There is no need to use `MountFlags=slave` because `dockerd` and `containerd` are in different mount namespaces.
## Configure Docker with the `zfs` storage driver
1. Stop Docker.
2. Copy the contents of `/var/lib/docker/` to `/var/lib/docker.bk` and remove
the contents of `/var/lib/docker/`.
```console
$ sudo cp -au /var/lib/docker /var/lib/docker.bk
$ sudo rm -rf /var/lib/docker/*
```
3. Create a new `zpool` on your dedicated block device or devices, and mount it
into `/var/lib/docker/`. Be sure you
have specified the correct devices, because this is a destructive operation.
This example adds two devices to the pool.
```console
$ sudo zpool create -f zpool-docker -m /var/lib/docker /dev/xvdf /dev/xvdg
```
The command creates the `zpool` and names it `zpool-docker`. The name is for
display purposes only, and you can use a different name. Check that the pool
was created and mounted correctly using `zfs list`.
```console
$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
zpool-docker 55K 96.4G 19K /var/lib/docker
```
4. Configure Docker to use `zfs`. Edit `/etc/docker/daemon.json` and set the
`storage-driver` to `zfs`. If the file was empty before, it should now look
like this:
```json
{
"storage-driver": "zfs"
}
```
Save and close the file.
5. Start Docker. Use `docker info` to verify that the storage driver is `zfs`.
```console
$ sudo docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 17.03.1-ce
Storage Driver: zfs
Zpool: zpool-docker
Zpool Health: ONLINE
Parent Dataset: zpool-docker
Space Used By Parent: 249856
Space Available: 103498395648
Parent Quota: no
Compression: off
<...>
```
## Manage `zfs`
### Increase capacity on a running device
To increase the size of the `zpool`, you need to add a dedicated block device to
the Docker host, and then add it to the `zpool` using the `zpool add` command:
```console
$ sudo zpool add zpool-docker /dev/xvdh
```
### Limit a container's writable storage quota
If you want to implement a quota on a per-image/dataset basis, you can set the