Продвинутый Docker
Урок 1~9 минут
Volumes: типы и продакшн-практики
Volumes — критически важная часть продакшн-деплоя. Неправильная конфигурация = потеря данных.
Три типа volumes
┌─────────────────────────────────────────────────────────┐
│ Container │
│ /var/lib/postgresql/data /app/src /tmp │
└──────────────┬──────────────┬──────────┬────────────────┘
│ │ │
Named volume Bind mount tmpfs (RAM)
/var/lib/ ./src/ Memory
docker/volumes/
Named Volumes
yaml
services:
db:
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
driver: localbash
docker volume ls
# DRIVER VOLUME NAME
# local myapp_pgdata
docker volume inspect myapp_pgdata
# "Mountpoint": "/var/lib/docker/volumes/myapp_pgdata/_data"Bind Mounts — осторожно
yaml
# Для разработки:
volumes:
- ./src:/app/src
# Никогда для продакшна!
# Зависит от структуры папок хоста
# Проблемы с правами (UID/GID)Права доступа — частая проблема:
dockerfile
# В Dockerfile задать пользователя
RUN addgroup -S app && adduser -S app -G app
USER appbash
# На хосте папка принадлежит root, в контейнере — app(1001)
# Решение: совпадающие UID
docker run --user $(id -u):$(id -g) ...Tmpfs
yaml
services:
app:
tmpfs:
- /tmp:size=100m,mode=1777
- /run:size=50mИли в volumes:
yaml
volumes:
- type: tmpfs
target: /tmp
tmpfs:
size: 104857600 # 100MB в байтахРезервное копирование
bash
# Backup named volume → tar.gz
docker run --rm \
-v myapp_pgdata:/source:ro \
-v $(pwd)/backups:/dest \
alpine tar czf /dest/pgdata-$(date +%Y%m%d).tar.gz -C /source .
# Restore
docker run --rm \
-v myapp_pgdata:/dest \
-v $(pwd)/backups:/source:ro \
alpine tar xzf /source/pgdata-20240101.tar.gz -C /destPostgreSQL dump (предпочтительнее)
bash
# Dump
docker compose exec db pg_dump -U postgres myapp > backup.sql
# Restore
docker compose exec -T db psql -U postgres myapp < backup.sqlМиграция volumes между серверами
bash
# На старом сервере
docker run --rm \
-v myapp_pgdata:/data \
alpine tar czf - /data | ssh user@new-server "docker run --rm -i \
-v myapp_pgdata:/data alpine tar xzf - -C /"Volume Drivers для облака
yaml
volumes:
data:
driver: rexray/ebs # AWS EBS
driver_opts:
size: "20"
volumetype: "gp2"Для Docker Swarm или Kubernetes — volumes должны быть доступны на всех нодах.
В следующем уроке — сети Docker в деталях.
tmpfs для сессий, named volume для БД, bind mount для разработки. В продакшне — всегда named volume с регулярным бэкапом.
💾
Volumes: что переживает перезапуск?❌Без volume
нет volume
📄 user_1.json
📄 user_2.json
📄 config.db
running
✅Named volume
pgdata:/var/lib/postgresql/data
📄 user_1.json
📄 user_2.json
📄 config.db
running
📁Bind mount
./data:/app/data
📄 user_1.json
📄 user_2.json
📄 config.db
running
🎯
Миссия 1 из 3
Какой тип volume использовать для хранения данных PostgreSQL в продакшне?