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 # tên service, không phải localhost
depends_on: [db]
db:
image: postgres:16
ports:
- "5433:5432" # chỉ cần khi truy cập từ máy hostHai đ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.