Docker: Volumes

How to persist your container data with Docker volumes

👋 Welcome to the Stackhero documentation!

Stackhero offers a ready-to-use Docker cloud CaaS (Containers as a Service) solution that provides a host of benefits, including:

  • Easily deploy your containers to production with just a docker-compose up.
  • Customisable domain name secured with HTTPS (for example, https://api.your-company.com, https://www.your-company.com, https://backoffice.your-company.com).
  • Optimal performance and robust security powered by a private and dedicated VM.
  • Effortless updates with just a click.

Save time and simplify your life: it only takes 5 minutes to try Stackhero's Docker CaaS cloud hosting solution and deploy your containers to production!

By design, Docker containers are ephemeral. This means that any data stored directly within them will be lost when the container is removed or replaced by another instance. To ensure data persistence, Docker volumes are the recommended approach.

Do not use bind mounts on Stackhero. Always opt for Docker volumes to prevent data loss.

Bind mounts involve linking a directory from the Stackhero host VM to a container. However, if you rely on bind mounts, updating your Stackhero for Docker instance will result in the loss of all data stored this way.

Bind mounts are commonly specified in the docker run command with syntax like -v /myDirectory:/mnt (note the leading /). In Docker Compose files, they appear as volumes: /myDirectory:/mnt. Avoid these configurations or you will lose your data.

Instead, use Docker volumes, which are managed by Docker and do not reference absolute paths.

To summarise:

Incorrect approach:

docker run -it -v /myDirectory:/mnt alpine

Correct approach:

docker volume create myVolume
docker run -it -v myVolume:/mnt alpine

When working with Docker Compose files:

Incorrect configuration:

services:
  myService:
    image: alpine
    volumes:
      - /myDirectory:/mnt

Correct configuration:

services:
  myService:
    image: alpine
    volumes:
      - myVolume:/mnt

volumes:
  myVolume:
    name: myVolume

Here is a quick reference for managing Docker volumes:

  • To create a new volume named myVolume, run:

    docker volume create myVolume
    
  • To list all existing volumes:

    docker volume ls
    
  • To remove a specific volume named myVolume:

    docker volume rm myVolume
    

    Note: Removing a volume will permanently delete all data stored within it, and there is no way to retrieve it afterwards.