Docker volume backup and restore

Solution 1:

You're right. Since you can have multiple containers with volumes on their own, you need to keep track which volume corresponds to which container. How to do that depends on your setup: I use the name -data for the data container, so it's obvious to which container a image belongs. That way it can be backed up like this:

VOLUME=`docker inspect $NAME-data | jq '.[0].Volumes["/path/in/container"]'`
tar -C $VOLUME . -czvf $NAME.tar.gz

Now you just need to rebuild your image and recreate your data container:

cat $NAME.tar.gz | docker run -name $NAME-data -v /path/in/container \
                              -i busybox tar -C /path/int/container -xzf -

So this means you need to backup:

  • Dockerfile
  • volume
  • volume path in container
  • name of the container the volume belongs to

Update: In the meanwhile I created a tool to backup containers and their volume(s) (container(s)): https://github.com/discordianfish/docker-backup and a backup image that can create backups and push them to s3: https://github.com/discordianfish/docker-lloyd

Solution 2:

In newer Docker (tested in 1.9.1, build 9894698) you can use the cp command.

Here is an example how to copy a directory from the container to the host:

docker cp wordpress:/var/www/html backups/wordpress.`date +"%Y%m%d"`/

Here is an example how to copy a directory from the container to a tar file:

docker cp wordpress:/var/www/html - > backups/wordpress.`date +"%Y%m%d"`.tar

Last but not least an example how to copy a directory from the container to a tar.gz file:

docker cp wordpress:/var/www/html - | gzip > backups/wordpress.`date +"%Y%m%d"`.tar.gz

Tags:

Docker

Backup