You can change Docker’s storage base directory (where container and images go) using the -g option when starting the Docker daemon.
Ubuntu/Debian: edit your /etc/default/docker file with the -g option: DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
Fedora/Centos: edit /etc/sysconfig/docker, and add the -g option in the other_args variable: ex. other_args="-g /var/lib/testdir". If there’s more than one option, make sure you enclose them in " ". After a restart, (service docker restart) Docker should use the new directory.
Using a symlink is another method to change image storage.
Caution - These steps depend on your current /var/lib/docker being an actual directory (not a symlink to another location).
Stop docker: service docker stop. Verify no docker process is running ps faux
Double check docker really isn’t running. Take a look at the current docker directory: ls /var/lib/docker/
2b) Make a backup - tar -zcC /var/lib docker > /mnt/pd0/var_lib_docker-backup-$(date +%s).tar.gz
Move the /var/lib/docker directory to your new partition: mv /var/lib/docker /mnt/pd0/docker
Make a symlink: ln -s /mnt/pd0/docker /var/lib/docker
Take a peek at the directory structure to make sure it looks like it did before the mv: ls /var/lib/docker/ (note the trailing slash to resolve the symlink)
I could not rsync or mv or cp /var/lib/docker to /opt. Yes, I had docker daemon turned off and chkconfig docker off before reboot etc. These attempts to move the data never finished running.
Thankfully I did not have any images or containers to move so I was able to change the default dir in /etc/sysconfig/docker and voila, all the docker “run files” were created in /opt/docker. I didn’t even need to create /opt/docker, the init did that for me.
So bottom line is, if you have no images you need to preserve, just add the path to /etc/sysconfig/docker (rhel) or /etc/defaults/docker (debian) and you’re done. You can then nuke /var/lib/docker.
I have tried 1st method but it doesn’t work for me. Docker still uses default storage base directory. It seems that if we already used docker it won’t work.
From log:
Feb 13 09:50:03 ns521998.ip-158-69-122.net docker[18575]: time="2016-02-13T09:50:03.195265953-05:00" level=warning msg="devmapper: Base device already exists and has filesystem xfs on it. User specified filesystem will be ignored."
Feb 13 09:50:03 ns521998.ip-158-69-122.net docker[18575]: time="2016-02-13T09:50:03.197918418-05:00" level=info msg="[graphdriver] using prior storage driver \"devicemapper\""
UPDATE
I have tried to remove existing data but docker recreates them on service start:
Feb 13 12:38:22 ns521998.ip-158-69-122.net docker[29109]: time="2016-02-13T12:38:22.540846940-05:00" level=info msg="devmapper: Creating filesystem xfs on device docker-9:1-783632-base"
Feb 13 12:38:22 ns521998.ip-158-69-122.net docker[29109]: time="2016-02-13T12:38:22.693869639-05:00" level=info msg="devmapper: Successfully created filesystem xfs on device docker-9:1-783632-base"
So what is wrong with option -g?
I’m using Ubuntu 15.10 x86_64 and
Docker version 1.10.1, build 9e83765
I tried this method, but the instructions for Centos are only accurate for version 6.5 and below. Unfortunately I am running 7.0.
I tried to revert everything by moving the /var/lib/docker directory back to its original location, but now when I run docker images or docker ps -a, I have no containers or images. The docker folder is still the same size as it was.
I’ve tried restarting the VM and the docker service, but still have no images or containers. Any help would be greatly appreciated
The solution worked for me, but we are facing strange space utilization issue after performing above steps
Steps followed:-
Size of the directory 856M /var/lib/docker
tar -zcC /var/lib docker > /ganana-ha/var/lib/var_lib_docker-backup-$(date +%s).tar.gz
Size of the tar file 258M /ganana-ha/var/lib/var_lib_docker-backup-1466335482.tar.gz
tar -xvzf /ganana-ha/var/lib/var_lib_docker-backup-1466335482.tar.gz -C /ganana-ha/var/lib/
Backup mv /var/lib/docker /var/lib/docker-backup
ln -sv /ganana-ha/var/lib/docker /var/lib/
Size of the directory after untar 103G /ganana-ha/var/lib/docker
Question
Why there is a size difference between this process.
The -g option on Ubuntu 16.04 with docker-engine 1.12.1-0 from< official PPA is completely ignored:
Before docker-engine is even installed in /etc/default/docker:
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -g /media/actionmystique/SAMSUNG-850-Ext4/Docker"
/var/lib/docker does not exist
/media/actionmystique/SAMSUNG-850-Ext4/Docker is empty
After installation without overwriting the /etc/default/docker file:
ll /var/lib/docker
drwx--x--x 10 root root 4096 Aug 28 14:58 ./
drwxr-xr-x 112 root root 4096 Aug 28 14:58 ../
drwx------ 5 root root 4096 Aug 28 14:58 aufs/
drwx------ 2 root root 4096 Aug 28 14:58 containers/
drwx------ 3 root root 4096 Aug 28 14:58 image/
drwxr-x--- 3 root root 4096 Aug 28 14:58 network/
drwx------ 2 root root 4096 Aug 28 14:58 swarm/
drwx------ 2 root root 4096 Aug 28 14:58 tmp/
drwx------ 2 root root 4096 Aug 28 14:58 trust/
drwx------ 2 root root 4096 Aug 28 14:58 volumes/
/media/actionmystique/SAMSUNG-850-Ext4/Docker is empty
Using the symlink is the way to go.
Also, the correct commands to control docker service are:
systemctl stop docker
install the symlink as explained by @nhazlett
systemctl start docker
systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2016-08-28 15:12:22 CEST; 7s ago
Docs: https://docs.docker.com
Main PID: 7097 (dockerd)
Tasks: 24
Memory: 17.5M
CPU: 429ms
CGroup: /system.slice/docker.service
├─7097 /usr/bin/dockerd -H fd://
└─7104 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --st
Aug 28 15:12:22 samsung-ubuntu dockerd[7097]: time="2016-08-28T15:12:22.331839947+02:00" level=info msg="[graphdriver] using prior storage driver \"aufs\""
Aug 28 15:12:22 samsung-ubuntu dockerd[7097]: time="2016-08-28T15:12:22.341400411+02:00" level=info msg="Graph migration to content-addressability took 0.00 seconds"
Aug 28 15:12:22 samsung-ubuntu dockerd[7097]: time="2016-08-28T15:12:22.341959470+02:00" level=info msg="Loading containers: start."
Aug 28 15:12:22 samsung-ubuntu dockerd[7097]: time="2016-08-28T15:12:22.346940335+02:00" level=info msg="Firewalld running: false"
Aug 28 15:12:22 samsung-ubuntu dockerd[7097]: time="2016-08-28T15:12:22.587848771+02:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.22.0.0/1
Aug 28 15:12:22 samsung-ubuntu dockerd[7097]: time="2016-08-28T15:12:22.719073186+02:00" level=info msg="Loading containers: done."
Aug 28 15:12:22 samsung-ubuntu dockerd[7097]: time="2016-08-28T15:12:22.719141624+02:00" level=info msg="Daemon has completed initialization"
Aug 28 15:12:22 samsung-ubuntu dockerd[7097]: time="2016-08-28T15:12:22.719159156+02:00" level=info msg="Docker daemon" commit=23cf638 graphdriver=aufs version=1.12.1
Aug 28 15:12:22 samsung-ubuntu systemd[1]: Started Docker Application Container Engine.
Aug 28 15:12:22 samsung-ubuntu dockerd[7097]: time="2016-08-28T15:12:22.723875496+02:00" level=info msg="API listen on /var/run/docker.sock"
I did both options on a VPS with an sshfs storage vps connected as the image location. I keep getting an error when doing “docker pull ubuntu” -> failed to register layer: Error processing tar file(exit status 1): lchown /bin/dnsdomainname: no such file or directory
I have followed instructions in Runtime directory and storage driver on Ubuntu 16.04.1:
mkdir /etc/systemd/system/docker.service.d
create some drop-in.conf file in /etc/systemd/system/docker.service.d , e.g. docker-overlay.conf
add these lines into drop-in file, replace “/mnt/docker-data” with your new docker data location: [Service] ExecStart= ExecStart=/usr/bin/dockerd --graph="/mnt/docker-data" --storage-driver=overlay