Compose створює для проєкту окрему мережу, і всі сервіси в ній доступні один одному за назвою сервісу - вбудований DNS Docker перетворює її на IP контейнера.
services:
app:
build: .
environment:
DB_HOST: db # не localhost і не IP
REDIS_HOST: redis
db:
image: postgres:17
redis:
image: redis:7
Типова помилка новачка - localhost. У контейнері app адреса localhost - це сам контейнер app, а не база. Бази там немає, тож DB_HOST=localhost дає «connection refused». Потрібно DB_HOST=db.
Порти: внутрішні й опубліковані.
- Усередині мережі сервіси звертаються один до одного за внутрішнім портом контейнера:
db:5432. ports: ["5433:5432"]публікує порт на хост - щоб підключитися з машини розробника чи з інтернету. Для зв'язку між контейнерами публікувати не потрібно.
db:
ports:
- "127.0.0.1:5433:5432" # доступно лише з цього комп'ютера
Безпека: ports: ["5432:5432"] на сервері відкриває базу на всі інтерфейси - і Docker при цьому обходить правила ufw, бо сам керує iptables. Базу на проді або не публікують узагалі, або прив'язують до 127.0.0.1.
Кілька мереж дозволяють ізолювати сервіси: фронтенд-проксі бачить застосунок, але не базу.