# 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

```sh
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.
