Docker Week: Day 3 – Hands-On Guide to Docker Volumes: Managing Data in Containers

I’m a Cloud/DevOps enthusiast currently learning how to build and manage reliable, scalable solutions. I’m excited about exploring modern technologies and best practices to streamline development and deployment processes. My aim is to gain hands-on experience and contribute to creating robust systems that support growth and success in the tech world.
Saturday, 21st September 2024
What Are Docker Volumes?
When working with containers, data management is crucial, especially since data inside a container can disappear as soon as the container stops or is removed. Docker Volumes help by providing a way to persist and share data across containers and sessions. In this hands-on guide, we'll focus on practical steps and examples for using Docker volumes in real-world scenarios.
Why Docker Volumes Matter
Volumes are critical for DevOps, Cloud Engineers, and anyone working with containerized applications. They help:
Persist Data: Keep important data even after the container is deleted.
Share Data Between Containers: Multiple containers can access the same volume, making data sharing easy.
Simplify Backups: Volumes can be backed up independently of containers.
Getting Started with Docker Volumes
Now, let’s jump into practical steps to create and manage volumes with hands-on examples. These examples assume you have Docker installed.
1. Creating and Using a Docker Volume
Start by creating a Docker volume and using it inside a container.
Create a Volume: Run the following command to create a new volume:
docker volume create my_data_volumeDocker will manage this volume independently of containers.
Run a Container with the Volume Attached: Now, let's run an NGINX container and attach the newly created volume:
docker run -d --name my_nginx -v my_data_volume:/usr/share/nginx/html nginx-druns the container in detached mode.-vattaches themy_data_volumeto/usr/share/nginx/htmlinside the container.
With this command, any data written to /usr/share/nginx/html inside the container will be stored in the volume and will persist.
Test the Volume: Now, let’s add a simple HTML file to the volume and see if it shows up in the container. On your host machine, run:
echo "<h1>Hello from Docker Volumes!</h1>" > /var/lib/docker/volumes/my_data_volume/_data/index.htmlAccess the NGINX container via your browser (http://localhost:80), and you should see the message: "Hello from Docker Volumes!" This shows that data stored in the volume is accessible by the container.
2. Sharing Data Between Containers with Volumes
Now let’s see how two containers can share the same volume. This is useful for applications that need access to shared data, such as a database and an application container.
Create Two Containers Sharing the Same Volume: First, stop the previous NGINX container:
docker stop my_nginxNow, create two containers and share the
my_data_volumebetween them:docker run -d --name web1 -v my_data_volume:/app_data nginx docker run -d --name web2 -v my_data_volume:/app_data nginxBoth containers now have access to the
/app_datadirectory.Add Data from One Container: Add a new file inside the first container:
docker exec web1 bash -c "echo 'Data from web1' > /app_data/web1.txt"Access the Data from the Second Container: Check if the second container can see the data added by the first container:
docker exec web2 cat /app_data/web1.txtThe output should be:
Data from web1. This demonstrates how data can be shared between containers using Docker volumes.
3. Managing Volumes with Docker Compose
In real-world scenarios, especially with multi-container applications, using Docker Compose is a great way to manage containers and volumes together.
Create a Docker Compose File: Create a
docker-compose.ymlfile that defines a web service and a volume:version: "3.9" services: web: image: nginx volumes: - web_data:/usr/share/nginx/html ports: - "8080:80" volumes: web_data:The service
webuses thenginximage and maps theweb_datavolume to the NGINX web directory.The volume
web_datais defined in thevolumessection.
Run the Containers: Run the Docker Compose file:
docker-compose up -dDocker will automatically create the volume and attach it to the
webcontainer. You can verify this by checking the list of volumes:docker volume lsAccess the Container: Open a terminal inside the running container and add data to the volume:
docker exec -it web bash echo "Hello from Docker Compose!" > /usr/share/nginx/html/index.htmlOpen your browser and visit
http://localhost:8080. You should see the message "Hello from Docker Compose!"
4. Removing Docker Volumes
When you no longer need a volume, you can remove it to free up space. Here's how:
Stop and Remove Containers: Before removing a volume, ensure that no containers are using it:
docker stop web1 web2 docker rm web1 web2Remove the Volume: Once the containers are removed, you can safely delete the volume:
docker volume rm my_data_volumeYou can confirm the volume is deleted by running:
docker volume ls
Common Use Cases for Docker Volumes
Here are some real-world examples where Docker volumes are frequently used:
Database Containers: Use volumes to store database data like MySQL or PostgreSQL so that it persists across container restarts.
Log Storage: Store logs outside of the container so you can analyze or back them up even if the container is destroyed.
Configuration Files: Share configuration files between multiple containers that need the same settings.
Why Docker Volumes Are Essential for Cloud and DevOps Engineers
As a cloud or DevOps engineer, managing data is critical in production environments where containers are often stopped, restarted, or scaled across clusters. Docker volumes ensure that crucial data (e.g., database information, logs, configurations) is not lost during these operations, providing stability and continuity in your applications.
By integrating Docker volumes into CI/CD pipelines or orchestrating multiple services, engineers can confidently manage data across a complex infrastructure.
Conclusion
Docker volumes are an essential tool for managing persistent data in containerized applications. This hands-on guide covered practical ways to create, manage, and use volumes in real-world scenarios. Whether you’re sharing data between containers or ensuring that data remains available across restarts, volumes offer a powerful, flexible solution.
In the next post, we'll dive deeper into Docker Networking and explore how containers communicate with each other. Stay tuned for Day 4 of Docker Week!



