skip to Main Content

How to move docker data directory to another location on Ubuntu

Docker is a popular container management platform that can dramatically speed up your development workflow. It is available as a package on major Linux distributions, including Ubuntu.

The standard data directory used for docker is /var/lib/docker, and since this directory will store all your images, volumes, etc. it can become quite large in a relative small amount of time.

If you want to move the docker data directory on another location you can follow the following simple steps.

1. Stop the docker daemon

sudo service docker stop

2. Add a configuration file to tell the docker daemon what is the location of the data directory

Using your preferred text editor add a file named daemon.json under the directory /etc/docker. The file should have this content:

{ 
   "data-root": "/path/to/your/docker" 
}

of course you should customize the location “/path/to/your/docker” with the path you want to use for your new docker data directory.

3. Copy the current data directory to the new one

sudo rsync -aP /var/lib/docker/ /path/to/your/docker

4. Rename the old docker directory

sudo mv /var/lib/docker /var/lib/docker.old

This is just a sanity check to see that everything is ok and docker daemon will effectively use the new location for its data.

5. Restart the docker daemon

sudo service docker start

6. Test

If everything is ok you should see no differences in using your docker containers. When you are sure that the new directory is being used correctly by docker daemon you can delete the old data directory.

sudo rm -rf /var/lib/docker.old

Follow the previous steps to move docker data directory and you won’t risk any more to run out of space in your root partition, and you’ll happily use your docker containers for many years to come. 😉

7. Extra step: remote debug on your Docker container!

Do you know that you can remote debug your application running on a Docker container? Check out my tutorial on Remote debugging a Django project in VS Code! It uses Django as an example, but the Docker related part is general.

augusto

Freelance developer and sysadmin

