How to move the default /var/lib/docker to another directory for Docker on Linux?

I recently had a case where the / partition was running very low on disk space, but I also had an additional disk mounted at /home/ with plenty of disk space.

However as by default Docker stores everything at /var/lib/docker my / partition was nearly full.

To fix that I moved the default /var/lib/docker to another directory on the /home partition.

In case that you are in the same situation, here is how to do that on a Linux server!

Submit an answer

This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Sign In or Sign Up to Answer

These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.

Accepted Answer

Before you get started, make sure to backup your Droplet so that in case that anything goes wrong, you could revert back to a backup!

Once you have your backup in place, follow these steps here:

  1. sudo systemctl stop docker

After that, make sure that Docker is not running with the following commands:

  1. sudo systemctl status docker

If you see that Docker is not running, then you could proceed. Another way of checking if there are any Docker processes is by using the ps command:

  1. ps faux | grep -i docker
  • After that, copy the /var/lib/docker/ Docker directory to the new location. Let’s say that we want to put the files in a folder called /home/docker. To do so, first create the folder:
  1. mkdir /home/docker

Then using the rsync command transfer the files over:

  1. rsync -avxP /var/lib/docker/ /home/docker

Note: this might take a while depending on the size of your images. If your folder is too large you might want to run the rsync command in a screen session to avoid your connection being dropped and interrupting the transfer.

  • Next, you need to update the Docker unit file. To do that, using your favorite text editor, edit the following file:
  1. sudo nano /lib/systemd/system/docker.service

Find the following line:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

And change it to:

ExecStart=/usr/bin/dockerd -g /home/docker -H fd:// --containerd=/run/containerd/containerd.sock

Then reload the systemd daemons:

  1. sudo systemctl daemon-reload

And finally, start Docker:

  1. systemctl start docker

Finally, to confirm if your images are being loaded from the new path, you can inspect one of your images:

Find an image id:

docker images

Inspect the image and look for the WorkDir:

docker inspect image_id | grep WorkDir

I hope that this helps! Regards, Bobby

  • Stop the server:
sudo systemctl stop docker
  • Create/edit the configuration at /etc/docker/daemon.json, for example:
    "data-root": "/new/path/docker-data-root"
  • Copy your data there:
sudo cp -axT /var/lib/docker /new/path/docker-data-root

(if the target docker-data-root directory already exists, make sure you don’t accidentally copy into a docker subdirectory).

  • Start the server:
sudo systemctl start docker
  • Check everything works:
sudo docker images

The previous answer:

  1. Uses an obsolete/undocumented(?) option -g. Instead you should use the option documented in dockerd --help, which is --data-root.
  2. Edits the service file, which might cause problems when installing updates. Instead you should edit /etc/docker/daemon.json.
  3. Uses rsync to copy files without preserving ACLs, xattrs and hard links, though I’m not sure there’s any.