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 volumeDocker сам выбирает место хранения (/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 # удаляет volumesBackup и 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?