DockerDocker Data Volumes

Introduction

Docker data volumes provide a way to persist data independent of a container's life cycle. Volumes present a number of helpful features such as:

Mounting a host directory within the container, sharing data in-between containers using the filesystem and preserving data if a container gets deleted

Syntax

  • docker volume [OPTIONS] [COMMAND]

Mounting a directory from the local host into a container

It is possible to mount a host directory to a specific path in your container using the -v or --volume command line option. The following example will mount /etc on the host to /mnt/etc in the container:

(on linux) docker run -v "/etc:/mnt/etc" alpine cat /mnt/etc/passwd
(on windows)  docker run -v "/c/etc:/mnt/etc" alpine cat /mnt/etc/passwd

The default access to the volume inside the container is read-write. To mount a volume read-only inside of a container, use the suffix :ro:

docker run -v "/etc:/mnt/etc:ro" alpine touch /mnt/etc/passwd

Creating a named volume

docker volume create --name="myAwesomeApp"

Using a named volume makes managing volumes much more human-readable. It is possible to create a named volume using the command specified above, but it's also possible to create a named volume inside of a docker run command using the -v or --volume command line option:

docker run -d --name="myApp-1" -v="myAwesomeApp:/data/app" myApp:1.5.3

Note that creating a named volume in this form is similar to mounting a host file/directory as a volume, except that instead of a valid path, the volume name is specified. Once created, named volumes can be shared with other containers:

docker run -d --name="myApp-2" --volumes-from "myApp-1" myApp:1.5.3

After running the above command, a new container has been created with the name myApp-2 from the myApp:1.5.3 image, which is sharing the myAwesomeApp named volume with myApp-1. The myAwesomeApp named volume is mounted at /data/app in the myApp-2 container, just as it is mounted at /data/app in the myApp-1 container.