Michael Barton
Michael Barton

Reputation: 9546

How to change the docker image installation directory?

From what I can tell, docker images are installed to /var/lib/docker as they are pulled. Is there a way to change this location, such as to a mounted volume like /mnt?

Upvotes: 287

Views: 238626

Answers (21)

diether18
diether18

Reputation: 1

On Docker v26.0.1 and debian 12 by changing properties in docker.service file.
Generally I use step by step this answer: https://stackoverflow.com/a/56126715/22904257 but as someone mention the flag "-g" doesn't work (I cannot restart service) and I change the flag in line like this:

ExecStart=/usr/bin/dockerd --data-root /my/path/for/containers -H fd:// --containerd=/run/containerd/containerd.sock

Upvotes: 0

mechnicov
mechnicov

Reputation: 15248

This blog post helps me

Here are the steps to change the directory even after you’ve created Docker containers etc.

Note, you don’t need to edit docker.service or init.d files, as it will read the change from the .json file mentioned below.

  1. Edit /etc/docker/daemon.json (if it doesn't exist, create it)

  2. Add the following

{
  "data-root": "/new/path/to/docker-data"
}
  1. Stop docker
sudo systemctl stop docker
  1. Check docker has been stopped
ps aux | grep -i docker | grep -v grep
  1. Copy the files to the new location
sudo rsync -axPS /var/lib/docker/ /new/path/to/docker-data
  1. Start Docker back up
sudo systemctl start docker
  1. Check Docker has started up using the new location
docker info | grep 'Docker Root Dir'
  1. Check everything has started up that should be running
docker ps
  1. Leave both copies on the server for a few days to make sure no issues arise, then feel free to delete it.
sudo rm -r /var/lib/docker

Upvotes: 8

Sileria
Sileria

Reputation: 15612

The official way of doing this based on this Post-installation steps for Linux guide and what I found while web-crawling is as follows:

  1. Override the docker service conf:

     sudo systemctl edit docker.service
    
  2. Add or modify the following lines, substituting your own values.

     [Service]
     ExecStart=
     ExecStart=/usr/bin/dockerd --graph="/mnt/docker"
    

Save the file. (It creates: /etc/systemd/system/docker.service.d/override.conf)

  1. Reload the systemctl configuration.

     sudo systemctl daemon-reload
    
  2. Restart Docker.

     sudo systemctl restart docker.service
    

After this if you can nuke /var/lib/docker folder if you do not have any images there you care to backup.

Upvotes: 6

Sreekanth
Sreekanth

Reputation: 1947

I was having docker version 19.03.14. Below link helped me.

Check this Link

in /etc/docker/daemon.json file I added below section:-

 {
    "data-root": "/hdd2/docker",
    "storage-driver": "overlay2"
 }

Upvotes: 3

andreas-supersmart
andreas-supersmart

Reputation: 4294

For new docker versions we need to use data-root as graph is deprecated in v17.05.0: official deprecated docs

Edit /etc/docker/daemon.json (if it doesn’t exist, create it) and include:

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

Then restart Docker with:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • A more detailed step-by-step explanation (including moving data) using Docker Storage with data-root can be found in: Blog post
  • In case of Windows a similar post Windows specific

Upvotes: 154

Abdullah
Abdullah

Reputation: 489

For Those looking in 2020. The following is for Windows 10 Machine:

  1. In the global Actions pane of Hyper-V Manager click Hyper-V Settings…
  2. Under Virtual Hard Disks change the location from the default to your desired location.
  3. Under Virtual Machines change the location from the default to your desired location, and click apply.

enter image description here

  1. Click OK to close the Hyper-V Settings page.

Upvotes: 0

fnjn
fnjn

Reputation: 1331

Much easier way to do so:

Stop docker service

sudo systemctl stop docker

Move existing docker directory to new location

sudo mv /var/lib/docker/ /path/to/new/docker/

Create symbolic link

sudo ln -s /path/to/new/docker/ /var/lib/docker

Start docker service

sudo systemctl start docker

Upvotes: 79

mbarthelemy
mbarthelemy

Reputation: 12913

With recent versions of Docker, you would set the value of the data-root parameter to your custom path, in /etc/docker/daemon.json (according to https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file).

With older versions, you can change Docker's storage base directory (where container and images go) using the -goption when starting the Docker daemon. (check docker --help). You can have this setting applied automatically when Docker starts by adding it to /etc/default/docker

Upvotes: 195

Piotr Król
Piotr Król

Reputation: 3450

Following advice from comments I utilize Docker systemd documentation to improve this answer. Below procedure doesn't require reboot and is much cleaner.

First create directory and file for custom configuration:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo $EDITOR /etc/systemd/system/docker.service.d/docker-storage.conf

For docker version before 17.06-ce paste:

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --graph="/mnt"

For docker after 17.06-ce paste:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --data-root="/mnt"

Alternative method through daemon.json

I recently tried above procedure with 17.09-ce on Fedora 25 and it seem to not work. Instead of that simple modification in /etc/docker/daemon.json do the trick:

{
    "graph": "/mnt",
    "storage-driver": "overlay"
}

Despite the method you have to reload configuration and restart Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

To confirm that Docker was reconfigured:

docker info|grep "loop file"

In recent version (17.03) different command is required:

docker info|grep "Docker Root Dir"

Output should look like this:

 Data loop file: /mnt/devicemapper/devicemapper/data
 Metadata loop file: /mnt/devicemapper/devicemapper/metadata

Or:

 Docker Root Dir: /mnt

Then you can safely remove old Docker storage:

rm -rf /var/lib/docker

Upvotes: 172

Euan
Euan

Reputation: 579

On Fedora 26 and probably many other versions, you may encounter an error after moving your base folder location as described above. This is particularly true if you are moving it to somewhere under /home. This is because SeLinux kicks in and prevents the docker container from running many of its programs from under this location.

The short solution is to remove the --enable-selinux option when you add the -g parameter.

Upvotes: 2

Pranjal Sahu
Pranjal Sahu

Reputation: 1469

For Mac users in the 17.06.0-ce-mac19 version you can simply move the Disk Image location from the user interface in the preferences option Just change the location of the disk image and it will work (by clicking Move disk Image) and restarting the docker. Using this approach I was able to use my external hardisk for storing docker images.

Upvotes: 0

Topera
Topera

Reputation: 12389

Copy-and-paste version of the winner answer :)

