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.
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:
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:
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ăng | Default Bridge | User-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:
# 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-networkKết nối Container
Kết nối container vào bridge network và kiểm tra kết nối:
# 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): OKPort 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: 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:8080Hiệ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
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àiLưu ý quan trọng
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.
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.