Container DNS và user-defined networks
Kết nối các services bằng tên, không hardcode IP động.
Nắm bản chất
Trên Docker user-defined bridge, các containers có thể phân giải tên lẫn nhau
qua cơ chế DNS do Docker quản lý. Docker Compose tự tạo network mặc định cho
project và cho phép sử dụng service name, ví dụ db:5432 hoặc
redis:6379.
Container IP không phải một API ổn định: recreate có thể khiến IP thay đổi. Điều quan trọng là tên service + port bên trong network, không phải host port đã publish.
Luồng hoạt động
Hãy tự giải thích mỗi mũi tên: dữ liệu, quyền hoặc tín hiệu nào được truyền qua bước này?
Lệnh & cấu hình mẫu
services:
api:
image: busybox:1.36
command: ["sh", "-c", "nslookup db; sleep 3600"]
db:
image: postgres:18
environment:
POSTGRES_PASSWORD: lab-only
docker compose up -d
docker compose logs api
Lệnh có placeholder hoặc phụ thuộc môi trường thì cần thay thông tin thực tế, kiểm tra quyền và chỉ thực hiện trên tài nguyên được phép.
Bài tập 10–20 phút
Tạo một compose project thử nghiệm và dùng nslookup db từ API.
Sau đó recreate DB rồi kiểm tra DNS vẫn trỏ tới container hiện tại.
Lỗi dễ mắc
Không dùng hostname localhost cho các services khác container,
trừ khi các tiến trình thực sự chia sẻ network namespace.
Tự kiểm tra
Từ API container, nên kết nối `db:5432` hay `localhost:5432`?Xem đáp án ↗
Trong mạng Compose thông thường, dùng db:5432.
Học thêm qua lab
Bài học nền tảng có thể thực hiện trực tiếp bằng các lệnh trên; bảng tra cứu nhanh giúp ôn tập.
→ Mở bảng lệnh tra cứu nhanhĐối chiếu tài liệu gốc
Cú pháp và khả năng hỗ trợ có thể thay đổi theo phiên bản. Trước khi dùng Production, hãy kiểm tra tài liệu tương ứng.
Mở tài liệu chính thức ↗