Файлова система контейнера - тимчасова: усе, що записано всередину, зникає разом з контейнером (docker rm). Для даних, що мають жити довше, є два основні способи:
Том (volume) - сховище, яким керує Docker (зазвичай у /var/lib/docker/volumes). Живе незалежно від контейнерів.
services:
db:
image: postgres:17
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Bind mount - каталог хоста, змонтований у контейнер напряму. Зміни видно з обох боків одразу.
services:
app:
volumes:
- ./:/var/www # код з машини розробника
Коли що:
- Томи - для даних сервісів: бази, Redis, завантажені файли. Портабельні, не залежать від структури каталогів хоста, з ними простіше робити бекапи. На macOS і Windows значно швидші за bind mount.
- Bind mount - у розробці: правите код в IDE, контейнер одразу бачить зміни. На проді - лише для конфігурацій, якщо взагалі.
Пастки:
docker compose down -vвидаляє томи разом з даними бази. Без-vтоми лишаються.- Права доступу в bind mount: файли, створені в контейнері від root, на хості теж належать root.
- Анонімні томи (без імені) легко загубити й накопичити -
docker volume pruneприбирає невикористані.
На проді для коду ні том, ні bind mount не потрібні: код запікають в образ, а новий реліз - це новий образ.