Docker Networking

Tổng quan về hệ thống mạng trong Docker, các loại network driver và cách cấu hình.

dockernetworkingdevops
Cập nhật: 15 tháng 12, 2024

Giới thiệu

Docker cung cấp một hệ thống mạng (networking) mạnh mẽ cho phép các container giao tiếp với nhau và với thế giới bên ngoài. Hiểu rõ về networking trong Docker là điều cần thiết để xây dựng các ứng dụng container hóa hiệu quả.

Mặc định, Docker tạo ra một Bridge Network cho mỗi container. Tuy nhiên, Docker hỗ trợ nhiều loại network driver khác nhau phù hợp với từng use case cụ thể.

Các loại Network Driver

Docker hỗ trợ các loại network driver chính sau:

Đang tải sơ đồ...

🌉 Bridge Network

Network mặc định cho các container trên cùng một Docker host. Phù hợp cho các ứng dụng standalone. Tìm hiểu chi tiết →

🏠 Host Network

Container sử dụng trực tiếp network stack của host. Hiệu năng cao nhất nhưng không có network isolation.

🔗 Overlay Network

Cho phép các container trên nhiều Docker host giao tiếp với nhau. Thường sử dụng với Docker Swarm hoặc Kubernetes. Tìm hiểu chi tiết →

📡 Macvlan Network

Gán MAC address riêng cho container, khiến nó xuất hiện như một thiết bị vật lý trên mạng.

🚫 None

Vô hiệu hóa hoàn toàn networking cho container. Container hoàn toàn bị cô lập khỏi mạng.

Thống kê sử dụng

Dưới đây là thống kê tỷ lệ sử dụng các loại network driver phổ biến (theo khảo sát cộng đồng):

Các lệnh cơ bản

Dưới đây là các lệnh Docker network thường dùng nhất:

docker-network-commands.sh
# Liệt kê tất cả network
docker network ls

# Tạo một bridge network tùy chỉnh
docker network create --driver bridge my-network

# Chạy container với network cụ thể
docker run -d --name web --network my-network nginx

# Kiểm tra chi tiết network
docker network inspect my-network

# Kết nối container đang chạy vào network
docker network connect my-network my-container

# Ngắt kết nối container khỏi network
docker network disconnect my-network my-container

# Xóa network
docker network rm my-network

# Xóa tất cả network không sử dụng
docker network prune

DNS Resolution trong Docker

Docker cung cấp built-in DNS server cho các user-defined network (không áp dụng cho default bridge). Các container có thể giao tiếp bằng tên container thay vì IP address.

dns-example.sh
# Container 'web' có thể gọi container 'db' bằng tên
docker network create app-net
docker run -d --name db --network app-net postgres
docker run -d --name web --network app-net nginx

# Trong container 'web', có thể ping 'db' trực tiếp
# ping db → 172.18.0.2

Best Practices

  • Luôn sử dụng user-defined bridge network thay vì default bridge để có DNS resolution
  • Sử dụng network aliases để tạo tên gọi linh hoạt cho service
  • Cô lập các nhóm container bằng separate networks
  • Sử dụng overlay network khi cần giao tiếp giữa nhiều Docker hosts
  • Dùng docker network prune để dọn dẹp network không sử dụng