Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
HOWTO: Install Docker on Proxmox 4

Install Docker on Proxmox 4

Proxmox 4 is based on Debian Jessie. Reference for this install:

Add the Docker repo for Debian Jessie

$ apt-get install curl
$ curl -fsSL | apt-key add -
$ echo "deb debian-jessie main" > /etc/apt/sources.list.d/docker.list
$ apt-get update

Install Docker

$ apt-get install docker-engine

Switch to the ZFS Storage Driver

If you installed Proxmox 4 using the ZFS filesystem (and why wouldn't you), you should switch Docker to use ZFS for its images and containers.

Check the storage engine

We want Docker to be using the ZFS storage engine. This enables very efficient use of ZFS snapshots and clones for Docker images and volumes. See

If the answer to the following command is "zfs", ignore the rest of this section. If the answer is "aufs" or any other filesystem, continue on to switch the storage driver to ZFS.

$ docker info|grep Storage
Storage Driver: aufs

Create the ZFS dataset for Docker

$ service docker stop
$ rm -rf /var/lib/docker
$ zfs create -o mountpoint=/var/lib/docker rpool/docker

Tell Docker to use the ZFS storage driver

Docker should detect ZFS and automatically use the ZFS storage driver. However, I found that I had to add the --storage-driver=zfs option explicitly.

Note that since Proxmox 4 uses systemd, /etc/defaults/docker is ignored. Setting DOCKER_OPTS there is ineffective.

For reference, I read this on Docker with systemd:

Create a directory for the config file override:

$ mkdir /etc/systemd/system/docker.service.d

Create a file called /etc/systemd/system/docker.service.d/storage-driver.conf with the contents:

ExecStart=/usr/bin/dockerd --storage-driver=zfs -H fd://

Then run to reload the service config files:

$ systemctl daemon-reload

Start the docker service and check the storage engine

The answer should now be "zfs" instead of "aufs".

$ service docker start
$ docker info|grep Storage
Storage Driver: zfs

Test the Docker install

Run the hello_world image

This runs the hello world image to verify that Docker is running properly.

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:

For more examples and ideas, visit:

List the new hello_world container and image

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              48b5124b2768        5 weeks ago         1.84 kB

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
16f1e50f69be        hello-world         "/hello"            2 minutes ago       Exited (0) 2 minutes ago                       musing_mirzakhani

Show that new ZFS datasets have been created

$ zfs list
NAME                                                                                 USED  AVAIL  REFER  MOUNTPOINT
rpool                                                                                327G  3.19T   128K  /rpool
rpool/ROOT                                                                          12.2G  3.19T   128K  /rpool/ROOT
rpool/ROOT/pve-1                                                                    12.2G  3.19T  12.2G  /
rpool/data                                                                           306G  3.19T   128K  /rpool/data
rpool/docker                                                                         879K  3.19T   543K  /var/lib/docker
rpool/docker/1610e55c639dadcb48c89a3f686f7251571fa68d157bf900c32cedbccc7a307f       85.2K  3.19T   144K  legacy
rpool/docker/1610e55c639dadcb48c89a3f686f7251571fa68d157bf900c32cedbccc7a307f-init   117K  3.19T   144K  legacy
rpool/docker/6a3fbc4db9eb44757209fbec08d4873f45d512ffef83fcc3ddd6ef4a8ad79968        133K  3.19T   133K  legacy
rpool/swap                                                                          8.50G  3.20T  5.53M  -

This comment has been minimized.

Copy link

@bdwakefield bdwakefield commented Nov 29, 2017

Thanks! Also worked for me with 5.1!


This comment has been minimized.

Copy link

@lnxbil lnxbil commented Jan 10, 2018

Nice article, yet one remark on general use to keep in mind or remember if you encounter strange problems:
Problem with ZFS as backend is that not all application work due to the missing O_DIRECT in ZFS when using ZFS as a filesystem (instead of a ZVOL). The number is very, very low, yet you have to tune databases.

Everything is in ZFS-on-Linux Issue 224 - O_DIRECT including examples where it does not work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment