Part 11 · Docker · 11.1.06

Network namespace, bridge, DNS và published ports

localhost bên trong một container trỏ về chính network namespace của container đó. Muốn gọi service khác, hãy đi qua DNS/IP trên network chung; muốn traffic từ ngoài host vào container, hãy hiểu rõ published port, firewall và phạm vi bind.

Mental model: container nhìn thấy interface, IP, route, gateway và DNS của namespace riêng. Docker nối các namespace với host/network driver; ứng dụng vẫn phải bind đúng địa chỉ và lắng nghe đúng port.

1. Networking

Container networking là lớp cho phép container giao tiếp với nhau và với service ngoài Docker. Trên Docker Engine, mỗi container thường có network namespace riêng. Nếu không chỉ định network, container Linux thường được gắn vào default bridge; trong production, user-defined bridge thường dễ quản lý hơn vì có isolation rõ hơn và name resolution thuận tiện giữa các container cùng network.

Ba khái niệm cần tách biệt: container port là port process đang listen trong namespace; published host port là cổng host được map/forward vào container; EXPOSE chỉ là metadata/documentation của image, không tự mở firewall hay publish port.

2. Packet path

Client outside host | | host-ip:8080 v [ host NIC / firewall ] | | published port / forwarding v [ Docker bridge ] ---- veth pair ---- [ container eth0 ] | v app :80 / 0.0.0.0

Với bridge networking trên Linux, container có interface trong namespace riêng, thường nối tới software bridge của host qua cặp virtual Ethernet. Traffic outbound thường được masquerade/SNAT khi rời Docker host; traffic inbound chỉ đi vào container khi routing/firewall/publishing cho phép.

docker network create app-net
docker run -d --name api --network app-net -p 127.0.0.1:8080:8080 my-api
Security: nếu bỏ phần host IP, Docker có thể publish trên mọi host interface. Với database/admin endpoint, ưu tiên bind cụ thể như 127.0.0.1:5432:5432, reverse proxy có auth/TLS, hoặc không publish nếu chỉ internal.

3. Drivers

DriverKhi dùngTrade-off / caveat chính
bridgeMulti-container trên một Docker hostUser-defined bridge cho isolation/name resolution tốt; host publishing/firewall vẫn phải cấu hình đúng.
hostCần tránh NAT hoặc dùng rất nhiều portContainer chia sẻ network stack với host, giảm isolation; port conflict xảy ra trực tiếp trên host.
noneCần container không có network connectivity thông thườngKhông giao tiếp host/container khác qua network driver.
overlayMulti-host Docker/SwarmCó encapsulation/routing cross-host; standalone multi-host overlay vẫn cần Swarm mode thiết lập network.
macvlanContainer cần xuất hiện như thiết bị riêng trên L2Cần hạ tầng hỗ trợ nhiều MAC/promiscuous mode; host↔container trực tiếp có kernel caveat.
ipvlanTích hợp underlay/VLAN nhưng muốn giảm số MACPhụ thuộc topology/routing của hạ tầng; cần thiết kế IP/subnet cẩn thận.

Chọn driver theo scope giao tiếp, topology vật lý, isolation, performance và khả năng vận hành. Không dùng host chỉ để “network nhanh hơn” nếu sự đánh đổi isolation và port ownership chưa được chấp nhận.

4. DNS and connections

Container IP là implementation detail và có thể thay đổi sau recreate. Với các container cùng user-defined network, ưu tiên tên service/container làm endpoint ổn định hơn. Client vẫn cần xử lý reconnect vì DNS resolve đúng không bảo đảm peer đang healthy.

Ví dụ: container web gọi http://api:8080 trên cùng user-defined network. Không gọi http://localhost:8080 trừ khi API process thực sự nằm trong cùng network namespace.

5. Debug flow

Debug theo từng hop, từ gần ứng dụng ra ngoài. Đừng bắt đầu bằng việc đổi firewall/NAT ngẫu nhiên vì có thể che mất nguyên nhân gốc.

  1. Resolve: tên service có resolve từ đúng namespace không? Dùng getent hosts api hoặc công cụ DNS phù hợp.
  2. Inspect endpoint/network: container có gắn đúng network, IP/subnet/gateway đúng không? Kiểm tra bằng docker network inspectdocker inspect.
  3. Listener: process có thực sự listen đúng port/address? Dùng ss -lntp hoặc công cụ tương đương trong namespace/container.
  4. East-west test: thử từ container caller tới target name/IP/port trước khi xét host publishing.
  5. North-south path: nếu container-to-container chạy nhưng client ngoài host fail, kiểm tra published port, host bind address, Docker firewall rules, upstream firewall/security group.
  6. Application layer: sau TCP là proxy, HTTP host/path, TLS/SNI/certificate, auth và timeout.
# Network membership / endpoint
Docker network inspect app-net
Docker inspect api

# DNS + connectivity từ đúng namespace/toolbox
getent hosts api
curl -v http://api:8080/health

# Listener
ss -lntp

Runtime image tối giản không nhất thiết chứa curl, dig, ss. Ưu tiên ephemeral debug toolbox/container hoặc namespace attach thay vì cài debug packages vĩnh viễn vào production image.

6. Failure windows và operational signals

Triệu chứngKhả năng nguyên nhânSignal nên xem
Connection refusedKhông có listener, bind sai address, process chưa readyListener socket, container health, restart count
TimeoutRouting/firewall/drop, target treo, SYN không tới/không replyPacket counters, host firewall, network path, app latency
DNS resolve nhưng vẫn fail sau deployStale resolver/connection pool hoặc app endpoint chưa readyDNS answer, connection age, retry/reconnect rate
Chỉ external failPublish/bind/firewall/NAT/upstream policydocker ps port mapping, host listener, firewall rules
Chỉ một host bị lỗiBridge/firewall/route state cục bộ, port conflict, resource pressurePer-host network errors, conntrack/socket pressure, daemon events

Capacity không chỉ là bandwidth. Theo dõi connection count, connection churn, TCP retransmit/reset, DNS error/latency, socket/file-descriptor pressure, packet drops, host CPU cho packet processing, và latency/error theo từng dependency. Recovery phải tránh retry storm: dùng timeout hữu hạn, exponential backoff có jitter, circuit breaking khi cần và health/readiness phân biệt rõ.

7. Security, rollback và recovery

Checklist production: endpoint dùng service name thay vì IP tĩnh; app bind đúng interface; published port có owner và exposure rõ; firewall path được document; timeout/retry bounded; metrics đủ phân biệt DNS, TCP, TLS và application failure; có rollback test.
Tài liệu: Docker Networking overview · Bridge driver · Network drivers · Port publishing and mapping · Packet filtering and firewalls · Overlay driver · Macvlan driver