Docker Compose
1Docker Compose: многоконтейнерные приложения2Volumes: хранение данных в Docker← вы здесь3Сети Docker Compose: как сервисы общаются
Урок 2~9 минут

Volumes: хранение данных в Docker

По умолчанию данные внутри контейнера исчезают при его удалении. Volumes решают эту проблему.

Типы volumes

Named volume — управляемый Docker

yaml
services:
  db:
    image: postgres:16-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
 
volumes:
  pgdata:    # объявить named volume

Docker сам выбирает место хранения (/var/lib/docker/volumes/...). Данные переживают docker compose down, удаляются только с docker compose down -v.

Bind mount — папка хоста

yaml
services:
  app:
    volumes:
      - ./src:/app/src    # хост:контейнер
      - ./config:/app/config:ro  # :ro = readonly

Идеально для разработки: изменения файлов сразу видны в контейнере. Не для продакшна — привязывает к конкретному хосту.

Tmpfs — только в памяти

yaml
services:
  app:
    tmpfs:
      - /tmp
      - /run

Хранится в RAM, исчезает при остановке. Для временных файлов и кэша.

Горячая перезагрузка при разработке

yaml
services:
  api:
    build: .
    volumes:
      - .:/app             # весь проект смонтирован
      - /app/node_modules  # исключить node_modules хоста
    command: npm run dev   # nodemon / air / etc.

Анонимный volume /app/node_modules перекрывает bind mount для этой папки — используются зависимости из образа, а не с хоста.

Управление volumes

bash
docker volume ls                    # все volumes
docker volume inspect pgdata        # информация
docker volume rm pgdata             # удалить
docker volume prune                 # удалить неиспользуемые
 
# В Compose
docker compose down       # сохраняет volumes
docker compose down -v    # удаляет volumes

Backup и restore

bash
# Backup
docker run --rm \
  -v pgdata:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/pgdata.tar.gz /data
 
# Restore
docker run --rm \
  -v pgdata:/data \
  -v $(pwd):/backup \
  alpine tar xzf /backup/pgdata.tar.gz -C /

Конфигурация volume

yaml
volumes:
  pgdata:
    driver: local
    driver_opts:
      type: nfs
      o: addr=192.168.1.1,rw
      device: ":/path/on/nfs"

В продакшне для высокой доступности volumes можно хранить на NFS или в облачных хранилищах (AWS EFS, GCP Filestore).

В следующем уроке — сети Docker Compose: как сервисы находят друг друга.

Named volumes управляет Docker, bind mounts — ты указываешь путь на хосте. Для базы данных — named volume. Для кода разработки — bind mount.
💾
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
Чем named volume отличается от bind mount?