Cơ chế và Phương thức Kết nối Mạng giữa các Container Docker

Giao tiếp giữa các container trong môi trường Docker phụ thuộc hoàn toàn vào cấu hình mạng (Network). Hệ thống này cho phép các tiến trình chạy cô lập có thể trao đổi dữ liệu với nhau thông qua các giao thức chuẩn mà không cần phụ thuộc vào địa chỉ IP cố định của宿主机.

1. Các loại Driver mạng cơ bản

Docker cung cấp sẵn nhiều driver mạng để phục vụ các mục đích khác nhau. Việc lựa chọn driver phù hợp sẽ quyết định khả năng kết nối và mức độ cô lập:

Driver Đặc điểm kỹ thuật
bridge Mạng mặc định, các container cùng mạng có thể giao tiếp qua tên dịch vụ.
host Loại bỏ lớp mạng ảo hóa, container dùng chung stack mạng với host.
none Tắt hoàn toàn networking, chỉ phù hợp cho các tác vụ xử lý offline.
overlay Kết nối nhiều Docker Daemon lại với nhau, thường dùng cho Swarm cluster.

2. Thiết lập kết nối qua Custom Bridge Network

Để các container có thể phân giải tên miền nội bộ, cần tạo một mạng bridge tùy chỉnh thay vì sử dụng mạng mặc định.

Tạo mạng và khởi chạy container

docker network create private_net
docker run -dit --name node_sender --network private_net busybox sh
docker run -dit --name node_receiver --network private_net busybox sh

Kiểm tra kết nối

Sau khi khởi chạy, truy cập vào node_receiver và thực hiện lệnh ping tới tên của container kia:

docker exec -it node_receiver sh
ping node_sender

Nếu thành công, các ứng dụng bên trong có thể gọi API qua địa chỉ http://node_sender:3000/api mà không cần biết IP thực tế.

3. Quản lý kết nối với Docker Compose

Trong môi trường phát triển hoặc triển khai đa dịch vụ, Docker Compose tự động tạo ra một mạng bridge riêng cho từng project. Các service có thể gọi nhau trực tiếp bằng tên service định nghĩa trong file cấu hình.

version: '3.8'
services:
  frontend_proxy:
    image: httpd
    ports:
      - "80:80"
  backend_logic:
    image: my-java-service
    depends_on:
      - frontend_proxy
    environment:
      - API_URL=http://frontend_proxy:80

Lưu ý rằng biến môi trường API_URL sử dụng tên service frontend_proxy thay vì IP. Compose sẽ đảm bảo việc phân giải DNS hoạt động chính xác trong mạng nội bộ.

4. Chế độ Host Network cho hiệu năng cao

Đối với các ứng dụng yêu cầu độ trễ thấp hoặc cần xử lý nhiều kết nối UDP, chế độ host network là lựa chọn tối ưu. Container sẽ không bị cô lập về mặt mạng.

docker run --network host high_perf_app

Lưu ý quan trọng: Khi sử dụng chế độ này, không thể mapping port (-p) vì container dùng chung port của host. Cần quản lý kỹ để tránh xung đột cổng giữa các tiến trình.

5. Cơ chế phân giải DNS nội bộ

Docker tích hợp sẵn một DNS server ảo cho mỗi network. Khi một container gửi yêu cầu tới một tên khác trong cùng mạng, Docker Engine sẽ chặn yêu cầu đó và trả về địa chỉ IP tương ứng của container đích.

Để kiểm tra hoạt động của DNS, có thể sử dụng công cụ nslookup hoặc dig ngay bên trong container:

docker exec -it backend_logic nslookup frontend_proxy

Kết quả trả về sẽ là IP nội bộ được cấp phát bởi Docker, đảm bảo việc giao tiếp luôn ổn định ngay cả khi container được restart và thay đổi IP.

6. Các lệnh quản lý mạng thường dùng

Dưới đây là một số lệnh hữu ích để kiểm tra và xử lý sự cố kết nối:

  • docker network ls: Liệt kê tất cả các mạng hiện có.
  • docker network inspect private_net: Xem chi tiết cấu hình và danh sách container trong mạng.
  • docker network connect private_net container_name: Gán thêm một container đang chạy vào mạng.
  • docker network disconnect private_net container_name: Ngắt kết nối container khỏi mạng.

Thẻ: docker docker-networking docker-compose container-communication DevOps

Đăng vào ngày 23 tháng 8 lúc 11:15