Create this file with only this content:

$ sudo vi /etc/docker/daemon.json

  {
      "graph": "/my-docker-images"
  }

Tested on Ubuntu 16.04.2 LTS in docker 1.12.6

Upvotes: 13

ivandov
ivandov

Reputation: 653

As recommneded by @mbarthelemy this can be done via the -g option when starting the docker daemon directly.

However, if docker is being started as a system service, it is not recommended to modify the /etc/default/docker file. There is a guideline to this located here.

The correct approach is to create an /etc/docker/daemon.json file on Linux (or Mac) systems or %programdata%\docker\config\daemon.json on Windows. If this file is not being used for anything else, the following fields should suffice:

{
    "graph": "/docker/daemon_files"
}

This is assuming the new location where you want to have docker persist its data is /docker/daemon_files

Upvotes: 5

Mahlatse Makalancheche
Mahlatse Makalancheche

Reputation: 441

On openSUSE Leap 42.1

$cat /etc/sysconfig/docker 
## Path           : System/Management
## Description    : Extra cli switches for docker daemon
## Type           : string
## Default        : ""
## ServiceRestart : docker
#
DOCKER_OPTS="-g /media/data/installed/docker"

Note that DOCKER_OPTS was initially empty and all I did was add in the argument to make docker use my new directory

Upvotes: 2

George Fisher
George Fisher

Reputation: 3346

On an AWS Ubuntu 16.04 Server I put the Docker images on a separate EBS, mounted on /home/ubuntu/kaggle/, under the docker dir

This snippet of my initialization script worked correctly

# where are the images initially stored?
sudo docker info | grep "Root Dir"
# ... not where I want them

