[Backend Tips] "Tại sao App của tôi không kết nối được Memcached?" - Chuyện về MEMCACHED_HOST
1. Cái bẫy mang tên "localhost"
Bạn vừa cài đặt xong Memcached lên server, hoặc hào hứng khởi tạo một container mới. Bạn viết code, set cấu hình MEMCACHED_HOST=127.0.0.1 và... Boom! Lỗi Connection Refused đập thẳng vào mặt.
Nhiều bạn mới làm quen với Docker thường thắc mắc: "Tại sao em ping từ máy thật thì được, mà App trong Docker lại không thấy Memcached?".
Câu trả lời nằm ở từ khóa: Service Discovery.
2. Ý nghĩa thực sự của MEMCACHED_HOST=memcached
Trong môi trường Docker Compose hoặc Kubernetes, memcached không chỉ là một cái tên cho vui. Nó là một Hostname được phân giải bởi hệ thống DNS nội bộ.
Khi bạn đặt cấu hình:
MEMCACHED_HOST=memcached
Bạn đang ra lệnh cho ứng dụng: "Đừng tìm ở nhà (localhost) nữa, hãy đi hỏi ông bảo vệ Docker DNS xem đứa nào tên là 'memcached' thì kết nối vào đó!"
3. Tại sao cấu hình này lại "quyến rũ" đến thế?
- Tính trừu tượng (Abstraction): Bạn không cần quan tâm IP của container Memcached là
172.18.0.3hay172.18.0.10. Chỉ cần nhớ cái tên "vợ gọi" làmemcached. - Dễ dàng Scale: Hôm nay bạn chạy 1 node, ngày mai bạn chạy một cụm cluster đứng sau một Load Balancer cũng tên là
memcached, code của bạn hoàn toàn không phải sửa một dòng nào. - Nhất quán giữa các môi trường: Từ Local, Staging đến Production, bạn chỉ cần giữ nguyên biến môi trường này. Sự khác biệt duy nhất nằm ở cách hệ thống DNS của hạ tầng đó trỏ cái tên đó đi đâu.
4. Setup "Chuẩn bài" với Docker Compose
Để biến MEMCACHED_HOST=memcached trở thành hiện thực, file docker-compose.yml của bạn nên trông như thế này:
version: '3.8'
services:
app:
image: my-awesome-app
environment:
- MEMCACHED_HOST=memcached # Tên service bên dưới
- MEMCACHED_PORT=11211
depends_on:
- memcached
memcached:
image: memcached:alpine
ports:
- "11211:11211"
5. Những "lưu ý tử thần" khi cấu hình
- Network chung: Hãy đảm bảo App và Memcached nằm chung một network. Nếu không, dù có gọi tên khản cổ, chúng cũng không thấy nhau.
- Thứ tự khởi động: Sử dụng
depends_onđể đảm bảo Memcached "sống" trước khi App bắt đầu đi tìm nó. - Case-sensitive: Một số hệ thống phân biệt chữ hoa chữ thường. Tốt nhất là luôn dùng chữ thường cho hostname.
Lời kết
Dòng config MEMCACHED_HOST=memcached tuy ngắn gọn nhưng nó là đại diện cho tư duy thiết kế hệ thống hiện đại: Rời rạc (Decoupling) và Linh hoạt (Flexibility).
Hy vọng bài viết này giúp các bạn hiểu rõ hơn về "phép thuật" đằng sau những biến môi trường quen thuộc. Nếu thấy hữu ích, đừng quên Upvote và Clip bài viết lại để dành khi cần nhé!
All rights reserved