Chuyển đến nội dung chính (Skip to content)
Mục lục bài viết
Docker

Mạng Docker: bridge, host, overlay và DNS

Mạng Docker: bridge, host, overlay và DNS

Chọn driver theo phạm vi kết nối, dùng DNS mạng tự tạo và kiểm tra published port; phân biệt mạng Docker Swarm với mô hình CNI của Kubernetes.

Đối chiếu ngày 24/10/2026. Các nguồn ở cuối bài dùng để kiểm tra phiên bản và giới hạn. Ví dụ phải điều chỉnh theo hệ điều hành và ứng dụng; không phải báo cáo thử nghiệm trên mọi nền tảng.

1. Các network driver tích hợp

Hệ thống mạng của Docker được xây dựng trên nền tảng Container Network Model (CNM) của Docker, triển khai trên các cơ chế Linux (sử dụng network namespaces, veth pairs và iptables). Docker có các driver bridge, host, overlay, macvlan, ipvlan và none:

  • bridge: Driver mặc định cho môi trường đơn máy chủ. Tạo một switch ảo để các container kết nối và giao tiếp qua địa chỉ IP nội bộ.
  • host: Bỏ qua hoàn toàn tầng ảo hóa mạng của Docker, gắn trực tiếp container vào không gian mạng (Network Namespace) của máy chủ Host.
  • overlay: Phục vụ giao tiếp giữa các container chạy trên nhiều máy chủ Docker Host vật lý khác nhau trong Docker Swarm; Kubernetes dùng mô hình CNI riêng.
  • macvlan: Gán một địa chỉ MAC riêng trên interface ảo cho từng container, giúp container xuất hiện như một thiết bị vật lý độc lập trong mạng LAN nội bộ.
  • none: Vô hiệu hóa hoàn toàn mọi ngăn xếp mạng của container (chỉ có giao tiếp loopback cục bộ).
Sơ đồ Client hoặc service → Docker network / DNS → Ứng dụng nhận kết nối
Sơ đồ Client hoặc service → Docker network / DNS → Ứng dụng nhận kết nối. Chạm vào sơ đồ để mở bản lớn.

2. Default bridge và mạng tự tạo

Khi bạn cài Docker, hệ thống tự động sinh một dải mạng mặc định tên là bridge (thường là subnet 172.17.0.0/16). Tuy nhiên, trên môi trường Production, bạn nên ưu tiên mạng tự tạo thay cho default bridge khi cần DNS và phân nhóm service vì hai hạn chế nghiêm trọng:

  • Không hỗ trợ Service Discovery tự động: Các container trên default bridge chỉ có thể giao tiếp với nhau bằng địa chỉ IP thô. Bạn không thể ping hoặc kết nối bằng tên container (container name).
  • Không thể cô lập lưu lượng: Tất cả các container không khai báo mạng đều bị dồn chung vào default bridge, khiến một container bị xâm nhập có thể quét và tấn công toàn bộ các container khác.

Giải pháp: Luôn tạo User-defined Custom Bridge

# Tao mot network rieng biet voi subnet tuy chinh
docker network create \
  --driver bridge \
  --subnet 172.28.0.0/16 \
  --gateway 172.28.0.1 \
  corp_internal_net

3. DNS nhúng trong mạng Docker

Khi các container cùng tham gia vào một User-defined Network, Docker sẽ tự động kích hoạt một DNS Server nhúng tại địa chỉ 127.0.0.11:

docker run -d --name dns_target --network corp_internal_net nginx:alpine
docker run --rm --network corp_internal_net busybox:1.37 nslookup dns_target

Bên trong container app_api, DNS của Docker sẽ tự động dịch tên máy chủ db_server sang địa chỉ IP nội bộ tương ứng mà không cần phải gán IP tĩnh.

4. Khi nào dùng host hoặc none?

  • Host Network (--network host): Bỏ qua toàn bộ NAT và bridge. Cổng mà ứng dụng lắng nghe trong container chính là cổng của máy chủ. Thích hợp cho các ứng dụng yêu cầu hiệu năng mạng tối đa (High Throughput, Low Latency) hoặc xử lý hàng chục nghìn cổng đồng thời mà không bị nghẽn bảng theo dõi kết nối iptables conntrack.
  • None Network (--network none): Dành cho các container xử lý tính toán chuyên sâu (Batch Processing, mã hóa dữ liệu offline) hoàn toàn không cần kết nối mạng để giảm kết nối mạng, không thay thế các lớp bảo vệ khác.

5. Overlay, macvlan và phạm vi áp dụng

Khi ứng dụng mở rộng ra cụm nhiều máy chủ, Overlay Network sử dụng giao thức đóng gói VXLAN để tạo một mạng phẳng logic kết nối các container trên các Host khác nhau mà không cần cấu hình định tuyến phức tạp.

Macvlan phù hợp khi các thiết bị mạng truyền thống (Router, Switch phần cứng) cần nhìn thấy và giao tiếp bằng địa chỉ LAN; Docker IPAM ví dụ không tự xin lease DHCP doanh nghiệp:

docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 direct_lan_net

6. Published port và firewall

Khi bạn khai báo cờ -p 8080:80, Docker tự động chèn các quy tắc vào chuỗi PREROUTING và DOCKER của iptables trên máy chủ Host. Điều này có nghĩa là lưu lượng gửi tới cổng 8080 sẽ được chuyển tiếp (DNAT) vào địa chỉ IP nội bộ của container.

Cảnh báo quản trị UFW: Trên Ubuntu, các quy tắc của Docker thường được thực thi trước các quy tắc UFW thông thường. Do đó, nếu bạn dùng -p 8080:80, cổng đó có thể mở ra Internet ngay cả khi bạn chưa chạy lệnh ufw allow. Để an toàn, hãy luôn gán IP cục bộ: -p 127.0.0.1:8080:80 nếu chỉ muốn truy cập qua reverse proxy.

7. Thiết kế mạng theo nhóm service

Mô hình bảo mật nhiều tầng (Defense-in-depth) khuyến nghị chia ứng dụng thành các dải mạng độc lập:

docker network create frontend_net
docker network create --internal backend_net
# Gan API vao hai mang; database chi vao backend_net theo thiet ke.
# Khong publish cong database neu chi API can truy cap.
docker network inspect frontend_net
docker network inspect backend_net

Tách network giảm đường kết nối trực tiếp, không bảo đảm chống mọi truy cập nếu API, host hoặc routing sai. Kiểm tra thực tế từ từng service trước khi kết luận cô lập.

Firewall backend có thể khác giữa iptables và nftables; không sao chép DOCKER-USER sang nftables mà chưa đọc tài liệu tương ứng. Published port có thể vượt chính sách UFW thông thường. Bind loopback khi chỉ cần reverse proxy host và thử từ máy ngoài. Host networking chia sẻ namespace, không di chuyển riêng NIC vật lý vào container.

Các nhánh kiểm tra mạng docker
Các nhánh kiểm tra mạng docker. Chạm vào sơ đồ để mở bản lớn.

Nguồn đối chiếu và xác nhận sau thay đổi

Đọc đúng tài liệu theo phiên bản. Địa chỉ, tên và đường dẫn trong ví dụ cần thay theo môi trường. Sơ đồ là khái niệm, không phải screenshot hay benchmark.

Lưu cấu hình và digest cũ, kiểm tra backup phục hồi được, xác nhận endpoint và log sau thay đổi. Rollback phải tính đến dữ liệu đã ghi mới; đổi image không tự phục hồi database.

Tìm hiểu thêm

Xem toàn bộ lộ trình Docker