Dùng tên service làm hostname: db:5432. localhost bên trong container trỏ về chính container đó, không phải máy host hay container khác — mỗi container có network namespace riêng.
Compose tự tạo một user-defined bridge network cho project và bật DNS nội bộ, nên mọi service trong cùng network phân giải được nhau bằng tên service (và cả alias nếu khai báo).
yaml
services:
api:
environment:
DATABASE_URL: postgres://app@db:5432/app # service name, not localhost
depends_on: [db]
db:
image: postgres:16
ports:
- "5433:5432" # only needed for access from the host machineHai điểm hay nhầm:
- Port mapping (ports) không cần thiết để hai service gọi nhau; container nói chuyện qua cổng nội bộ (5432), không phải cổng đã publish (5433).
- Muốn container gọi ngược về service chạy trên máy host thì dùng host.docker.internal (Docker Desktop) thay vì localhost.