This Post Has 55 Comments
  1. I had a disk full error due to docker eating up all the space. Using your procedure I solved the problem. Thanks!

  2. Faced issue with “no space left on device”. these steps helped me to resolve this issue. Thank you.

    1. Not at all, at least if the new data directory location is in the same type of storage as the old one.
      For example if the old data directory was stored on an SSD disk and the new one is on magnetic or network storage, the performance will degrade. Otherwise I do not expect any difference in Docker performance.

  3. Thanks for the guide – it works. However, I must warn others that if your file system is ecryptfs, then docker won’t be able to use it as a storage backend for the images.

  4. Thank you, Augusto. I had checked two to three sites before, but this article helped me.

    1. Same here… I’ve checked other articles (even one kind of confusing in the docker forum) and did some changes. After changes, when I ran *docker info* it showed the new location where the images will be downloaded, basically just changed the root-directory but 2 days after when I downloaded other image and listed it with *docker images* any of my previous images where listed. So following the step to add a file named daemon.json and on, after I did that and restarted docker service all my images where listed again even the statuses when I ran *docker ps -a*.

      Muchas gracias, Augusto!

  5. If you’re using ZFS then your daemon.json should look like this;

    {
    “storage-driver”: “zfs”,
    “graph”: “/path/to/your/zpool/location/for/docker”
    }

    1. In general, I believe the newer docker uses “graph” as the key rather than “data-root” in the /etc/docker/daemon.json file. If you get something like this attempting to start the service:
      `Job for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “journalctl -xe” for details.`
      and you’d used “data-root” try changing to “graph”: “/path/to/your/docker”

  6. Do you know it works for a different system?
    I mean, I have to move docker to another system (same OS and docker version). A sort of quick backup and restore.
    Thanks

  7. For some reason, that broke several symlink and half my docker machines do no longer start. I receive errors like these ones when I try:

    Error response from daemon: error evaluating symlinks from mount source “/var/lib/docker/volumes/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/_data”: lstat /var/lib/docker: no such file or directory
    Error: failed to start containers: xxxxxxxx

  8. On Fedora, and in general, depending on the way docker service is started, you might have to use following commands to stop/start docker
    systemctl stop docker
    systemctl start docker

  9. If you’re confused because some posts refer to a “graph” option in daemon.json and some to “data-root”, you’re not alone. In fact they are the same, but the “graph” option is deprecated (but still works:-).

    “graph” has been replaced by “data-root”, both as an option in daemon.json and a flag to the dockerd daemon. It seems that it’s been that way since v17.05 in 2017.

    See: https://docs.docker.com/engine/deprecated/#-g-and—graph-flags-on-dockerd

  10. Hey, it didn’t work on my platform, however when i try to restore old docker images it just says couldnt find image locally and proceeds to download again. How do I restore it?

  11. I have a ZFS RAIDZ pool mounted to /pool1
    /pool1 is my data area
    I would like to use a directory within /pool1 for docker, so /pool1/docker
    I did the process in this webpage using the below daemon.json contents but my containers disappear, I get “Error response from daemon: No such container” even though the files are there.
    {
    “storage-driver”: “zfs”,
    “data-root”: “/pool1/docker”
    }
    Since /pool1/docker is a sub-directory of the zfs mount point I tried daemon.json with the below contents but docker then refuses to start with the error “Job for docker.service failed because the control process exited with error code.”
    {
    “data-root”: “/pool1/docker”
    }
    It doesn’t seem possible to use a sub-directory of zfs data mount point.

  12. Sorry for the poor formatting but when I click “Post Comment” all my formatting vanishes.
    I have a ZFS RAIDZ pool mounted to /pool1
    /pool1 is my data area I would like to use a directory within /pool1 for docker, so /pool1/docker I did the process in this webpage using the below daemon.json contents but my containers disappear, I get “Error response from daemon: No such container” even though the files are there.
    {
    “storage-driver”: “zfs”,
    “data-root”: “/pool1/docker”
    }
    Since /pool1/docker is a sub-directory of the zfs mount point I tried daemon.json with the below contents but docker then refuses to start with the error “Job for docker.service failed because the control process exited with error code.”
    {
    “data-root”: “/pool1/docker”
    }
    It doesn’t seem possible to use a sub-directory of zfs data mount point.

  13. There is a possible problem with this configuration at boot time, in this guide the docker data is moved to another device, but fstab may mount the device after docker is initialized, to fix this problem is required to modify the docker.service
    sudo nano /lib/systemd/system/docker.service
    You’ll see something similar to this
    [Unit]
    Description=Docker Application Container Engine
    Documentation=https://docs.docker.com
    After=network-online.target firewalld.service containerd.service
    Wants=network-online.target
    Requires=docker.socket containerd.service

    The Requires should be changed depending on the unit of your mountpoint, in my case is this one:
    systemctl status mnt-storage.mount
    ● mnt-storage.mount – /mnt/storage
    Loaded: loaded (/etc/fstab; generated)
    Active: active (mounted) since Wed 2021-03-17 17:45:35 CET; 17h ago
    Where: /mnt/storage
    The and the new docker service looks like this:
    [Unit]
    Description=Docker Application Container Engine
    Documentation=https://docs.docker.com
    After=network-online.target firewalld.service containerd.service
    Wants=network-online.target
    Requires=docker.socket containerd.service mnt-storage.mount

    Look at the source where I found the solution here
    https://unix.stackexchange.com/questions/246935/set-systemd-service-to-execute-after-fstab-mount

  14. Thanks, it worked (almost) perfectly for me.

    I am using Docker on my OpenMediaVault 5 (Armbian | Debian Buster) SBC. Everything worked well. My existing Docker stacks came up without errors, except for Portainer – being a Docker container itself.

    It was sufficient to just install Portainer again, using the OMV5 GUI!

    Thanks a lot!

  15. That worked well. Thanks to this guide, I now have a Raspberry Pi running Docker from an SSD and everything else from the SD card.

    Booting a Pi from SSD is a world of pain, particularly with cheap SSD enclosures…. but this did what I need!

  16. I have followed your guidelines, but this didn’t solved my problem with “out of space” error with docker.

  17. Correction:
    Below command did not solve the problem:
    sudo rsync -aHP /var/lib/docker/ /path/to/your/docker

  18. Very useful, thanks!

    I just modified the command-line a bit to make rsync report progress in a more compact way: sudo rsync -a –info=progress2

    This shows the copy progress on a single line of the terminal window, and I find it provides much more useful info.

  19. After applying your steps I noticed that all nodes changed status to NotReady and coredns pod failed with “network plugin is not ready: cni config uninitialized” error. It seemed to be stuck unable to be correctly terminated and recreated. I’m on v1.22.2

Leave a Reply

Your email address will not be published. Required fields are marked *

Back To Top