# modify the configuration files to change to image location
# NOTE this generates an error
# WARNING: Usage of loopback devices is strongly discouraged for production use.
#          Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
# see https://stackoverflow.com/questions/31620825/
#     warning-of-usage-of-loopback-devices-is-strongly-discouraged-for-production-use

sudo sed -i   ' s@#DOCKER_OPTS=.*@DOCKER_OPTS="-g /home/ubuntu/kaggle/docker"@ '  /etc/default/docker

sudo chmod -R ugo+rw /lib/systemd/system/docker.service
sudo cp  /lib/systemd/system/docker.service /etc/systemd/system/
sudo chmod -R ugo+rw /etc/systemd/system/

sudo sed -i ' s@ExecStart.*@ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://@ '  /etc/systemd/system/docker.service
sudo sed -i '/ExecStart/a EnvironmentFile=-/etc/default/docker' /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info | grep "Root Dir"
# now they're where I want them

Upvotes: 1

Sudeepta
Sudeepta

Reputation: 2204

This solution works on Red Hat 7.2 & Docker 1.12.0

Edit the file /lib/systemd/system/docker.service in your text editor.

add -g /path/to/docker/ at the end of ExecStart directive. The complete line should look like this.

ExecStart=/usr/bin/dockerd -g /path/to/docker/

Execute the below command

systemctl daemon-reload
systemctl restart docker

Execute the command to check docker directory

docker info | grep "loop file\|Dir"

If you have /etc/sysconfig/docker file in Red Hat or docker 1.7.1 check this answer.

Upvotes: 15

modulitos
modulitos

Reputation: 15804

For Debian/Ubuntu or Fedora, you can probably use the other answers. But if you don't have files under /etc/default/docker or /etc/sysconfig/docker, and your system is running systemd, you may want to follow this answer by h3nrik. I am using Arch, and this works for me.

Basically, you need to configure systemd to read the new docker image location as an environment variable, and pass that environment variable into the Docker daemon execution script.

For completeness, here is h3nrick's answer:


Do you have a /lib/systemd/system/docker.service file?

If so, edit it so that the Docker service uses the usual /etc/default/docker as an environment file: EnvironmentFile=-/etc/default/docker.

In the /etc/default/docker file then add DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images".

At the end just do a systemctl daemon-reload && systemctl restart docker.

For further information please also have a look at the documentation.

Upvotes: 6

Vitor
Vitor

Reputation: 2792

Since I haven't found the correct instructions for doing this in Fedora (EDIT: people pointed in comments that this should also work on CentOS and Suse) (/etc/default/docker isn't used there), I'm adding my answer here:

You have to edit /etc/sysconfig/docker, and add the -g option in the OPTIONS variable. If there's more than one option, make sure you enclose them in "". In my case, that file contained:

OPTIONS=--selinux-enabled

so it would become

OPTIONS="--selinux-enabled -g /mnt"

After a restart (systemctl restart docker) , Docker should use the new directory

Upvotes: 41

sean kim
sean kim

Reputation: 131

In CentOS 6.5

service docker stop
mkdir /data/docker  (new directory)
vi /etc/sysconfig/docker

add following line

other_args=" -g /data/docker -p /var/run/docker.pid"

then save the file and start docker again

service docker start

and will make repository file in /data/docker

Upvotes: 13

liuyanghejerry
liuyanghejerry

Reputation: 3871

A much simpler solution is to create a soft link point to whatever you want, such as

link -s /var/lib/docker /mnt/whatever

It works for me on my CentOS 6.5 server.

Upvotes: 4

suther
suther

Reputation: 13578

Don't use a symbolic Link to move the docker folder to /mnt (for example). This may cause in trouble with the docker rm command.

Better use the -g Option for docker. On Ubuntu you can set it permanently in /etc/default/docker.io. Enhance or replace the DOCKER_OPTS Line.

Here an example: `DOCKER_OPTS="-g /mnt/somewhere/else/docker/"

Upvotes: 25

Related Questions