MEHDI.
RETURN_TO_INDEX

Docker Volumes Explained: Why Your Data Disappears

3 min read
#Docker#DevOps#Containers

Introduction

As a developer new to Docker, one of the most common issues you may encounter is losing data after restarting a container. This can be frustrating, especially if you've spent hours setting up your application. In this article, I'll explain Docker volumes, bind mounts, and tmpfs, and provide examples of how to use them to persist data.

What are Docker Volumes?

Docker volumes are directories that are shared between the host machine and a container. They allow you to persist data even after a container is restarted or deleted. Volumes are stored on the host machine, and can be managed using the docker volume command.

Creating a Docker Volume

To create a Docker volume, you can use the following command:

docker volume create my-volume

This will create a new volume named my-volume. You can then use this volume in your Docker container by mounting it to a directory.

Bind Mounts

Bind mounts are similar to volumes, but they are tied to a specific directory on the host machine. When you use a bind mount, you're essentially mapping a directory on the host machine to a directory in the container. This allows you to access files on the host machine from within the container.

Using Bind Mounts

To use a bind mount, you can use the -v flag when running a container:

docker run -v /path/to/host/directory:/path/to/container/directory my-image

This will mount the /path/to/host/directory directory on the host machine to the /path/to/container/directory directory in the container.

Tmpfs

Tmpfs is a temporary file system that stores files in memory. It's faster than storing files on disk, but the data is lost when the container is restarted. Tmpfs is useful for storing temporary data that doesn't need to be persisted.

Using Tmpfs

To use tmpfs, you can use the --tmpfs flag when running a container:

docker run --tmpfs /path/to/container/directory my-image

This will mount a tmpfs file system to the /path/to/container/directory directory in the container.

Using Docker Compose

Docker Compose is a tool that allows you to define and run multi-container Docker applications. You can use Docker Compose to define volumes, bind mounts, and tmpfs mounts for your containers.

Example Docker Compose File

Here's an example Docker Compose file that defines a volume and a bind mount:

version: '3'
services:
  web:
    image: my-image
    volumes:
      - my-volume:/path/to/container/directory
      - ./path/to/host/directory:/path/to/container/directory
    tmpfs:
      - /path/to/container/directory

volumes:
  my-volume:

This will create a new volume named my-volume and mount it to the /path/to/container/directory directory in the web container. It will also mount the ./path/to/host/directory directory on the host machine to the /path/to/container/directory directory in the container, and mount a tmpfs file system to the /path/to/container/directory directory.

Practical Takeaways

To avoid losing data after container restarts, make sure to use Docker volumes or bind mounts to persist data. Use the docker volume command to create and manage volumes, and the -v flag to use bind mounts. Use tmpfs for temporary data that doesn't need to be persisted. Define volumes, bind mounts, and tmpfs mounts in your Docker Compose file to simplify your workflow. By following these best practices, you can ensure that your data is persisted even after container restarts.