Продвинутый Docker
1Volumes: типы и продакшн-практики← вы здесь2Сети Docker: bridge, host, overlay3Docker Hub и private registry
Урок 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: local
bash
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 app
bash
# На хосте папка принадлежит 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 /dest

PostgreSQL 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 в продакшне?