Skip to content

Volume

Info

All the volumes are stored in /var/lib/docker/volumes.
The volumes are mounted as read-write by default.

Docker volume is used to persist and share the container's data across containers. Folders on your host machine's hard drive are mounted into containers as volumes, which allows the container to write its data into the host volumes.

Volume types

Anonymous and named volumes

Volume Type Description
Anonymous The volume will only exist as long as our container exists. Bind mount volumes can prevent some files from being overlapped.
Named The volume persists even if you kill or close the container. With this volume, you can't edit the data inside the volume, instead you can use bind mounts for editing
Bash
# Example of Anonymous volume
docker run -v /app/logs <image>

# Example of Named volume
docker run -v mylog:/app/logs apiapp
docker run --mount source=mylog,destination=/app/logs apiapp

Bind mounts

Reference

The source and the destination must be absolute path

The use of bind mounts is good for development, but not for production since production might not have the same folder structure as development. To make managing different environments easier, I recommend the container has the same structure as your local.

  • macOS / Linux = $(pwd):/app
  • Windows = "%cd%":/app

Bind mounts allow you to edit or reflect your code changes from local to container. Bind mount volumes can prevent some files from being overlapped. It's great for persistent.

Bash
docker run -v <local-path>:<container-path> <image>
docker run --mount type=<type>,source=<local-path>,destination=<container-path> <image>

# example
docker run -v /app/api:/app/api myapi
docker run --mount type=bind,source=/app/api,destination=/app/api myapi

Read-only volume

Read-only volume will prevent the local files from being modified when the files within the container have been modified.

Bash
docker run --mount type=<type>,source=<local-path>,target=<container-path>,readonly <image>
docker run -v "<local-path>:<container-path>:ro"

# example
docker run --mount type=bind,source=/root/logs,target=/api/logs,readonly myapi
docker run -v "/root/logs:/api/logs:ro"

readonly and :ro are to indicate that this volume is only for reading

List volume

Bash
docker volume ls

Create volume

Bash
docker volume create <volume-name>

Inspect volume

Bash
docker volume inspect <volume-name>

Remove volume

Bash
docker volume rm <volume-name>
docker volume remove <volume-name>
docker volume prune