Docker Volumes and Bind Mounts

🧩 I. PROBLEMS BEFORE DOCKER VOLUMES & BIND MOUNTS
Before volumes and bind mounts were introduced, people faced several critical limitations when working with Docker containers.
❌ 1. Data Loss on Container Deletion
Containers are ephemeral.
Any file written inside the container's filesystem was destroyed when the container was removed.
For example, an Nginx server writing logs, or a MySQL container storing data — all gone once
docker rm
is executed.
❌ 2. No Host-Container File Sharing
There was no way to access or modify files inside a running container from the host.
Debugging or live-editing a config file or codebase was not possible without committing a new image or rebuilding
🔧 The core issue: Containers had isolated, temporary filesystems that couldn’t interact with the host or persist data reliably.
📁 II. WHAT ARE BIND MOUNTS?
✅ Concept:
Bind mounts allow you to directly map a host directory or file into a container’s filesystem.
📌 Technical Details:
You specify the full path on the host.
Used heavily in development environments for real-time code or config updates.
Changes made on the host are instantly reflected inside the container and vice versa.
🧪 Example:
docker run -v /home/user/code:/app nginx
This maps the host folder /home/user/code
into the container at /app
.
✅ You can now live-edit
/home/user/code/index.html
, and Nginx in the container will serve the updated file immediately.
📦 III. WHAT ARE DOCKER VOLUMES?
✅ Concept:
Docker Volumes are managed storage areas outside the container's filesystem but inside the Docker environment. They’re used to persist and share data between containers and between container and host — without being tied to the container lifecycle.
📌 Technical Details:
Created and managed by Docker (
docker volume create
).Stored under:
/var/lib/docker/volumes/
Decoupled from container lifecycle — deleting the container doesn't remove the volume.
Can be backed up, restored, and shared between multiple containers.
🧪 Example:
docker volume create mydata
docker run -v mydata:/data ubuntu
This mounts the named volume mydata
to the container's /data
directory.
✅ Even if the container is deleted, data in
mydata
remains safe.
✅ Why should you use Docker volumes over bind mounts — especially in production?
Reason | Why Volumes Are Better Than Bind Mounts |
🧹 Managed by Docker | Clean, consistent, portable storage managed internally |
🔒 Better Security | Docker controls access; less risky than exposing host paths |
⚙️ More Portable | Volumes work across OSes & hosts; bind mounts depend on host |
🧠 Abstracted Storage | Docker can use local or remote drivers (e.g., NFS, S3, etc.) |
📈 Better Performance | Optimized, especially on Linux/overlayfs |
📦 Backup/Restore Tools | Native volume snapshot/backup support |
🔁 Reusability | Volumes can be shared across multiple containers cleanly |
Playing around with Bind Mounts
- Installing docker:
sudo apt update
sudo apt install docker.io -y
sudo usermod -aG docker ubuntu
i a) ubuntu in 3rd command is username of host machine on which u install docker. To exactly determine the username of ur host, run whoami
command.
i b) Restart the host machine to apply changes.
Now make a folder
bind_mounts
and navigate into it.Now write a sample
index.html
and runchmod -R a+rX $(pwd)
command.Now run a httpd:2.4 docker container with
docker run -d --name my_site -p 8000:80 --mount type=bind,source=$(pwd),target=/usr/local/apache2/htdocs httpd:2.4
Now in ur terminal visit port 8000 by
curl
localhost:8000
. U can see urindex.html
code.If u edit
index.html
file one more time and visitcurl
localhost:8000
u can see the changes reflected.Now even though ur container is deleted, the file still remains in the host directory.
Playing around with Docker volumes:
Some important commands :
docker volume create rajesh # To create a volume with name as rajesh
docker volume inspect rajesh # To know info about rajesh volume
docker volume rm rajesh suresh mahesh # To delete multiple volumes
docker volume ls # To list volumes
docker run -d --mount source=rajesh,target=/app nginix:latest
# To attach the volume " rajesh " which stores data of /app of nginix container
# Remember if u want to delete a volume, first stop running containers associated with it,
# and only then u can delete the volume.
Let’s try:
docker run --name=db -e POSTGRES_PASSWORD=abcd -d -v raj:/var/lib/postgresql/data postgres # This will start the database in the background, configure it with a password, # and attach a volume or creates new volume raj if not present. docker exec -ti db psql -U postgres # login into postgres cli of db container CREATE TABLE tasks ( id SERIAL PRIMARY KEY, description VARCHAR(100) ); INSERT INTO tasks (description) VALUES ('Finish work'), ('Have fun'); # This will create a "tasks" table and inserts 2 records into it select * from tasks; # u can list those 2 entries of tasks table with this command docker stop db docker rm db # stop and delete db container docker run --name=new-db -e -d -v raj:/var/lib/postgresql/data postgres # a new container new-db will the attached the raj volume, but notice # env variable not used because that variable is only used when bootstrapping a new db. select * from tasks; # now it will list same entries as old container db.
Subscribe to my newsletter
Read articles from Rajesh Gurajala directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
