Docker Bridge Network

Chi tiết về Bridge Network — loại network mặc định trong Docker cho các container trên cùng host.

dockerbridgenetworking
Cập nhật: 14 tháng 12, 2024

Tổng quan

Bridge Network là loại network driver mặc định trong Docker. Khi bạn chạy một container mà không chỉ định network, nó sẽ tự động được kết nối vào bridge network mặc định (hay còn gọi là docker0).

Bridge network hoạt động bằng cách tạo một Linux bridge trên host, cho phép các container kết nối vào cùng bridge giao tiếp với nhau qua Layer 2. Để hiểu đầy đủ về các loại network khác, xem trang Docker Networking.

Kiến trúc Bridge Network

Dưới đây là sơ đồ kiến trúc của Bridge Network trong Docker:

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

Các thành phần chính:

  • Linux Bridge (docker0): Switch ảo layer 2 trên host
  • veth pair: Cặp virtual ethernet kết nối container với bridge
  • iptables/NAT: Xử lý routing và port mapping ra ngoài
  • Subnet: Mỗi bridge network có subnet riêng (mặc định 172.17.0.0/16)

Giao tiếp giữa các Container

Các container trong cùng bridge network có thể giao tiếp trực tiếp với nhau:

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

Default Bridge vs User-defined Bridge

Tỷ lệ sử dụng Default Bridge so với Custom Bridge trong thực tế:

Tính năngDefault BridgeUser-defined Bridge
DNS tự động✗ Không✓ Có
Cô lập tốt hơn✗ Chung cho tất cả✓ Tách biệt theo nhóm
Kết nối/ngắt khi đang chạy✗ Không✓ Có
Cấu hình tùy chỉnh✗ Hạn chế✓ Đầy đủ
Chia sẻ env variables~ --link (deprecated)✓ DNS + env

Tạo Bridge Network

Cách tạo và cấu hình user-defined bridge network:

create-network.sh
# Tạo user-defined bridge network
docker network create \
  --driver bridge \
  --subnet 172.20.0.0/16 \
  --gateway 172.20.0.1 \
  --opt "com.docker.network.bridge.name"="br-custom" \
  my-bridge-network

# Kiểm tra network đã tạo
docker network inspect my-bridge-network

Kết nối Container

Kết nối container vào bridge network và kiểm tra kết nối:

connect-containers.sh
# Chạy container trong custom bridge network
docker run -d \
  --name app-server \
  --network my-bridge-network \
  --ip 172.20.0.10 \
  nginx

# Chạy container thứ hai
docker run -d \
  --name app-db \
  --network my-bridge-network \
  postgres:16

# Kiểm tra kết nối giữa 2 container
docker exec app-server ping -c 3 app-db

# Kết quả: PING app-db (172.20.0.x): OK

Port Mapping

Để cho phép truy cập container từ bên ngoài host, bạn cần sử dụng port mapping (flag -p):

port-mapping.sh
# Port mapping: expose container port ra host
docker run -d \
  --name web \
  --network my-bridge-network \
  -p 8080:80 \
  -p 8443:443 \
  nginx

# Container port 80 → Host port 8080
# Container port 443 → Host port 8443
# Truy cập: http://localhost:8080

Hiệu năng theo số lượng Container

Biểu đồ dưới đây minh họa throughput tương đối (%) của bridge network khi tăng số lượng container kết nối:

* Số liệu mang tính minh họa. Hiệu năng thực tế phụ thuộc vào phần cứng và workload.

Docker Compose với Bridge

Trong Docker Compose, bạn có thể khai báo nhiều bridge network để cô lập các nhóm service:

docker-compose.yml
# docker-compose.yml
version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    networks:
      - frontend
      - backend

  api:
    image: node:18
    networks:
      - backend

  db:
    image: postgres:16
    networks:
      - backend
    environment:
      POSTGRES_PASSWORD: secret

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true  # Không truy cập từ bên ngoài

Lưu ý quan trọng

⚠️ Không nên dùng default bridge trong production

Default bridge (docker0) không hỗ trợ DNS resolution giữa các container. Luôn tạo user-defined bridge network cho các ứng dụng production.

💡 Mẹo: Network Aliases

Sử dụng --network-alias để tạo DNS alias cho container, giúp load balancing đơn giản khi có nhiều container cùng service.