Docker storage

The following problems related to storage face containerized environments:

  • Container storage is ephemeral. When the container is removed the read-write layer is removed. How can we persist data?

  • Container storage is isolated: containers cannot access each other’s file systems. If they need to share data, this could be a problem

Docker volumes

Docker volumes are the solution to this. Volumes:

  • store data on the host file system (i.e. outside the container)
  • persist data beyond the lifecycle of the container

A Docker volume is a logical volume that exists outside the container file system. It maps to a directory on the host and this location is managed by Docker - not much control over this.

Can be named or anonymous. Anonymous vols are created by Docker as needed. Named come from the user.

Volumes can be named or anonymous. Anonymous volumes are created by Docker as needed. Named volumes are named by the user. In both cases Docker decides where to create the volume.

Creating a volume

docker run -d -rm -v /usr/share/nginx/html nginx:latest

The -v flag indicates volume. The file reference is the mount point within the container. This is how the persistent storage it will appear. The actual volume exists outside of the container anonymously in a place decided by Docker.

To create a named volume you first have to create:

docker volume create volume_name

Then you can designate it:

docker run -d -rm -v volume_name:/usr/share/nginx/html nginx:latest

The actual location is still hidden and decided by Docker.

As these are anonymous they will show ups as GUIDs in the volume viewer in Docker Desktop:

// Add: screenshot

Commands

docker volume ls
docker volume rm
docker volume inspect
docker volume prune // remove all unused volumes

Inspect is only really informative if you are on Linux because it will show you the actual physical path. With Windows and Mac the referernce is to a virtual machine.