Docker Networking
đ 10. What are Docker network drivers, and what are their types?â
Docker-āĻ network driver āĻšāϞ⧠āĻāĻāĻāĻŋ pluggable system āϝāĻž āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰ⧠containers āĻā§āĻāĻžāĻŦā§ āĻāĻā§ āĻ āĻĒāϰā§āϰ āϏāĻžāĻĨā§ āĻāĻŦāĻ āĻŦāĻžāĻāϰā§āϰ world-āĻāϰ āϏāĻžāĻĨā§ communicate āĻāϰāĻŦā§āĨ¤ Docker-āĻāϰ Container Network Model (CNM) āĻāϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āĻāĻ driver-āĻā§āϞ⧠āĻāĻžāĻ āĻāϰā§āĨ¤
āĻĒā§āϰāϤāĻŋāĻāĻŋ network-āĻāϰ āϤāĻŋāύāĻāĻŋ āĻŽā§āϞ component āĻāĻā§ â Sandbox (container-āĻāϰ network stack), Endpoint (virtual network interface), āĻāĻŦāĻ Network (driver-managed connectivity layer)āĨ¤
1. bridge (Default Driver)â
āĻāĻāĻŋ Docker-āĻāϰ default network driverāĨ¤ āϝāĻāύ āĻā§āύ⧠network specify āύāĻž āĻāϰ⧠container run āĻāϰāĻž āĻšāϝāĻŧ, āϤāĻāύ automatically bridge āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻšāϝāĻŧāĨ¤
āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§: Docker āĻāĻāĻāĻŋ virtual bridge interface (docker0) āϤā§āϰāĻŋ āĻāϰā§āĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻŋ container āĻāĻāĻāĻŋ veth pair āĻĻāĻŋāϝāĻŧā§ āĻāĻ bridge-āĻ connect āĻšāϝāĻŧāĨ¤ Container-āĻā§āϞ⧠āύāĻŋāĻā§āĻĻā§āϰ āĻŽāϧā§āϝ⧠communicate āĻāϰāϤ⧠āĻĒāĻžāϰā§, āĻāĻŋāύā§āϤ⧠host āĻāĻŦāĻ āĻŦāĻžāĻāϰā§āϰ network āĻĨā§āĻā§ isolated āĻĨāĻžāĻā§āĨ¤
# Default bridge-āĻ run āĻāϰāĻž
docker run -d nginx
# Custom bridge network āϤā§āϰāĻŋ
docker network create --driver bridge my-network
docker run -d --network my-network nginx
āĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§: Single host-āĻ multiple container-āĻāϰ āĻŽāϧā§āϝ⧠communication āĻĻāϰāĻāĻžāϰ āĻšāϞā§āĨ¤
2. hostâ
Container-āĻāĻŋ host machine-āĻāϰ network stack āϏāϰāĻžāϏāϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠â āĻā§āύ⧠network isolation āύā§āĻāĨ¤
āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§: Container-āĻāϰ āύāĻŋāĻāϏā§āĻŦ āĻā§āύ⧠IP address āĻĨāĻžāĻā§ āύāĻžāĨ¤ Host-āĻāϰ IP āĻāĻŦāĻ port āϏāϰāĻžāϏāϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻšāϝāĻŧāĨ¤
docker run -d --network host nginx
# āĻāĻāύ nginx host-āĻāϰ port 80-āϤ⧠āϏāϰāĻžāϏāϰāĻŋ accessible
āĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§: High-performance networking āĻĻāϰāĻāĻžāϰ āĻšāϞā§, āϝā§āĻŽāύ network monitoring tools āĻŦāĻž performance-critical applicationsāĨ¤
āϏāϤāϰā§āĻāϤāĻž: Port conflicts āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ Linux-only (Mac/Windows-āĻ āĻāĻžāĻ āĻāϰ⧠āύāĻž properly)āĨ¤
3. noneâ
Container-āĻāϰ āĻā§āύ⧠network interface āĻĨāĻžāĻā§ āύāĻž â āϏāĻŽā§āĻĒā§āϰā§āĻŖ isolatedāĨ¤
docker run -d --network none alpine
# āĻāĻ container āĻāύā§āĻāĻžāϰāύā§āĻā§āĻ āϝā§āϤ⧠āĻĒāĻžāϰāĻŦā§ āύāĻž, āĻ
āύā§āϝ container-āĻāĻ āύāĻž
āĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§: Batch processing jobs āĻŦāĻž maximum security sandbox āĻĻāϰāĻāĻžāϰ āĻšāϞā§āĨ¤
4. overlayâ
Multi-host networking āĻāϰ āĻāύā§āϝāĨ¤ Docker Swarm āĻŦāĻž Kubernetes cluster-āĻ āĻŦāĻŋāĻāĻŋāύā§āύ host-āĻ āĻĨāĻžāĻāĻž container-āĻā§āϞā§āĻā§ āĻāĻāĻ network-āĻ āĻāύā§āĨ¤
āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§: VXLAN tunneling āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠physically āĻāϞāĻžāĻĻāĻž host-āĻāϰ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋ virtual network āϤā§āϰāĻŋ āĻāϰā§āĨ¤
# Swarm mode-āĻ overlay network
docker network create --driver overlay my-overlay
docker service create --network my-overlay nginx
āĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§: Docker Swarm cluster, distributed applications, microservices architectureāĨ¤
5. macvlanâ
āĻĒā§āϰāϤāĻŋāĻāĻŋ container āĻāĻāĻāĻŋ āĻāϞāĻžāĻĻāĻž MAC address āĻĒāĻžāϝāĻŧ āĻāĻŦāĻ physical network-āĻ directly appear āĻāϰ⧠â āϝā§āύ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻāϞāĻžāĻĻāĻž physical deviceāĨ¤
docker network create \
--driver macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
my-macvlan
āĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§: Legacy applications āϝā§āĻā§āϞ⧠directly physical network-āĻ āĻĨāĻžāĻāĻž āĻĻāϰāĻāĻžāϰ, āĻ āĻĨāĻŦāĻž network monitoringāĨ¤
āϏāĻŽāϏā§āϝāĻž: Host āĻāĻŦāĻ container-āĻāϰ āĻŽāϧā§āϝ⧠direct communication āĻāϰāĻž āĻāĻ āĻŋāύāĨ¤
6. ipvlanâ
macvlan-āĻāϰ āĻŽāϤā§āĻ, āĻāĻŋāύā§āϤ⧠āϏāĻŦ container āĻāĻāĻ MAC address share āĻāϰā§, āĻļā§āϧ⧠āĻāϞāĻžāĻĻāĻž IP āĻĒāĻžāϝāĻŧāĨ¤
docker network create \
--driver ipvlan \
--subnet=192.168.1.0/24 \
-o parent=eth0 \
my-ipvlan
āĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§: Wireless environments āĻ āĻĨāĻŦāĻž āϝā§āĻāĻžāύ⧠MAC address restriction āĻāĻā§ (āϝā§āĻŽāύ cloud providers)āĨ¤
bridge, host, none, āĻāĻŦāĻ overlay â āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰâ
āĻāĻžāϰ āĻāĻŋ network-āĻāϰ āĻŽā§āϞ āĻĒāĻžāϰā§āĻĨāĻā§āϝāĻāĻž āĻŦā§āĻāĻžāϰ āϏāĻŦāĻā§āϝāĻŧā§ āĻāĻžāϞ⧠āĻāĻĒāĻžāϝāĻŧ āĻšāϞ⧠āĻĻā§āĻāĻž â āĻĒā§āϰāϤāĻŋāĻāĻŋāϤ⧠container, host machine, āĻāĻŦāĻ āĻŦāĻžāĻāϰā§āϰ internet-āĻāϰ āĻŽāϧā§āϝ⧠relation āĻā§āĻŽāύāĨ¤ āύāĻŋāĻā§ āϏā§āĻāĻž diagram āĻāĻāĻžāϰ⧠āĻĻā§āĻāĻžāύ⧠āĻšāϞā§, āϤāĻžāϰāĻĒāϰ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻŦā§āϝāĻžāĻā§āϝāĻžāĨ¤
āĻāĻŦāĻžāϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ network mode-āĻāϰ āĻŽā§āϞ āĻĒāĻžāϰā§āĻĨāĻā§āϝāĻā§āϞ⧠āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻĻā§āĻāĻŋāĨ¤
bridge â āĻāĻāĻļāĻŋāĻ isolation, port mapping āĻĻāϰāĻāĻžāϰâ
bridge āĻšāϞ⧠Docker-āĻāϰ default network modeāĨ¤ Docker āĻāĻāĻāĻŋ virtual switch (docker0) āϤā§āϰāĻŋ āĻāϰ⧠āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋāĻāĻŋ container-āĻā§ āĻāĻāĻāĻŋ veth pair āĻĻāĻŋāϝāĻŧā§ āϏā§āĻ switch-āĻ connect āĻāϰā§āĨ¤
Container-āĻā§āϞ⧠āύāĻŋāĻā§āĻĻā§āϰ āĻŽāϧā§āϝ⧠āĻāĻĨāĻž āĻŦāϞāϤ⧠āĻĒāĻžāϰā§, āĻāĻŋāύā§āϤ⧠āĻŦāĻžāĻāϰā§āϰ world āĻĨā§āĻā§ access āĻāϰāϤ⧠āĻšāϞ⧠NAT (Network Address Translation) āĻāĻŦāĻ explicit port mapping āĻĻāϰāĻāĻžāϰāĨ¤
# container-āĻāϰ port 80 āĻā§ host-āĻāϰ port 8080-āĻ map āĻāϰāĻž
docker run -d -p 8080:80 nginx
Host machine-āĻāϰ āĻŦāĻžāĻāϰ⧠āĻĨā§āĻā§ http://host-ip:8080 āĻĻāĻŋāϝāĻŧā§ access āĻāϰāϤ⧠āĻšāĻŦā§ â āϏāϰāĻžāϏāϰāĻŋ container-āĻāϰ IP āĻĻāĻŋāϝāĻŧā§ āύāĻžāĨ¤
host â āĻā§āύ⧠isolation āύā§āĻ, āϏāϰā§āĻŦā§āĻā§āĻ performanceâ
host mode-āĻ container-āĻāĻŋ host-āĻāϰ network stack āϏāϰāĻžāϏāϰāĻŋ share āĻāϰ⧠â āĻāϞāĻžāĻĻāĻž āĻā§ āύ⧠virtual network interface āύā§āĻ, āĻāϞāĻžāĻĻāĻž IP āύā§āĻāĨ¤
Container āϝāĻĻāĻŋ port 80 listen āĻāϰā§, āϏā§āĻāĻž āϏāϰāĻžāϏāϰāĻŋ host-āĻāϰ port 80 â āĻā§āύ⧠NAT āĻŦāĻž port mapping āĻāĻžāĻĄāĻŧāĻžāĻāĨ¤
docker run -d --network host nginx
# āĻāĻāύ host-āĻāϰ port 80-āĻ āϏāϰāĻžāϏāϰāĻŋ accessible, -p flag āϞāĻžāĻāĻŦā§ āύāĻž
āĻĻā§āĻā§ āĻŦāĻĄāĻŧ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž āĻāĻā§:
- Host-āĻ āϝāĻĻāĻŋ port
80already āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻšāĻā§āĻā§, port conflict āĻšāĻŦā§ - Linux-only â Docker Desktop (Mac/Windows)-āĻ āĻ āĻŋāĻāĻŽāϤ⧠āĻāĻžāĻ āĻāϰ⧠āύāĻž
none â āϏāĻŽā§ āĻĒā§āϰā§āĻŖ isolationâ
none mode-āĻ container-āĻāϰ āĻā§āύ⧠network interface āĻĨāĻžāĻā§ āύāĻž â āĻļā§āϧ⧠loopback (lo) āĻĨāĻžāĻā§āĨ¤ Internet āύā§āĻ, āĻ
āύā§āϝ container-āĻāĻ āϝā§āĻāĻžāϝā§āĻ āύā§āĻāĨ¤
docker run -d --network none alpine sleep 3600
# container-āĻāϰ āĻā§āϤāϰ⧠āĻāĻŋāϝāĻŧā§ āĻĻā§āĻāϞā§:
# ip addr â āĻļā§āϧ⧠lo: 127.0.0.1 āĻĻā§āĻāĻžāĻŦā§
āĻāĻ mode-āĻāĻŋ security sandbox āĻšāĻŋāϏā§āĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻšāϝāĻŧ â āϝā§āĻŽāύ untrusted code āĻāĻžāϞāĻžāύ⧠āĻŦāĻž cryptographic key processing āϝā§āĻāĻžāύ⧠network access āĻĻā§āĻāϝāĻŧāĻž āĻŦāĻŋāĻĒāĻā§āĻāύāĻāĨ¤
overlay â multi-host networkingâ
overlay network-āĻ physically āĻāϞāĻžāĻĻāĻž āĻāϞāĻžāĻĻāĻž host-āĻ āĻĨāĻžāĻāĻž container-āĻā§āϞ⧠āĻāĻāĻ virtual network-āĻ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§āĨ¤ VXLAN tunneling āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĻā§āĻāĻŋ host-āĻāϰ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋ encrypted tunnel āϤā§āϰāĻŋ āĻšāϝāĻŧāĨ¤
āĻāĻ mode āĻāĻŋ primarily Docker Swarm āĻŦāĻž Kubernetes-āĻāϰ āĻāύā§āϝāĨ¤
# Swarm mode initialize āĻāϰāϤ⧠āĻšāĻŦā§ āĻāĻā§
docker swarm init
# āϤāĻžāϰāĻĒāϰ overlay network āϤā§āϰāĻŋ
docker network create --driver overlay my-cluster-net
# service deploy āĻāϰāĻž
docker service create --network my-cluster-net --replicas 3 nginx
bridge-āĻāϰ āĻŽāϤā§āĻ āĻĻā§āĻāϤā§, āĻāĻŋāύā§āϤ⧠āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻšāϞ⧠â container āĻā§āϞ⧠āĻāĻŋāύā§āύ physical machine-āĻ āĻĨāĻžāĻāϞā§āĻ āĻāĻā§ āĻ
āĻĒāϰāĻā§ directly ping āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤
When would you use the host` network mode?â
host mode āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύā§āĻāϝāĻŧāĻžāϰ āĻāĻā§ āĻŽā§āϞ āĻĒā§āϰāĻļā§āύ āĻšāϞ⧠â NAT-āĻāϰ overhead āĻāĻŋ āϏāϤā§āϝāĻŋāĻ āϏāĻŽāϏā§āϝāĻž āĻāϰāĻā§?
āϤāĻŋāύāĻāĻŋ concrete scenario-āϤ⧠host mode āϝā§āĻā§āϤāĻŋāϏāĻāĻāϤ:
ā§§. High-throughput networking āĻĻāϰāĻāĻžāϰ: āϝā§āĻŽāύ āĻĒā§āϰāϤāĻŋ āϏā§āĻā§āύā§āĻĄā§ āϞāĻā§āώāĻžāϧāĻŋāĻ packet process āĻāϰāĻž network monitoring tool, IDS (Intrusion Detection System), āĻŦāĻž packet snifferāĨ¤ NAT-āĻāϰ extra hop āĻāĻāĻžāύ⧠measurable latency āϝā§āĻ āĻāϰā§āĨ¤
⧍. Raw socket āĻŦāĻž āĻĒā§āϰāĻā§āϰ dynamic port āĻĻāϰāĻāĻžāϰ: āϝā§āĻŽāύ tcpdump, Wireshark, āĻŦāĻž WebRTC-based application āϝā§āĻā§āϞ⧠āĻ
āύā§āĻāĻā§āϞ⧠ephemeral port āĻā§āϞ⧠â -p flag āĻĻāĻŋāϝāĻŧā§ āϏāĻŦāĻā§āϞ⧠map āĻāϰāĻž practical āύāĻžāĨ¤
ā§Š. Host-āĻāϰ network interface āϏāϰāĻžāϏāϰāĻŋ āĻĻā§āĻāĻž āĻĻāϰāĻāĻžāϰ: āϝā§āĻŽāύ DHCP server, VPN gateway, āĻŦāĻž network configuration tool āϝā§āĻā§āϞ⧠host-āĻāϰ actual NIC-āĻāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰā§āĨ¤
āϏāĻžāϧāĻžāϰāĻŖ web application āĻŦāĻž microservice-āĻāϰ āĻāύā§āϝ host mode āĻĻāϰāĻāĻžāϰ āύā§āĻ â bridgeāĻ āϝāĻĨā§āώā§āĻ āĻāĻŦāĻ āĻŦā§āĻļāĻŋ secureāĨ¤
What is the default network mode for a Docker container?â
Docker container-āĻāϰ default network mode āĻšāϞ⧠bridgeāĨ¤ āϝāĻāύ āϤā§āĻŽāĻŋ āĻā§āύ⧠--network flag āĻāĻžāĻĄāĻŧāĻž container run āĻāϰā§, Docker automatically āϏā§āĻāĻžāĻā§ docker0 āύāĻžāĻŽā§āϰ default bridge network-āĻ āϝā§āĻā§āϤ āĻāϰā§āĨ¤
# āĻāĻ āĻĻā§āĻā§ command āĻāĻāĻ āĻāĻžāĻ āĻāϰā§
docker run nginx
docker run --network bridge nginx
# verify āĻāϰāϤā§
docker inspect <container_id> | grep NetworkMode
# output: "NetworkMode": "bridge"
āϤāĻŦā§ default bridge āĻāϰ user-defined bridge-āĻāϰ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻž āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻāĻā§ â āϏā§āĻāĻž āĻšāϞ⧠DNS resolution, āϝā§āĻāĻž āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧ āĻĒā§āϰāĻļā§āύ⧠āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāϞā§āĻāύāĻž āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤
How does DNS resolution work between containers on the same bridge network?â
āĻāĻāĻžāύ⧠default bridge āĻāϰ user-defined bridge āĻāϞāĻžāĻĻāĻžāĻāĻžāĻŦā§ āĻāĻāϰāĻŖ āĻāϰā§āĨ¤
Default Bridge-āĻ DNS āĻāĻžāĻ āĻāϰ⧠āύāĻž â āĻā§āύ?
Default bridge network (docker0) āĻĒā§āϰāύ⧠design-āĻāϰāĨ¤ āĻāĻāĻžāύ⧠Docker āĻā§āύ⧠embedded DNS server āĻāĻžāϞāĻžāϝāĻŧ āύāĻžāĨ¤ Container āĻā§āϞ⧠āĻļā§āϧā§āĻŽāĻžāϤā§āϰ IP address āĻĻāĻŋāϝāĻŧā§ āĻāĻā§ āĻ
āĻĒāϰāĻā§ āĻā§āύā§āĨ¤
# default bridge-āĻ run āĻāϰāϞā§
docker run -d --name web nginx
docker run -d --name db postgres
# web āĻĨā§āĻā§ db-āϤ⧠name āĻĻāĻŋāϝāĻŧā§ ping āĻāϰāϞ⧠FAIL āĻšāĻŦā§
docker exec web ping db
# ping: db: Name or service not known â
āĻāĻāĻŽāĻžāϤā§āϰ āĻāĻĒāĻžāϝāĻŧ āĻāĻŋāϞ --link flag, āĻāĻŋāύā§āϤ⧠āϏā§āĻāĻž āĻāĻāύ deprecatedāĨ¤
User-defined Bridge-āĻ DNS āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§?
User-defined bridge network āϤā§āϰāĻŋ āĻāϰāϞ⧠Docker automatically āĻāĻāĻāĻŋ embedded DNS server āĻāĻžāϞāĻžāϝāĻŧ â 127.0.0.11:53āĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻŋ container-āĻāϰ /etc/resolv.conf-āĻ āĻāĻ address āĻĨāĻžāĻā§āĨ¤
# network āϤā§āϰāĻŋ āĻāϰā§
docker network create my-net
# container run āĻāϰā§
docker run -d --name web --network my-net nginx
docker run -d --name db --network my-net postgres
# āĻāĻāύ name āĻĻāĻŋāϝāĻŧā§āĻ communicate āĻāϰāĻž āϝāĻžāĻŦā§
docker exec web ping db # â
āĻāĻžāĻ āĻāϰāĻŦā§
docker exec web curl http://db # â
āĻāĻžāĻ āĻāϰāĻŦā§
Container-āĻāϰ āĻā§āϤāϰ⧠āĻāĻŋāϝāĻŧā§ āĻĻā§āĻāϞ⧠â
docker exec web cat /etc/resolv.conf
# nameserver 127.0.0.11
# options ndots:0
DNS Resolution-āĻāϰ āϧāĻžāĻĒāĻā§āϞā§
web container āĻĨā§āĻā§ db-āĻā§ call āĻāϰāϞ⧠āϝāĻž āĻšāϝāĻŧ:
web container
âââ "db" āύāĻžāĻŽāĻāĻž resolve āĻāϰāϤ⧠āĻšāĻŦā§
âââ /etc/resolv.conf â nameserver 127.0.0.11
âââ Docker embedded DNS server
âââ "db" â 172.18.0.3
âââ packet āĻāϞ⧠āϝāĻžāϝāĻŧ db container-āĻ â
Container restart āĻšāϞā§āĻ db āύāĻžāĻŽāĻāĻž same āĻĨāĻžāĻā§ â āĻļā§āϧ⧠IP āĻĒā§āĻāύ⧠internally update āĻšāϝāĻŧāĨ¤ āϤā§āĻŽāĻžāϰ code-āĻ āĻā§āύ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āϞāĻžāĻā§ āύāĻžāĨ¤
Default vs User-defined Bridge â āĻāĻāĻā§ āϤā§āϞāύāĻž
| āĻŦāĻŋāώāϝāĻŧ | default bridge | user-defined bridge |
|---|---|---|
| DNS by container name | â āύā§āĻ | â āĻāĻā§ |
| Communication | IP āĻĻāĻŋāϝāĻŧā§ | Name āĻĻāĻŋāϝāĻŧā§ |
--link āĻĻāϰāĻāĻžāϰ | āĻšā§āϝāĻžāĻ (deprecated) | āύāĻž |
| Isolation | āϏāĻŦ container āĻāĻāϏāĻžāĻĨā§ | Network āĻ āύā§āϝāĻžāϝāĻŧā§ āĻāϞāĻžāĻĻāĻž |
| Production ready | āύāĻž | āĻšā§āϝāĻžāĻ |
Best practice: Production āĻŦāĻž Docker Compose-āĻ āϏāĻŦāϏāĻŽāϝāĻŧ user-defined bridge āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĨ¤ Docker Compose āĻāĻāĻž automatically āĻāϰ⧠â āĻĒā§āϰāϤāĻŋāĻāĻŋ
docker-compose.ymlāĻāĻāĻāĻŋ āĻāϞāĻžāĻĻāĻž network āϤā§āϰāĻŋ āĻāϰ⧠āϝā§āĻāĻžāύ⧠service name-āĻ hostname āĻšāĻŋāϏā§āĻŦā§ āĻāĻžāĻ āĻāϰā§āĨ¤
đĄī¸ 11. How does Docker container networking work internally?â
Linux Networking Primitives â Docker-āĻāϰ āĻāĻŋāϤā§āϤāĻŋâ
Docker āύāĻŋāĻā§ āĻā§āύ⧠āύāϤā§āύ networking system āϤā§āϰāĻŋ āĻāϰā§āύāĻŋāĨ¤ āĻāĻāĻŋ Linux kernel-āĻāϰ āϤāĻŋāύāĻāĻŋ existing feature āĻāĻāϏāĻžāĻĨā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§:
Network Namespace â āĻĒā§āϰāϤāĻŋāĻāĻŋ container āĻāĻāĻāĻŋ āĻāϞāĻžāĻĻāĻž isolated network stack āĻĒāĻžāϝāĻŧ (āύāĻŋāĻāϏā§āĻŦ routing table, iptables rules, interfaces)āĨ¤
veth pair â āĻĻā§āĻāĻŋ virtual NIC āϝā§āĻā§āϞ⧠āĻāĻāĻāĻŋ "wire" āĻĻāĻŋāϝāĻŧā§ āϏāĻāϝā§āĻā§āϤ â āĻāĻāĻāĻŋāϤ⧠āϝāĻž āĻĸā§āĻā§ āĻ āύā§āϝāĻāĻŋ āĻĨā§āĻā§ āĻŦā§āϰ āĻšāϝāĻŧāĨ¤
Linux bridge (docker0) â āĻāĻāĻāĻŋ software-based Layer 2 switch āϝā§āĻāĻŋ veth pair-āĻā§āϞā§āĻā§ āĻāĻāϏāĻžāĻĨā§ connect āĻāϰā§āĨ¤
What is a veth pair and how does Docker use it?â
veth āĻŽāĻžāύ⧠virtual ethernetāĨ¤ āĻāĻāĻž āϏāĻŦāϏāĻŽāϝāĻŧ āĻā§āĻĄāĻŧāĻžāϝāĻŧ āĻāϏ⧠â āĻāĻāĻāĻž end container-āĻāϰ āĻā§āϤāϰ⧠(eth0), āĻ
āύā§āϝāĻāĻž host-āĻ (vethXXXXXX)āĨ¤ āĻāĻāĻāĻžāϝāĻŧ āĻāĻŋāĻā§ āĻĸā§āĻāϞ⧠āĻ
āύā§āϝāĻāĻžāϝāĻŧ āĻŦā§āϰā§āϝāĻŧ â āĻ āĻŋāĻ āĻāĻāĻāĻž physical cable-āĻāϰ āĻŽāϤā§, āĻāĻŋāύā§āϤ⧠software-āĻāĨ¤Docker āĻĒā§āϰāϤāĻŋāĻāĻŋ container āϤā§āϰāĻŋāϰ āϏāĻŽāϝāĻŧ automatically āĻāĻ āĻāĻžāĻāĻā§āϞ⧠āĻāϰā§:
# Docker āϝāĻž āĻāϰ⧠(internally):
ip link add veth3f2a1b type veth peer name eth0 # pair āϤā§āϰāĻŋ
ip link set eth0 netns <container-pid> # eth0 āĻā§ container-āĻ āĻĻāĻŋāϝāĻŧā§ āĻĻā§āĻāϝāĻŧāĻž
ip addr add 172.17.0.2/16 dev eth0 # container-āĻ IP assign
ip link set veth3f2a1b up # host-side āĻāĻžāϞ⧠āĻāϰāĻž
# verify āĻāϰāϤā§:
ip link show type veth # āϏāĻŦ veth pair āĻĻā§āĻāĻž āϝāĻžāĻŦā§
What is the docker0 bridge interface?â
docker0 āĻšāϞ⧠Linux-āĻāϰ bridge module āĻĻāĻŋāϝāĻŧā§ āϤā§āϰāĻŋ āĻāĻāĻāĻŋ virtual network switchāĨ¤ āĻāĻāĻŋ Layer 2-āĻ āĻāĻžāĻ āĻāϰ⧠â MAC address āĻĻā§āĻā§ packet forward āĻāϰā§, āĻ āĻŋāĻ physical switch-āĻāϰ āĻŽāϤā§āĨ¤
veth-āĻāϰ host-side end āĻā§āϞ⧠āĻā§āĻĨāĻžāĻ connect āĻšāϤ⧠āĻšāĻŦā§āĨ¤ docker0 āĻšāϞ⧠āϏā§āĻ virtual switch (Linux bridge) â āϏāĻŦ container-āĻāϰ vethXXXX āĻā§āϞ⧠āĻāĻ bridge-āĻ plug in āĻšāϝāĻŧāĨ¤
# docker0 āĻĻā§āĻāĻž:
ip addr show docker0
# â inet 172.17.0.1/16 â āĻāĻāĻžāĻ āϏāĻŦ container-āĻāϰ default gateway
# bridge-āĻ āĻā§āύ āĻā§āύ veth attached āĻāĻā§ āĻĻā§āĻāĻž:
bridge link show
# â veth3f2a1b master docker0 state forwarding
# container-āĻāϰ routing table:
docker exec mycontainer ip route
# â default via 172.17.0.1 dev eth0 â docker0-āĻā§āĻ gateway āĻšāĻŋāϏā§āĻŦā§ āĻĻā§āĻā§
docker0 āĻāĻāĻāĻŋ Layer 2 switch āĻšāĻŋāϏā§āĻŦā§ āĻāĻžāĻ āĻāϰ⧠â same network-āĻ āĻĨāĻžāĻāĻž container-āĻā§āϞā§āϰ āĻŽāϧā§āϝ⧠frame forward āĻāϰā§āĨ¤ Internet-āĻ āϝā§āϤ⧠āĻšāϞ⧠packet docker0 â host eth0 â NAT â internet āĻĒāĻĨā§ āϝāĻžāϝāĻŧāĨ¤
How does Docker implement inter-container communication (ICC)?â
āĻĻā§āĻāĻŋ container āϝāĻāύ same bridge network-āĻ āĻĨāĻžāĻā§, āϤāĻāύ āϤāĻžāϰāĻž docker0-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϏāϰāĻžāϏāϰāĻŋ āĻāĻĨāĻž āĻŦāϞāϤ⧠āĻĒāĻžāϰā§āĨ¤ Kernel-āĻ āĻāĻāĻŋ implement āĻšāϝāĻŧ iptables FORWARD chain āĻĻāĻŋāϝāĻŧā§āĨ¤
Container A (172.17.0.2) â vethA â docker0 â vethB â Container B (172.17.0.3)
Docker daemon āĻĻā§āĻāĻŋ mode support āĻāϰā§:
# ICC enable (default) â FORWARD chain-āĻ ACCEPT rule
dockerd --icc=true
# ICC disable â FORWARD chain-āĻ DROP rule, explicit --link āĻāĻžāĻĄāĻŧāĻž āĻāĻĨāĻž āĻšāĻŦā§ āύāĻž
dockerd --icc=false
iptables-āĻ āĻāĻāĻŋ āĻāĻāĻžāĻŦā§ āĻĻā§āĻāĻž āϝāĻžāϝāĻŧ:
iptables -L FORWARD -n
# Chain FORWARD (policy DROP)
# DOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0
# DOCKER-ISOLATION-STAGE-1 all -- ...
# ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
# DOCKER all -- 0.0.0.0/0 0.0.0.0/0
# ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 (icc=true āĻšāϞā§)
āĻāϞāĻžāĻĻāĻž network-āĻ āĻĨāĻžāĻāĻž container-āĻā§āϞ⧠by default āĻāĻā§ āĻ āĻĒāϰā§āϰ āϏāĻžāĻĨā§ āĻāĻĨāĻž āĻŦāϞāϤ⧠āĻĒāĻžāϰ⧠āύāĻž â āϤāĻžāĻĻā§āϰ āĻŽāϧā§āϝ⧠āĻā§āύ⧠bridge connection āύā§āĻāĨ¤
How does port mapping (-p) work at the kernel level?â
-p 8080:80 āĻĻāĻŋāϞ⧠āĻŽāύ⧠āĻšāϝāĻŧ Docker āĻāĻŋāĻā§ magic āĻāϰāĻā§ â āĻāϏāϞ⧠āĻāĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖāĻāĻžāĻŦā§ iptables NAT rules āĻĻāĻŋāϝāĻŧā§ implement āĻāϰāĻžāĨ¤
docker run -d -p 8080:80 nginx
āĻāĻ command-āĻāĻŋ āĻāĻžāϞāĻžāϞ⧠Docker āĻĒāϰā§āĻĻāĻžāϰ āĻāĻĄāĻŧāĻžāϞ⧠āĻĻā§āĻāĻŋ iptables rule āϝā§āĻ āĻāϰā§:
# Rule ā§§ â Inbound: DNAT (Destination NAT)
# āĻŦāĻžāĻāϰ⧠āĻĨā§āĻā§ host:8080 āĻāϏāĻž packet-āĻāϰ destination āĻŦāĻĻāϞ⧠āĻĻāĻžāĻ â container:80
iptables -t nat -A DOCKER \
-p tcp --dport 8080 \
-j DNAT --to-destination 172.17.0.2:80
# Rule ⧍ â Outbound: MASQUERADE
# container āĻĨā§āĻā§ āĻŦāĻžāĻāϰ⧠āϝāĻžāĻāϝāĻŧāĻž packet-āĻāϰ source IP āĻŦāĻĻāϞ⧠host-āĻāϰ IP āĻĻāĻžāĻ
iptables -t nat -A POSTROUTING \
-s 172.17.0.2/32 \
-d 172.17.0.2/32 \
-p tcp --dport 80 \
-j MASQUERADE
Packet journey āĻāĻž step-by-step:
Client â host:8080
â iptables PREROUTING (DNAT)
â destination āĻŦāĻĻāϞ⧠â 172.17.0.2:80
â kernel routing â docker0 bridge
â veth pair â container-āĻāϰ eth0
â nginx process port 80-āĻ receive āĻāϰā§
āϤā§āĻŽāĻŋ āύāĻŋāĻā§ āĻāĻ rules āĻĻā§āĻāϤ⧠āĻĒāĻžāϰāĻŦā§:
iptables -t nat -L -n --line-numbers
# Chain DOCKER (2 references)
# num target prot opt source destination
# 1 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.2:80
āĻŽā§āϞ āĻāĻĨāĻž āĻšāϞ⧠â Docker networking āĻŽā§āϞāϤ āϤāĻŋāύāĻāĻŋ Linux kernel feature-āĻāϰ orchestration:
network namespaceāĻĻāĻŋāϝāĻŧā§ isolation,veth pairāĻĻāĻŋāϝāĻŧā§ connectivity, āĻāĻŦāĻiptablesāĻĻāĻŋāϝāĻŧā§ NAT āĻ access controlāĨ¤ Docker daemon āĻļā§āϧ⧠āĻāĻ tools-āĻā§āϞ⧠āϏāĻ āĻŋāĻ āϏāĻŽāϝāĻŧā§ āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ configure āĻāϰā§āĨ¤
đ 12. How do containers communicate with each other and with the outside world?â
Path A â Container â Container (same network):
āĻāĻāĻ bridge network-āĻ āĻĨāĻžāĻāϞ⧠traffic āϏāϰāĻžāϏāϰāĻŋ
docker0 bridge āĻĻāĻŋāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤ NAT āϞāĻžāĻā§ āύāĻž, internet-āĻ āϝāĻžāϝāĻŧ āύāĻžāĨ¤ User-defined network-āĻ container name āĻĻāĻŋāϝāĻŧā§āĻ reach āĻāϰāĻž āϝāĻžāϝāĻŧāĨ¤
Path B â Container â Internet (outbound):
Container-āĻāϰ packet docker0 â eth0 āĻĒāĻĨā§ āϝāĻžāϝāĻŧāĨ¤ iptables POSTROUTING chain-āĻ MASQUERADE rule container-āĻāϰ private IP (172.17.x.x) āĻā§ host-āĻāϰ public IP-āϤ⧠āĻŦāĻĻāϞ⧠āĻĻā§āϝāĻŧāĨ¤
Path C â Internet â Container (inbound):
-p 8080:80 āĻĻāĻŋāϞ⧠iptables PREROUTING-āĻ DNAT rule āϤā§āϰāĻŋ āĻšāϝāĻŧāĨ¤ Host-āĻāϰ 8080-āĻ āĻāϏāĻž packet-āĻāϰ destination 172.17.0.2:80-āĻ rewrite āĻšāϝāĻŧāĨ¤
What is the difference between exposing a port (EXPOSE) and publishing a port (-p)?â
āĻāĻāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ documentation â container āĻā§āύ port-āĻ listen āĻāϰāĻžāϰ āĻāĻā§āĻāĻž āϰāĻžāĻā§ āϏā§āĻāĻž āĻāĻžāύāĻžāϝāĻŧāĨ¤ āĻā§āύ⧠actual binding āĻšāϝāĻŧ āύāĻž, host-āĻ āĻā§āύ⧠port āĻā§āϞ⧠āύāĻžāĨ¤ Same network-āĻāϰ āĻ āύā§āϝ container āĻāĻ port reach āĻāϰāϤ⧠āĻĒāĻžāϰā§, āĻāĻŋāύā§āϤ⧠āĻŦāĻžāĻāϰā§āϰ world āĻĒāĻžāϰ⧠āύāĻžāĨ¤
# Dockerfile
EXPOSE 80 # āĻļā§āϧ⧠āĻŦāϞāĻā§ â "āĻāĻŽāĻŋ 80-āĻ listen āĻāϰāĻŦ"
EXPOSE 80/tcp
EXPOSE 53/udp
-p (docker run):
āĻāĻāĻž actual action â host-āĻ port bind āĻāϰ⧠āĻāĻŦāĻ iptables-āĻ DNAT rule āϤā§āϰāĻŋ āĻāϰā§āĨ¤ āĻāĻāĻžāĻĄāĻŧāĻž docker-proxy process-āĻ start āĻšāϝāĻŧāĨ¤
# Syntax
docker run -p [host_ip:]<host_port>:<container_port>[/protocol]
docker run -p 8080:80 nginx # 0.0.0.0:8080 â container:80
docker run -p 127.0.0.1:8080:80 nginx # āĻļā§āϧ⧠localhost āĻĨā§āĻā§
docker run -p 80 nginx # random host port â container:80
docker run -P nginx # āϏāĻŦ EXPOSE āĻāϰāĻž port publish āĻāϰā§
How does Docker handle container-to-container communication across hosts?â
Single host-āĻ docker0 bridge āĻāĻžāĻ āĻāϰā§, āĻāĻŋāύā§āϤ⧠āĻāϞāĻžāĻĻāĻž host-āĻ āĻĨāĻžāĻāĻž container āĻā§āϞ⧠āύāĻŋāĻā§āϰāĻž āύāĻŋāĻā§āϰāĻž reach āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āύāĻž â āĻāĻžāϰāĻŖ 172.17.x.x address āĻā§āϞ⧠private āĻāĻŦāĻ host-āĻāϰ āĻŦāĻžāĻāϰ⧠routable āύāĻžāĨ¤
āϏāĻŽāĻžāϧāĻžāύā§āϰ āĻāĻĒāĻžāϝāĻŧ:
ā§§. Overlay Network â Docker Swarm / Kubernetes (āϏāĻŦāĻā§āϝāĻŧā§ native)
⧍. Host Network â container-āĻāϰ port directly expose āĻāϰā§, IP āĻĻāĻŋāϝāĻŧā§ reach āĻāϰā§
ā§Š. External Load Balancer â HAProxy, Nginx, Traefik
ā§Ē. Service Mesh â Consul, Istio (advanced)
Overlay network āĻāĻžāĻĄāĻŧāĻž manually āĻāϰāϤ⧠āĻšāϞā§:
# Host A-āϤ⧠container run āĻāϰā§, port publish āĻāϰā§
docker run -p 5432:5432 postgres
# Host B-āϤ⧠container āĻĨā§āĻā§ Host A-āĻā§ IP āĻĻāĻŋāϝāĻŧā§ reach āĻāϰā§
docker run -e DB_HOST=192.168.1.10 -e DB_PORT=5432 my-app
āĻāĻāĻž brittle â overlay network-āĻ āϏāĻ āĻŋāĻ āϏāĻŽāĻžāϧāĻžāύāĨ¤
How do you connect a container to multiple networks?â
āĻāĻāĻāĻŋ container āĻāĻāϏāĻžāĻĨā§ āĻāĻāĻžāϧāĻŋāĻ network-āĻ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻāĻž āĻĻāϰāĻāĻžāϰ āĻšāϝāĻŧ āϝāĻāύ container-āĻā§ bridge āĻšāĻŋāϏā§āĻŦā§ āĻāĻžāĻ āĻāϰāϤ⧠āĻšāϝāĻŧ â āϝā§āĻŽāύ āĻāĻāĻāĻŋ api container āϝā§āĻāĻž frontend-net āĻĨā§āĻā§āĻ accessible, āĻāĻŦāĻžāϰ backend-net-āĻāĻ āĻāĻā§āĨ¤
Docker Compose-āĻ:
services:
nginx:
image: nginx
networks:
- frontend-net # āĻļā§āϧ⧠frontend-āĻ
api:
image: my-api
networks:
- frontend-net # nginx āĻĨā§āĻā§ reach āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§
- backend-net # db-āĻā§āĻ reach āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§
db:
image: postgres
networks:
- backend-net # āĻļā§āϧ⧠backend-āĻ (nginx reach āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§ āύāĻž)
networks:
frontend-net:
backend-net:
āĻŽā§āϞ takeaway:
EXPOSEāĻšāϞ⧠blueprint,-pāĻšāϞ⧠actual wiringāĨ¤ Overlay network-āĻ multi-host communication-āĻāϰ āϏāĻ āĻŋāĻ āϏāĻŽāĻžāϧāĻžāύāĨ¤ āĻāϰ multiple network āĻĻāĻŋāϝāĻŧā§ fine-grained isolation āϤā§āϰāĻŋ āĻāϰāĻž āϝāĻžāϝāĻŧ â āϝā§āĻāĻž production architecture-āĻāϰ best practiceāĨ¤