Docker Volumes & Storage
đ 14. What are Docker volumes, and why are they needed?â
Docker volume āĻšāϞ⧠Docker-āĻāϰ manage āĻāϰāĻž āĻāĻāĻāĻŋ persistent storage mechanism, āϝāĻž container-āĻāϰ āĻŦāĻžāĻāϰ⧠data āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§āĨ¤
āĻā§āύ āĻĻāϰāĻāĻžāϰ? Container āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻāĻāĻžāĻŦā§ stateless â āĻ āϰā§āĻĨāĻžā§ container āĻŦāύā§āϧ āĻŦāĻž delete āĻšāϞ⧠āϤāĻžāϰ āĻā§āϤāϰā§āϰ āϏāĻŦ data āĻŽā§āĻā§ āϝāĻžāϝāĻŧāĨ¤ āĻāĻŋāύā§āϤ⧠real-world application-āĻ database, log file, āĻŦāĻž user-uploaded content āĻāϰ āĻŽāϤ⧠data persistent āϰāĻžāĻāĻž āĻāϰā§āϰāĻŋāĨ¤ Volume āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϞā§:
- Container delete āĻšāϞā§āĻ data āĻĨāĻžāĻā§
- āĻāĻāĻžāϧāĻŋāĻ container āĻāĻāĻ data share āĻāϰāϤ⧠āĻĒāĻžāϰā§
- Data backup āĻ migrate āĻāϰāĻž āϏāĻšāĻ āĻšāϝāĻŧ
- Host filesystem āĻĨā§āĻā§ independent āĻĨāĻžāĻā§, āϤāĻžāĻ portable
What is the difference between a volume, a bind mount, and a tmpfs mount?â
| āĻŦā§āĻļāĻŋāώā§āĻā§āϝ | Volume | Bind Mount | tmpfs Mount |
|---|---|---|---|
| Storage location | Docker-managed directory | Host-āĻāϰ āϝā§āĻā§āύ⧠path | RAM (memory) |
| Portability | āĻŦā§āĻļāĻŋ portable | Host path-āĻāϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰāĻļā§āϞ | N/A |
| Data persistence | āĻšā§āϝāĻžāĻ | āĻšā§āϝāĻžāĻ | āύāĻž (container āĻŦāύā§āϧ⧠āĻŽā§āĻā§ āϝāĻžāϝāĻŧ) |
| Performance | āĻāĻžāϞ⧠| OS-dependent | āϏāĻŦāĻā§āϝāĻŧā§ āĻĻā§āϰā§āϤ |
| āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻā§āώā§āϤā§āϰ | Production data, database | Development, source code | Sensitive/temporary data |
Volume â Docker āύāĻŋāĻā§ manage āĻāϰā§, āϏāĻŦāĻā§āϝāĻŧā§ recommended approachāĨ¤
Bind Mount â Host machine-āĻāϰ specific directory āϏāϰāĻžāϏāϰāĻŋ container-āĻ mount āĻāϰāĻž āĻšāϝāĻŧāĨ¤ Development-āĻ source code share āĻāϰāϤ⧠āĻāĻžāĻā§ āϞāĻžāĻā§āĨ¤
tmpfs Mount â āĻļā§āϧā§āĻŽāĻžāϤā§āϰ memory-āϤ⧠āĻĨāĻžāĻā§, disk-āĻ āϞā§āĻā§ āύāĻžāĨ¤ Sensitive data (āϝā§āĻŽāύ secret, token) temporary āϰāĻžāĻāĻžāϰ āĻāύā§āϝ āĻāĻĒāϝā§āĻā§āϤāĨ¤
Where does Docker store volume data on the host filesystem?â
Linux host-āĻ Docker volume-āĻāϰ data āϏāĻāϰāĻā§āώāĻŋāϤ āĻšāϝāĻŧ:
/var/lib/docker/volumes/<volume_name>/_data
āĻāĻĻāĻžāĻšāϰāĻŖ, myapp_data āύāĻžāĻŽā§āϰ volume-āĻāϰ data āĻĨāĻžāĻāĻŦā§:
/var/lib/docker/volumes/myapp_data/_data
āύā§āĻ: Windows āĻŦāĻž macOS-āĻ Docker āĻāĻāĻāĻŋ Linux VM-āĻāϰ āĻā§āϤāϰ⧠āĻāϞā§, āϤāĻžāĻ āĻāĻ path āϏāϰāĻžāϏāϰāĻŋ host āĻĨā§āĻā§ accessible āύāĻžāĻ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
Volume inspect āĻāϰāϤā§:
docker volume inspect myapp_data
What is the difference between named volumes and anonymous volumes?â
Named Volume:
- Explicitly āĻāĻāĻāĻŋ āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧā§ āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧ
- āϏāĻšāĻā§ āĻĒā§āύāϰāĻžāϝāĻŧ reference āĻāϰāĻž āϝāĻžāϝāĻŧ
docker volume ls-āĻ clearly āĻĻā§āĻāĻž āϝāĻžāϝāĻŧ- Recommended for production use
# Named volume āϤā§āϰāĻŋ
docker volume create myapp_data
# Container-āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ
docker run -v myapp_data:/app/data myimage
Anonymous Volume:
- āĻā§āύ⧠āύāĻžāĻŽ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧ āύāĻž, Docker automatically āĻāĻāĻāĻŋ random ID assign āĻāϰā§
- Container delete āĻšāϞ⧠āĻāĻāĻŋ orphaned āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧ
- Track āĻāϰāĻž āĻāĻ āĻŋāύ, āϏāĻžāϧāĻžāϰāĻŖāϤ avoid āĻāϰāĻž āĻāĻāĻŋāϤ
# Anonymous volume (āύāĻžāĻŽ āύā§āĻ)
docker run -v /app/data myimage
āϏāĻšāĻ āύāĻŋāϝāĻŧāĻŽ: Production-āĻ āϏāĻŦāϏāĻŽāϝāĻŧ named volume āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤
How do you share a volume between multiple containers?â
āĻāĻāĻ named volume āĻāĻāĻžāϧāĻŋāĻ container-āĻ mount āĻāϰāϞā§āĻ āϤāĻžāϰāĻž āĻāĻāĻ data access āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ â āĻĻā§āĻāĻŋ container āĻāĻāĻ volume share āĻāϰāĻā§:
# āĻĒā§āϰāĻĨāĻŽā§ volume āϤā§āϰāĻŋ āĻāϰā§āύ
docker volume create shared_data
# āĻĒā§āϰāĻĨāĻŽ container āĻāĻžāϞ⧠āĻāϰā§āύ
docker run -d \
--name container_one \
-v shared_data:/app/data \
myimage
# āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧ container āĻāĻāĻ volume mount āĻāϰā§āύ
docker run -d \
--name container_two \
-v shared_data:/app/data \
myimage
āĻāĻāύ container_one āϝāĻž /app/data-āϤ⧠āϞāĻŋāĻāĻŦā§, container_two-āĻ āϏā§āĻāĻž read āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āĨ¤
Docker Compose-āĻ:
version: "3.8"
services:
app:
image: myimage
volumes:
- shared_data:/app/data
worker:
image: myworker
volumes:
- shared_data:/app/data
volumes:
shared_data:
āϏāϤāϰā§āĻāϤāĻž: āĻāĻāĻžāϧāĻŋāĻ container āĻāĻāĻ āϏāĻŽāϝāĻŧā§ āĻāĻāĻ file-āĻ write āĻāϰāϞ⧠race condition āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻā§āώā§āϤā§āϰ⧠application-level locking āĻŦāĻž database āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤
đ 15. How do you persist data in Docker containers?â
Container-āĻ data persist āĻāϰāĻžāϰ āϤāĻŋāύāĻāĻŋ āĻĒā§āϰāϧāĻžāύ āĻāĻĒāĻžāϝāĻŧ āĻāĻā§:
Volume āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠(āϏāĻŦāĻā§āϝāĻŧā§ recommended):
# Volume āϤā§āϰāĻŋ āĻāϰ⧠run āĻāϰā§āύ
docker run -d \
--name myapp \
-v myapp_data:/app/data \
myimage
Bind Mount āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠(development-āĻ āĻāĻĒāϝā§āĻā§):
docker run -d \
--name myapp \
-v /host/path:/container/path \
myimage
Docker Compose-āĻ:
version: "3.8"
services:
db:
image: postgres
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
What happens to data inside a container when it is removed?â
āĻāĻāĻŋ āύāĻŋāϰā§āĻāϰ āĻāϰ⧠data āĻā§āĻĨāĻžāϝāĻŧ āĻāĻŋāϞ āϤāĻžāϰ āĻāĻĒāϰ:
| Data āĻā§āĻĨāĻžāϝāĻŧ āĻāĻŋāϞ | Container remove āĻšāϞ⧠āĻā§ āĻšāϝāĻŧ |
|---|---|
| Container layer (volume āĻāĻžāĻĄāĻŧāĻž) | āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻŽā§āĻā§ āϝāĻžāϝāĻŧ |
| Named volume | āĻĨā§āĻā§ āϝāĻžāϝāĻŧ, volume āĻāϞāĻžāĻĻāĻžāĻāĻžāĻŦā§ exist āĻāϰ⧠|
| Bind mount | āĻĨā§āĻā§ āϝāĻžāϝāĻŧ, host filesystem-āĻ āϏāĻāϰāĻā§āώāĻŋāϤ |
| Anonymous volume | Orphaned āĻšāϝāĻŧ, manually cleanup āύāĻž āĻāϰāϞ⧠disk āĻāϰ⧠āϝāĻžāϝāĻŧ |
āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ:
docker rm -vāĻĻāĻŋāϞ⧠container-āĻāϰ āϏāĻžāĻĨā§ anonymous volume-āĻ delete āĻšāϝāĻŧāĨ¤ Named volume āĻāĻāύ⧠automatically delete āĻšāϝāĻŧ āύāĻžāĨ¤
How would you back up and restore a Docker volume?â
Backup āĻāϰāĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋ:
āĻāĻāĻāĻŋ temporary container āϤā§āϰāĻŋ āĻāϰ⧠volume mount āĻāϰā§āύ, āϤāĻžāϰāĻĒāϰ tar āĻĻāĻŋāϝāĻŧā§ compress āĻāϰā§āύ:
docker run --rm \
-v myapp_data:/data \
-v $(pwd):/backup \
ubuntu \
tar czf /backup/myapp_backup.tar.gz -C /data .
āĻāĻ command-āĻāĻŋ myapp_backup.tar.gz āύāĻžāĻŽā§ current directory-āϤ⧠backup file āϤā§āϰāĻŋ āĻāϰāĻŦā§āĨ¤
Restore āĻāϰāĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋ:
# āĻĒā§āϰāĻĨāĻŽā§ āύāϤā§āύ volume āϤā§āϰāĻŋ āĻāϰā§āύ
docker volume create myapp_data_restored
# Backup āĻĨā§āĻā§ data restore āĻāϰā§āύ
docker run --rm \
-v myapp_data_restored:/data \
-v $(pwd):/backup \
ubuntu \
tar xzf /backup/myapp_backup.tar.gz -C /data
āĻ āύā§āϝ machine-āĻ migrate āĻāϰāϤā§:
# ā§§. Backup āύāĻŋāύ (āĻāĻā§āϰ command)
# ⧍. File transfer āĻāϰā§āύ (scp āĻŦāĻž āĻ
āύā§āϝ āĻāĻĒāĻžāϝāĻŧā§)
scp myapp_backup.tar.gz user@remote-server:/path/
# ā§Š. Remote server-āĻ restore āĻāϰā§āύ
docker volume create myapp_data
docker run --rm \
-v myapp_data:/data \
-v /path:/backup \
ubuntu \
tar xzf /backup/myapp_backup.tar.gz -C /data
What is the difference between using volumes and writing to the container layer?â
Container layer āĻšāϞ⧠container-āĻāϰ āύāĻŋāĻāϏā§āĻŦ writable layer, āϝāĻž image-āĻāϰ āĻāĻĒāϰ⧠āĻĨāĻžāĻā§āĨ¤
| āĻŦāĻŋāώāϝāĻŧ | Volume | Container Layer |
|---|---|---|
| Persistence | Container delete āĻšāϞā§āĻ āĻĨāĻžāĻā§ | Container delete āĻšāϞ⧠āĻŽā§āĻā§ āϝāĻžāϝāĻŧ |
| Performance | Native disk speed | Copy-on-Write (CoW) overhead āĻāĻā§, āϤā§āϞāύāĻžāĻŽā§āϞāĻ āϧā§āϰ |
| Sharing | āĻāĻāĻžāϧāĻŋāĻ container share āĻāϰāϤ⧠āĻĒāĻžāϰ⧠| āĻļā§āϧ⧠āĻ container-āĻ access āĻĒāĻžāϝāĻŧ |
| Backup | āϏāĻšāĻ | āĻāĻ āĻŋāύ (docker export āϞāĻžāĻā§) |
| Image size | Image āĻŦāĻĄāĻŧ āĻšāϝāĻŧ āύāĻž | āĻŦ āĻžāϰāĻŦāĻžāϰ write āĻāϰāϞ⧠image layer āĻŦāĻĄāĻŧ āĻšāϝāĻŧ |
āĻā§āύ Container Layer-āĻ āϞā§āĻāĻž āĻāĻāĻŋāϤ āύāϝāĻŧ:
Docker image Copy-on-Write strategy āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĨ¤ Container layer-āĻ āĻāĻŋāĻā§ āϞāĻŋāĻāϞ⧠Docker āĻĒā§āϰāĻĨāĻŽā§ āĻĒā§āϰ⧠file-āĻāĻŋ image layer āĻĨā§āĻā§ copy āĻāϰ⧠āϤāĻžāϰāĻĒāϰ modify āĻāϰ⧠â āĻāĻāĻŋ I/O intensive operation, āĻŦāĻŋāĻļā§āώāϤ database āĻŦāĻž large file-āĻāϰ āĻā§āώā§āϤā§āϰ⧠significant performance hit āĻšāϝāĻŧāĨ¤
āύāĻŋāϝāĻŧāĻŽ: āϝā§āĻā§āύ⧠data āϝāĻž persist āĻŦāĻž share āĻāϰāϤ⧠āĻšāĻŦā§, āϏāĻŦāϏāĻŽāϝāĻŧ volume-āĻ āϰāĻžāĻā§āύāĨ¤
How do you manage volume permissions for non-root users inside containers?â
Container-āĻāϰ āĻā§āϤāϰ⧠non-root user āĻĻāĻŋāϝāĻŧā§ āĻāĻžāϞāĻžāϞ⧠volume-āĻāϰ directory-āϤ⧠write permission āύāĻž āĻĨāĻžāĻāϞ⧠"Permission denied" error āĻāϏā§āĨ¤
āϏāĻŽāϏā§āϝāĻžāϰ āĻāĻžāϰāĻŖ:
Volume-āĻāϰ directory default-āĻ root owner āĻšāϝāĻŧāĨ¤ āĻāĻŋāύā§āϤ⧠application non-root user āĻšāĻŋāϏā§āĻŦā§ āĻāϞāϞ⧠āϏ⧠write āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āύāĻžāĨ¤
āϏāĻŽāĻžāϧāĻžāύ ā§§ â Dockerfile-āĻ permission set āĻāϰā§āύ:
FROM node:18
# Non-root user āϤā§āϰāĻŋ āĻāϰā§āύ
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
# Directory āϤā§āϰāĻŋ āĻāϰ⧠ownership āĻĻāĻŋāύ
RUN mkdir -p /app/data && chown -R appuser:appgroup /app/data
# Non-root user āĻšāĻŋāϏā§āĻŦā§ switch āĻāϰā§āύ
USER appuser
WORKDIR /app
CMD ["node", "server.js"]
āϏāĻŽāĻžāϧāĻžāύ ⧍ â Entrypoint script āĻĻāĻŋāϝāĻŧā§ runtime-āĻ fix āĻāϰā§āύ:
#!/bin/sh
# entrypoint.sh
# Volume directory-āϰ ownership āĻ āĻŋāĻ āĻāϰā§āύ
chown -R appuser:appgroup /app/data
# āĻāϰāĻĒāϰ non-root user āĻšāĻŋāϏā§āĻŦā§ app āĻāĻžāϞ⧠āĻāϰā§āύ
exec su-exec appuser "$@"
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["node", "server.js"]
āϏāĻŽāĻžāϧāĻžāύ ā§Š â docker run-āĻ user specify āĻāϰā§āύ:
# Host user-āĻāϰ UID āĻĻāĻŋāϝāĻŧā§ container āĻāĻžāϞāĻžāύ
docker run -d \
--user $(id -u):$(id -g) \
-v myapp_data:/app/data \
myimage
āϏāĻŽāĻžāϧāĻžāύ ā§Ē â Docker Compose-āĻ:
version: "3.8"
services:
app:
image: myimage
user: "1000:1000" # UID:GID
volumes:
- myapp_data:/app/data
volumes:
myapp_data:
driver: local
driver_opts:
o: uid=1000,gid=1000 # Volume-āĻāϰ default ownership
Best practice: Production-āĻ āĻāĻāύā§
rootuser āĻĻāĻŋāϝāĻŧā§ container āĻāĻžāϞāĻžāĻŦā§āύ āύāĻžāĨ¤ āϏāĻŦāϏāĻŽāϝāĻŧ dedicated non-root user āϤā§āϰāĻŋ āĻāϰā§āύ āĻāĻŦāĻ Dockerfile-āĻāĻ permission āĻ āĻŋāĻ āĻāϰā§āύ â āĻāĻāĻŋ security āĻāĻŦāĻ permission āĻāĻāϝāĻŧ āϏāĻŽāϏā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻžāύ āĻāϰā§āĨ¤