Docker網(wǎng)絡(luò)模式詳解
一、概述
1.1 背景介紹
容器網(wǎng)絡(luò)是Docker使用中最容易出問題的部分。容器之間怎么通信、容器怎么訪問外網(wǎng)、外部怎么訪問容器內(nèi)的服務(wù)——這三個(gè)問題搞不清楚,排查網(wǎng)絡(luò)故障就是抓瞎。
Docker網(wǎng)絡(luò)基于Linux內(nèi)核的Network Namespace、veth pair、iptables和bridge實(shí)現(xiàn)。每個(gè)容器有自己獨(dú)立的網(wǎng)絡(luò)命名空間,通過veth pair連接到宿主機(jī)的網(wǎng)橋(docker0),再通過iptables NAT規(guī)則訪問外網(wǎng)。理解這個(gè)數(shù)據(jù)包流向,網(wǎng)絡(luò)問題排查就有了方向。
Docker提供了bridge、host、none、container、overlay、macvlan六種網(wǎng)絡(luò)模式,每種模式的隔離級別、性能、適用場景都不同。單機(jī)環(huán)境用bridge和host就夠了,跨主機(jī)通信需要overlay或macvlan。
1.2 技術(shù)特點(diǎn)
bridge模式:默認(rèn)模式,通過docker0網(wǎng)橋和veth pair實(shí)現(xiàn)容器間通信,通過iptables NAT實(shí)現(xiàn)外網(wǎng)訪問。隔離性好,有約5%-10%的網(wǎng)絡(luò)性能損耗
host模式:容器直接使用宿主機(jī)網(wǎng)絡(luò)棧,沒有NAT開銷,網(wǎng)絡(luò)性能和宿主機(jī)一致。但失去了網(wǎng)絡(luò)隔離性
none模式:容器沒有網(wǎng)絡(luò)接口(只有l(wèi)o),完全隔離。適合不需要網(wǎng)絡(luò)的批處理任務(wù)或安全敏感場景
container模式:多個(gè)容器共享同一個(gè)網(wǎng)絡(luò)命名空間,通過localhost通信。Kubernetes的Pod網(wǎng)絡(luò)就是基于這個(gè)原理
overlay模式:基于VXLAN的跨主機(jī)容器網(wǎng)絡(luò),Docker Swarm和部分K8s網(wǎng)絡(luò)插件使用
macvlan模式:容器直接獲得物理網(wǎng)絡(luò)的IP地址,像一臺獨(dú)立的物理機(jī)。適合需要直接接入物理網(wǎng)絡(luò)的場景
1.3 適用場景
bridge模式:大多數(shù)單機(jī)容器部署場景,開發(fā)測試環(huán)境
host模式:對網(wǎng)絡(luò)性能要求高的應(yīng)用(Nginx反向代理、高頻交易系統(tǒng)),需要監(jiān)聽大量端口的應(yīng)用
none模式:安全隔離要求高的計(jì)算任務(wù),不需要網(wǎng)絡(luò)的數(shù)據(jù)處理容器
container模式:Sidecar模式(日志收集、監(jiān)控代理),需要共享網(wǎng)絡(luò)的緊耦合容器
overlay模式:Docker Swarm集群中的跨主機(jī)服務(wù)通信
macvlan模式:需要容器擁有獨(dú)立MAC地址和IP的場景,傳統(tǒng)網(wǎng)絡(luò)架構(gòu)遷移
1.4 環(huán)境要求
| 組件 | 版本要求 | 說明 |
|---|---|---|
| Docker Engine | 20.10+(推薦24.0+) | 基本網(wǎng)絡(luò)功能所有版本都支持 |
| Linux內(nèi)核 | 3.10+(推薦5.4+) | overlay需要4.0+內(nèi)核的VXLAN支持 |
| iptables | 1.4+ | bridge模式的NAT依賴iptables |
| bridge-utils | 任意版本 | 調(diào)試用,brctl命令查看網(wǎng)橋信息 |
| iproute2 | 任意版本 | 調(diào)試用,ip命令查看網(wǎng)絡(luò)配置 |
| tcpdump | 任意版本 | 抓包分析用 |
二、詳細(xì)步驟
2.1 準(zhǔn)備工作
2.1.1 系統(tǒng)檢查
# 檢查內(nèi)核網(wǎng)絡(luò)模塊 lsmod | grep -E"bridge|vxlan|macvlan|overlay" # 檢查IP轉(zhuǎn)發(fā)是否開啟 sysctl net.ipv4.ip_forward # 必須為1 # 檢查iptables iptables -L -n iptables -t nat -L -n # 檢查docker0網(wǎng)橋 ip addr show docker0 brctl show docker0 # 安裝網(wǎng)絡(luò)調(diào)試工具 sudo apt install -y bridge-utils tcpdump iproute2 net-tools # Debian/Ubuntu sudo yum install -y bridge-utils tcpdump iproute net-tools # CentOS/RHEL
2.1.2 查看當(dāng)前Docker網(wǎng)絡(luò)
# 查看所有Docker網(wǎng)絡(luò)
docker network ls
# 默認(rèn)會(huì)有三個(gè)網(wǎng)絡(luò):
# bridge - 默認(rèn)bridge網(wǎng)絡(luò)
# host - host網(wǎng)絡(luò)
# none - 無網(wǎng)絡(luò)
# 查看bridge網(wǎng)絡(luò)詳情
docker network inspect bridge
# 查看網(wǎng)絡(luò)中的容器
docker network inspect bridge --format='{{range .Containers}}{{.Name}}: {{.IPv4Address}}{{"
"}}{{end}}'
2.2 核心配置
2.2.1 Bridge模式詳解
Bridge是Docker默認(rèn)的網(wǎng)絡(luò)模式。Docker啟動(dòng)時(shí)會(huì)創(chuàng)建一個(gè)docker0虛擬網(wǎng)橋,每個(gè)容器通過veth pair連接到docker0,容器之間通過網(wǎng)橋二層轉(zhuǎn)發(fā)通信,訪問外網(wǎng)通過iptables MASQUERADE做源地址轉(zhuǎn)換。
數(shù)據(jù)包流向:
容器eth0 → veth pair → docker0網(wǎng)橋 → iptables NAT → 宿主機(jī)eth0 → 外網(wǎng)
# 創(chuàng)建自定義bridge網(wǎng)絡(luò)(推薦,比默認(rèn)bridge功能更多) docker network create --driver bridge --subnet 172.20.0.0/24 --gateway 172.20.0.1 --opt"com.docker.network.bridge.name"="br-mynet" --opt"com.docker.network.bridge.enable_icc"="true" --opt"com.docker.network.bridge.enable_ip_masquerade"="true" mynet # 查看創(chuàng)建的網(wǎng)橋 brctl show ip addr show br-mynet # 在自定義網(wǎng)絡(luò)中運(yùn)行容器 docker run -d --name web1 --network mynet nginx:1.24-alpine docker run -d --name web2 --network mynet nginx:1.24-alpine # 自定義網(wǎng)絡(luò)支持容器名DNS解析(默認(rèn)bridge不支持) dockerexecweb1 ping -c 3 web2 # 能ping通,通過Docker內(nèi)置DNS解析容器名 # 指定容器IP docker run -d --name web3 --network mynet --ip 172.20.0.100 nginx:1.24-alpine # 查看容器網(wǎng)絡(luò)配置 dockerexecweb1 ip addr dockerexecweb1 ip route dockerexecweb1 cat /etc/resolv.conf
默認(rèn)bridge和自定義bridge的區(qū)別:
| 特性 | 默認(rèn)bridge | 自定義bridge |
|---|---|---|
| 容器名DNS解析 | 不支持(只能用IP) | 支持(推薦) |
| 容器間隔離 | 同網(wǎng)絡(luò)內(nèi)全部互通 | 同網(wǎng)絡(luò)內(nèi)互通,不同網(wǎng)絡(luò)隔離 |
| 熱插拔 | 不支持 | 支持(docker network connect/disconnect) |
| 自定義子網(wǎng) | 不方便 | 創(chuàng)建時(shí)指定 |
注意:生產(chǎn)環(huán)境不要用默認(rèn)bridge網(wǎng)絡(luò),用自定義bridge。默認(rèn)bridge不支持容器名DNS解析,容器重啟后IP可能變化,用IP通信會(huì)斷。
2.2.2 Host模式詳解
Host模式下容器直接使用宿主機(jī)的網(wǎng)絡(luò)命名空間,沒有網(wǎng)絡(luò)隔離,也沒有NAT轉(zhuǎn)換開銷。容器內(nèi)看到的網(wǎng)絡(luò)接口和宿主機(jī)完全一樣。
# 使用host網(wǎng)絡(luò)運(yùn)行容器 docker run -d --name nginx-host --network host nginx:1.24-alpine # 不需要-p端口映射,Nginx直接監(jiān)聽宿主機(jī)的80端口 curl http://localhost:80 # 查看容器網(wǎng)絡(luò)(和宿主機(jī)一樣) dockerexecnginx-host ip addr # 輸出和宿主機(jī)的 ip addr 完全一致 # 查看端口占用 ss -tlnp | grep 80 # 能看到nginx進(jìn)程直接監(jiān)聽在宿主機(jī)上
Host模式的性能對比:
# 用iperf3測試bridge和host模式的網(wǎng)絡(luò)吞吐量差異 # 啟動(dòng)iperf3服務(wù)端(bridge模式) docker run -d --name iperf-bridge -p 5201:5201 networkstatic/iperf3 -s # 啟動(dòng)iperf3服務(wù)端(host模式) docker run -d --name iperf-host --network host networkstatic/iperf3 -s # 測試bridge模式吞吐量 docker run --rm networkstatic/iperf3 -c <宿主機(jī)IP> -p 5201 # 典型結(jié)果:約30-40 Gbps(取決于硬件) # 測試host模式吞吐量 docker run --rm --network host networkstatic/iperf3 -c 127.0.0.1 -p 5201 # 典型結(jié)果:約45-50 Gbps # host模式比bridge模式吞吐量高約15%-25%
警告:host模式下容器端口直接占用宿主機(jī)端口,多個(gè)容器不能監(jiān)聽同一端口。而且容器能看到宿主機(jī)所有網(wǎng)絡(luò)接口和連接,安全隔離性為零。
2.2.3 None模式詳解
None模式下容器只有l(wèi)o回環(huán)接口,沒有任何外部網(wǎng)絡(luò)連接。適合不需要網(wǎng)絡(luò)的計(jì)算任務(wù),或者需要完全自定義網(wǎng)絡(luò)的場景。
# 使用none網(wǎng)絡(luò)運(yùn)行容器 docker run -d --name isolated --network none alpine sleep 3600 # 查看容器網(wǎng)絡(luò)接口(只有l(wèi)o) dockerexecisolated ip addr # 輸出: # 1: lo:mtu 65536 # inet 127.0.0.1/8 scope host lo # 驗(yàn)證無法訪問外網(wǎng) dockerexecisolated ping -c 1 8.8.8.8 # ping: sendto: Network is unreachable # 適用場景:數(shù)據(jù)加密/解密處理 docker run --rm --network none -v /data/input:/input:ro -v /data/output:/output crypto-tool encrypt /input/data.bin /output/data.enc
2.2.4 Container模式詳解
Container模式讓一個(gè)容器共享另一個(gè)容器的網(wǎng)絡(luò)命名空間。兩個(gè)容器通過localhost通信,共享IP地址和端口空間。Kubernetes的Pod就是基于這個(gè)原理——Pod內(nèi)所有容器共享同一個(gè)網(wǎng)絡(luò)命名空間。
# 先啟動(dòng)一個(gè)基礎(chǔ)容器 docker run -d --name base-container -p 8080:80 nginx:1.24-alpine # 啟動(dòng)第二個(gè)容器,共享base-container的網(wǎng)絡(luò) docker run -d --name sidecar --network container:base-container alpine sleep 3600 # sidecar可以通過localhost訪問nginx dockerexecsidecar wget -qO- http://localhost:80 # 返回Nginx默認(rèn)頁面 # 兩個(gè)容器的網(wǎng)絡(luò)接口完全一樣 dockerexecbase-container ip addr dockerexecsidecar ip addr # 輸出一致 # 典型應(yīng)用:日志收集sidecar docker run -d --name app -p 8080:8080 myapp:1.0 docker run -d --namelog-collector --network container:app -v /data/logs:/logs fluentd:v1.16 # log-collector通過localhost收集app的日志
2.2.5 Overlay模式詳解
Overlay網(wǎng)絡(luò)基于VXLAN隧道實(shí)現(xiàn)跨主機(jī)容器通信。數(shù)據(jù)包在源主機(jī)封裝VXLAN頭部,通過UDP 4789端口發(fā)送到目標(biāo)主機(jī),目標(biāo)主機(jī)解封裝后轉(zhuǎn)發(fā)給目標(biāo)容器。
# 初始化Docker Swarm(overlay網(wǎng)絡(luò)需要Swarm模式) docker swarm init --advertise-addr 192.168.1.10 # 在其他節(jié)點(diǎn)加入Swarm # docker swarm join --token192.168.1.10:2377 # 創(chuàng)建overlay網(wǎng)絡(luò) docker network create --driver overlay --subnet 10.10.0.0/24 --gateway 10.10.0.1 --attachable my-overlay # --attachable 允許非Swarm服務(wù)的獨(dú)立容器也能加入這個(gè)網(wǎng)絡(luò) # 在overlay網(wǎng)絡(luò)中部署服務(wù) docker service create --name web --network my-overlay --replicas 3 -p 80:80 nginx:1.24-alpine # 驗(yàn)證跨主機(jī)通信 docker service ps web # 三個(gè)副本分布在不同節(jié)點(diǎn)上,通過overlay網(wǎng)絡(luò)互通
注意:overlay網(wǎng)絡(luò)有約10%-15%的性能損耗(VXLAN封裝/解封裝開銷)。對延遲敏感的應(yīng)用(如Redis集群),建議用macvlan或host模式。
2.2.6 Macvlan模式詳解
Macvlan讓容器直接獲得物理網(wǎng)絡(luò)的IP地址,每個(gè)容器有獨(dú)立的MAC地址,在網(wǎng)絡(luò)上表現(xiàn)得像一臺獨(dú)立的物理機(jī)。不經(jīng)過NAT,網(wǎng)絡(luò)性能接近原生。
# 創(chuàng)建macvlan網(wǎng)絡(luò) # 需要知道宿主機(jī)的物理網(wǎng)卡名和所在網(wǎng)段 docker network create --driver macvlan --subnet 192.168.1.0/24 --gateway 192.168.1.1 --opt parent=eth0 my-macvlan # 運(yùn)行容器(指定IP) docker run -d --name db --network my-macvlan --ip 192.168.1.200 mysql:8.0.35 # 容器直接擁有192.168.1.200這個(gè)IP # 同網(wǎng)段的其他機(jī)器可以直接訪問192.168.1.200:3306 # 查看容器MAC地址 dockerexecdb ip link show eth0 # 每個(gè)容器有獨(dú)立的MAC地址
注意:macvlan模式下,容器和宿主機(jī)之間默認(rèn)無法通信(這是macvlan的設(shè)計(jì)限制)。如果需要宿主機(jī)訪問容器,需要在宿主機(jī)上創(chuàng)建macvlan子接口:
# 在宿主機(jī)上創(chuàng)建macvlan子接口 ip link add macvlan-host link eth0typemacvlan mode bridge ip addr add 192.168.1.201/24 dev macvlan-host ip linksetmacvlan-host up # 現(xiàn)在宿主機(jī)可以通過192.168.1.201訪問macvlan網(wǎng)絡(luò)中的容器
2.2.7 容器網(wǎng)絡(luò)互聯(lián)
# 將容器連接到多個(gè)網(wǎng)絡(luò) docker network create frontend --subnet 172.20.0.0/24 docker network create backend --subnet 172.21.0.0/24 # Nginx連接到frontend docker run -d --name nginx --network frontend -p 80:80 nginx:1.24-alpine # App連接到frontend和backend docker run -d --name app --network frontend myapp:1.0 docker network connect backend app # MySQL只連接到backend docker run -d --name mysql --network backend mysql:8.0.35 # 網(wǎng)絡(luò)拓?fù)洌?# 外部 → Nginx(frontend) → App(frontend+backend) → MySQL(backend) # Nginx無法直接訪問MySQL(不在同一網(wǎng)絡(luò)) # App可以同時(shí)訪問Nginx和MySQL # 斷開容器的網(wǎng)絡(luò)連接 docker network disconnect frontend app
2.3 啟動(dòng)和驗(yàn)證
2.3.1 端口映射詳解
# 映射到宿主機(jī)所有接口 docker run -d -p 8080:80 nginx:1.24-alpine # 等價(jià)于 -p 0.0.0.080 # 映射到指定接口(安全,只監(jiān)聽內(nèi)網(wǎng)) docker run -d -p 192.168.1.1080 nginx:1.24-alpine # 映射到隨機(jī)端口 docker run -d -p 80 nginx:1.24-alpine docker port# 查看分配的隨機(jī)端口 # UDP端口映射 docker run -d -p 53:53/udp dns-server:1.0 # 映射多個(gè)端口 docker run -d -p 80:80 -p 443:443 nginx:1.24-alpine # 映射端口范圍 docker run -d -p 8000-8010:8000-8010 myapp:1.0 # 查看端口映射對應(yīng)的iptables規(guī)則 sudo iptables -t nat -L DOCKER -n
2.3.2 功能驗(yàn)證
# 驗(yàn)證bridge網(wǎng)絡(luò)容器間通信 docker network create testnet docker run -d --name server --network testnet nginx:1.24-alpine docker run --rm --network testnet alpine wget -qO- http://server:80 # 預(yù)期返回Nginx默認(rèn)頁面 # 驗(yàn)證DNS解析 docker run --rm --network testnet alpine nslookup server # 預(yù)期解析到server容器的IP # 驗(yàn)證外網(wǎng)訪問 docker run --rm alpine ping -c 3 8.8.8.8 docker run --rm alpine wget -qO- http://ifconfig.me # 預(yù)期返回宿主機(jī)的公網(wǎng)IP # 驗(yàn)證端口映射 docker run -d --name web -p 8080:80 nginx:1.24-alpine curl -I http://localhost:8080 # 預(yù)期返回 HTTP/1.1 200 OK # 清理 docker rm -f server web docker network rm testnet
三、示例代碼和配置
3.1 完整配置示例
3.1.1 生產(chǎn)環(huán)境網(wǎng)絡(luò)規(guī)劃配置
// 文件路徑:/etc/docker/daemon.json
// 網(wǎng)絡(luò)相關(guān)配置
{
"bip":"172.17.0.1/24",
"default-address-pools": [
{
"base":"172.20.0.0/16",
"size":24
},
{
"base":"172.21.0.0/16",
"size":24
}
],
"dns": ["223.5.5.5","8.8.8.8"],
"dns-search": ["example.com"],
"ip-forward":true,
"iptables":true,
"ip-masq":true,
"userland-proxy":false,
"fixed-cidr":"172.17.0.0/25"
}
參數(shù)說明:
bip:docker0網(wǎng)橋的IP和子網(wǎng),默認(rèn)172.17.0.1/16。生產(chǎn)環(huán)境改成/24,避免分配太大的網(wǎng)段
default-address-pools:自定義網(wǎng)絡(luò)的地址池。docker network create時(shí)從這里分配子網(wǎng)。配兩個(gè)池做冗余
userland-proxy:設(shè)為false用iptables做端口映射。默認(rèn)的docker-proxy是用戶態(tài)進(jìn)程,每個(gè)端口映射都fork一個(gè)進(jìn)程,高并發(fā)下CPU開銷大
fixed-cidr:限制容器IP分配范圍,172.17.0.0/25表示只分配172.17.0.1-172.17.0.126
3.1.2 網(wǎng)絡(luò)排查腳本
#!/bin/bash
# 文件名:docker-network-diag.sh
# Docker網(wǎng)絡(luò)診斷腳本
CONTAINER_NAME=${1:-""}
if[ -z"$CONTAINER_NAME"];then
echo"Usage:$0"
exit1
fi
echo"========== 容器基本信息 =========="
docker inspect --format='容器ID: {{.Id}}'$CONTAINER_NAME
docker inspect --format='狀態(tài): {{.State.Status}}'$CONTAINER_NAME
docker inspect --format='PID: {{.State.Pid}}'$CONTAINER_NAME
echo""
echo"========== 網(wǎng)絡(luò)配置 =========="
docker inspect --format='{{range $net, $config := .NetworkSettings.Networks}}網(wǎng)絡(luò): {{$net}} IP: {{$config.IPAddress}} 網(wǎng)關(guān): {{$config.Gateway}} MAC: {{$config.MacAddress}}{{"
"}}{{end}}'$CONTAINER_NAME
echo""
echo"========== 端口映射 =========="
docker port$CONTAINER_NAME2>/dev/null ||echo"無端口映射"
echo""
echo"========== DNS配置 =========="
dockerexec$CONTAINER_NAMEcat /etc/resolv.conf 2>/dev/null
echo""
echo"========== 路由表 =========="
dockerexec$CONTAINER_NAMEip route 2>/dev/null
echo""
echo"========== 網(wǎng)絡(luò)接口 =========="
dockerexec$CONTAINER_NAMEip addr 2>/dev/null
echo""
echo"========== 連接測試 =========="
echo"--- 外網(wǎng)連通性 ---"
dockerexec$CONTAINER_NAMEping -c 2 -W 3 8.8.8.8 2>/dev/null &&echo"外網(wǎng): OK"||echo"外網(wǎng): FAIL"
echo"--- DNS解析 ---"
dockerexec$CONTAINER_NAMEnslookup www.baidu.com 2>/dev/null &&echo"DNS: OK"||echo"DNS: FAIL"
echo""
echo"========== 宿主機(jī)iptables NAT規(guī)則 =========="
sudo iptables -t nat -L DOCKER -n 2>/dev/null | head -20
echo""
echo"========== 宿主機(jī)veth接口 =========="
PID=$(docker inspect --format='{{.State.Pid}}'$CONTAINER_NAME)
if["$PID"!="0"];then
VETH_INDEX=$(sudo nsenter -t$PID-n ip link show eth0 2>/dev/null | head -1 | awk -F:'{print $1}'| awk -F@'{print $2}'| tr -d'if')
if[ -n"$VETH_INDEX"];then
ip link show | grep"^${VETH_INDEX}:"| awk'{print "veth接口: "$2}'
fi
fi
3.2 實(shí)際應(yīng)用案例
案例一:微服務(wù)網(wǎng)絡(luò)隔離架構(gòu)
場景描述:一個(gè)典型的Web應(yīng)用包含Nginx、App、MySQL、Redis四個(gè)服務(wù)。通過Docker網(wǎng)絡(luò)實(shí)現(xiàn)前后端隔離——Nginx和App在前端網(wǎng)絡(luò),App和數(shù)據(jù)庫在后端網(wǎng)絡(luò),Nginx無法直接訪問數(shù)據(jù)庫。
實(shí)現(xiàn)代碼:
#!/bin/bash # 創(chuàng)建隔離網(wǎng)絡(luò) docker network create frontend --subnet 172.20.0.0/24 docker network create backend --subnet 172.21.0.0/24 # 啟動(dòng)MySQL(只在backend網(wǎng)絡(luò)) docker run -d --name mysql --network backend --ip 172.21.0.10 --restart=unless-stopped --memory=2g -e MYSQL_ROOT_PASSWORD='DbP@ss123!' -e MYSQL_DATABASE=myapp -v /data/mysql/data:/var/lib/mysql mysql:8.0.35 # 啟動(dòng)Redis(只在backend網(wǎng)絡(luò)) docker run -d --name redis --network backend --ip 172.21.0.11 --restart=unless-stopped --memory=1g redis:7.2-alpine # 啟動(dòng)App(連接frontend和backend) docker run -d --name app --network frontend --restart=unless-stopped --memory=1g -e DB_HOST=172.21.0.10 -e REDIS_HOST=172.21.0.11 myapp:1.0 # 將App也連接到backend網(wǎng)絡(luò) docker network connect backend app # 啟動(dòng)Nginx(只在frontend網(wǎng)絡(luò)) docker run -d --name nginx --network frontend --restart=unless-stopped -p 80:80 -p 443:443 -v /data/nginx/conf.d:/etc/nginx/conf.d:ro nginx:1.24-alpine # 驗(yàn)證網(wǎng)絡(luò)隔離 echo"--- Nginx訪問App(應(yīng)該成功)---" dockerexecnginx wget -qO- --timeout=3 http://app:8080/health echo"--- Nginx訪問MySQL(應(yīng)該失?。?--" dockerexecnginx ping -c 1 -W 2 172.21.0.10 ||echo"隔離生效:Nginx無法訪問MySQL" echo"--- App訪問MySQL(應(yīng)該成功)---" dockerexecapp ping -c 1 -W 2 172.21.0.10 &&echo"App可以訪問MySQL"
運(yùn)行結(jié)果:
--- Nginx訪問App(應(yīng)該成功)---
{"status":"UP"}
--- Nginx訪問MySQL(應(yīng)該失敗)---
PING 172.21.0.10: 1 data bytes
ping: sendto: Network is unreachable
隔離生效:Nginx無法訪問MySQL
--- App訪問MySQL(應(yīng)該成功)---
PING 172.21.0.10: 1 data bytes
64 bytes from 172.21.0.10: seq=0 ttl=64 time=0.089 ms
App可以訪問MySQL
案例二:使用Macvlan讓容器直接接入物理網(wǎng)絡(luò)
場景描述:公司有一套傳統(tǒng)的監(jiān)控系統(tǒng),通過SNMP輪詢固定IP獲取設(shè)備狀態(tài)。現(xiàn)在要把監(jiān)控Agent容器化,但監(jiān)控系統(tǒng)不支持NAT后的地址,需要容器擁有物理網(wǎng)絡(luò)的真實(shí)IP。
實(shí)現(xiàn)步驟:
# 1. 確認(rèn)宿主機(jī)網(wǎng)絡(luò)信息 ip addr show eth0 # 假設(shè):IP=192.168.1.100/24, 網(wǎng)關(guān)=192.168.1.1 # 2. 開啟網(wǎng)卡混雜模式(macvlan需要) sudo ip linkseteth0 promisc on # 3. 創(chuàng)建macvlan網(wǎng)絡(luò) docker network create --driver macvlan --subnet 192.168.1.0/24 --gateway 192.168.1.1 --ip-range 192.168.1.200/29 --opt parent=eth0 physical-net # --ip-range 限制Docker只分配192.168.1.200-192.168.1.207 # 避免和DHCP分配的地址沖突 # 4. 運(yùn)行監(jiān)控Agent容器 docker run -d --name monitor-agent --network physical-net --ip 192.168.1.200 --restart=unless-stopped monitor-agent:1.0 # 5. 驗(yàn)證:從其他物理機(jī)直接訪問容器IP # 在192.168.1.50這臺機(jī)器上: ping 192.168.1.200 # 能ping通,容器就像一臺獨(dú)立的物理機(jī) # 6. 解決宿主機(jī)無法訪問容器的問題 sudo ip link add macvlan-shim link eth0typemacvlan mode bridge sudo ip addr add 192.168.1.201/32 dev macvlan-shim sudo ip linksetmacvlan-shim up sudo ip route add 192.168.1.200/32 dev macvlan-shim
四、最佳實(shí)踐和注意事項(xiàng)
4.1 最佳實(shí)踐
4.1.1 性能優(yōu)化
關(guān)閉userland-proxy:daemon.json中設(shè)置"userland-proxy": false,用iptables替代docker-proxy做端口映射。docker-proxy是用戶態(tài)進(jìn)程,每個(gè)端口映射fork一個(gè)進(jìn)程,100個(gè)端口映射就是100個(gè)進(jìn)程。iptables在內(nèi)核態(tài)處理,零進(jìn)程開銷,高并發(fā)下吞吐量提升約20%:
{
"userland-proxy":false
}
高性能場景用host網(wǎng)絡(luò):Nginx反向代理、HAProxy負(fù)載均衡這類網(wǎng)絡(luò)密集型應(yīng)用,bridge模式的NAT轉(zhuǎn)換有5%-10%的性能損耗。切換到host模式后,Nginx的QPS從12000提升到14000(測試環(huán)境4核8GB):
docker run -d --name nginx --network host -v /data/nginx/nginx.conf:/etc/nginx/nginx.conf:ro nginx:1.24-alpine
調(diào)大conntrack表:bridge模式依賴iptables的連接跟蹤(conntrack),默認(rèn)nf_conntrack_max=65536,高并發(fā)場景下會(huì)滿,導(dǎo)致新連接被丟棄。生產(chǎn)環(huán)境建議調(diào)到100萬:
sysctl -w net.netfilter.nf_conntrack_max=1048576 sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=600 # 寫入 /etc/sysctl.d/docker-network.conf 持久化
4.1.2 安全加固
網(wǎng)絡(luò)隔離:不同安全級別的服務(wù)放在不同的Docker網(wǎng)絡(luò)中。數(shù)據(jù)庫和緩存放在backend網(wǎng)絡(luò),Web服務(wù)放在frontend網(wǎng)絡(luò),只有應(yīng)用層同時(shí)連接兩個(gè)網(wǎng)絡(luò)。這樣即使Web容器被攻破,攻擊者也無法直接訪問數(shù)據(jù)庫:
docker network create --internal backend-secure # --internal 禁止該網(wǎng)絡(luò)訪問外網(wǎng),數(shù)據(jù)庫不需要外網(wǎng)訪問
限制容器間通信(ICC):默認(rèn)同一bridge網(wǎng)絡(luò)內(nèi)的容器可以互相通信。如果不需要容器間通信,關(guān)閉ICC:
docker network create --opt"com.docker.network.bridge.enable_icc"="false"isolated-net # ICC關(guān)閉后,容器間只能通過端口映射通信
端口映射綁定內(nèi)網(wǎng)IP:不要把端口映射到0.0.0.0,綁定到內(nèi)網(wǎng)IP。我見過把MySQL 3306映射到0.0.0.0,結(jié)果被外網(wǎng)掃描到暴力破解的:
# 危險(xiǎn):監(jiān)聽所有接口 docker run -d -p 3306:3306 mysql:8.0.35 # 安全:只監(jiān)聽內(nèi)網(wǎng) docker run -d -p 192.168.1.103306 mysql:8.0.35
4.1.3 高可用配置
DNS輪詢負(fù)載均衡:自定義bridge網(wǎng)絡(luò)支持同名容器的DNS輪詢。多個(gè)容器用相同的網(wǎng)絡(luò)別名,Docker DNS會(huì)輪詢返回不同IP:
docker network create mynet docker run -d --name app1 --network mynet --network-alias app myapp:1.0 docker run -d --name app2 --network mynet --network-alias app myapp:1.0 docker run -d --name app3 --network mynet --network-alias app myapp:1.0 # 訪問 app 這個(gè)名字會(huì)輪詢到app1/app2/app3
overlay網(wǎng)絡(luò)跨主機(jī)高可用:Docker Swarm的overlay網(wǎng)絡(luò)自動(dòng)處理節(jié)點(diǎn)故障,服務(wù)副本會(huì)在健康節(jié)點(diǎn)上重新調(diào)度
網(wǎng)絡(luò)故障自愈:配置容器restart策略,網(wǎng)絡(luò)閃斷導(dǎo)致容器異常退出時(shí)自動(dòng)重啟
4.2 注意事項(xiàng)
4.2.1 配置注意事項(xiàng)
警告:Docker網(wǎng)絡(luò)地址段不能和宿主機(jī)所在網(wǎng)段、公司內(nèi)網(wǎng)網(wǎng)段沖突。我遇到過Docker默認(rèn)的172.17.0.0/16和公司辦公網(wǎng)段沖突,導(dǎo)致開發(fā)機(jī)無法訪問172.17開頭的內(nèi)網(wǎng)服務(wù)器。修改daemon.json的bip和default-address-pools避免沖突。
注意iptables規(guī)則持久化:Docker重啟會(huì)重建iptables規(guī)則,但如果手動(dòng)修改了iptables規(guī)則(比如加了防火墻規(guī)則),Docker重啟后可能覆蓋。建議用firewalld的docker zone管理防火墻規(guī)則
注意IPv6支持:Docker默認(rèn)不啟用IPv6。如果需要IPv6,在daemon.json中配置"ipv6": true和"fixed-cidr-v6": "fd00::/80"
注意容器重啟后IP變化:默認(rèn)bridge網(wǎng)絡(luò)不保證容器IP不變。用自定義網(wǎng)絡(luò)+容器名DNS解析,或者用--ip指定固定IP
4.2.2 常見錯(cuò)誤
| 錯(cuò)誤現(xiàn)象 | 原因分析 | 解決方案 |
|---|---|---|
| 容器無法訪問外網(wǎng) | ip_forward未開啟或iptables NAT規(guī)則丟失 | sysctl -w net.ipv4.ip_forward=1 ,重啟Docker重建規(guī)則 |
| 端口映射不生效 | 防火墻阻斷或端口被占用 | 檢查firewalld/iptables規(guī)則,ss -tlnp檢查端口占用 |
| 容器間ping不通 | 不在同一Docker網(wǎng)絡(luò) | docker network connect 將容器加入同一網(wǎng)絡(luò) |
| DNS解析失敗 | 使用了默認(rèn)bridge網(wǎng)絡(luò)(不支持DNS) | 改用自定義bridge網(wǎng)絡(luò) |
| conntrack表滿導(dǎo)致丟包 | nf_conntrack_max太小 | 調(diào)大到1048576,dmesg中搜索"nf_conntrack: table full" |
| macvlan容器和宿主機(jī)不通 | macvlan的設(shè)計(jì)限制 | 在宿主機(jī)創(chuàng)建macvlan子接口 |
4.2.3 兼容性問題
版本兼容:overlay網(wǎng)絡(luò)需要Docker 1.12+和Swarm模式。獨(dú)立容器加入overlay需要--attachable參數(shù)(Docker 17.06+)
平臺兼容:macvlan在虛擬機(jī)環(huán)境中可能不工作(取決于虛擬化平臺是否允許混雜模式)。AWS/阿里云等云平臺通常不支持macvlan
內(nèi)核兼容:VXLAN需要內(nèi)核4.0+,ipvlan需要內(nèi)核4.2+。CentOS 7默認(rèn)內(nèi)核3.10不支持這些特性,需要升級內(nèi)核
五、故障排查和監(jiān)控
5.1 故障排查
5.1.1 日志查看
# 查看Docker網(wǎng)絡(luò)相關(guān)日志 sudo journalctl -u docker.service | grep -i -E"network|bridge|iptables" # 查看容器網(wǎng)絡(luò)事件 docker events --filter'type=network' # 查看iptables規(guī)則(NAT表) sudo iptables -t nat -L -n -v # 查看iptables規(guī)則(filter表) sudo iptables -L DOCKER -n -v sudo iptables -L DOCKER-ISOLATION-STAGE-1 -n -v # 查看conntrack連接跟蹤表 sudo conntrack -L | head -20 sudo conntrack -C # 當(dāng)前連接數(shù)
5.1.2 常見問題排查
問題一:容器無法訪問外網(wǎng)
# 第一步:檢查IP轉(zhuǎn)發(fā) sysctl net.ipv4.ip_forward # 如果為0,開啟: sudo sysctl -w net.ipv4.ip_forward=1 # 第二步:檢查iptables MASQUERADE規(guī)則 sudo iptables -t nat -L POSTROUTING -n | grep MASQUERADE # 應(yīng)該有類似:MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0 # 第三步:檢查容器DNS dockerexeccat /etc/resolv.conf # nameserver應(yīng)該指向Docker內(nèi)置DNS 127.0.0.11 # 第四步:分步測試 dockerexec ping -c 1 172.17.0.1 # 網(wǎng)關(guān) dockerexec ping -c 1 8.8.8.8 # 外網(wǎng)IP dockerexec nslookup www.baidu.com # DNS解析
解決方案:
ip_forward為0:開啟并寫入sysctl.conf持久化
MASQUERADE規(guī)則缺失:systemctl restart docker重建
DNS不通:在daemon.json中配置"dns": ["223.5.5.5", "8.8.8.8"]
問題二:端口映射后外部無法訪問
# 檢查端口映射是否生效 docker port# 檢查宿主機(jī)端口是否在監(jiān)聽 ss -tlnp | grep # 檢查防火墻規(guī)則 sudo firewall-cmd --list-all sudo iptables -L INPUT -n | grep # 檢查Docker的iptables規(guī)則 sudo iptables -t nat -L DOCKER -n | grep sudo iptables -L DOCKER -n | grep # 檢查是否有docker-proxy進(jìn)程(如果userland-proxy=true) ps aux | grep docker-proxy
解決方案:
防火墻阻斷:firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload
iptables規(guī)則丟失:重啟Docker或手動(dòng)重建
端口被其他進(jìn)程占用:ss -tlnp | grep
問題三:容器間網(wǎng)絡(luò)延遲高
癥狀:同一宿主機(jī)上的容器間通信延遲從0.1ms突然升高到5-10ms
排查:
# 檢查網(wǎng)橋狀態(tài) brctl show brctl showstp docker0 # 檢查veth接口是否有錯(cuò)誤 ip -s link show | grep -A 5 veth # 檢查conntrack表是否接近滿 sudo sysctl net.netfilter.nf_conntrack_count sudo sysctl net.netfilter.nf_conntrack_max # 如果count接近max,說明conntrack表快滿了 # 抓包分析 sudo tcpdump -i docker0 -nn -c 100
解決:conntrack表滿導(dǎo)致丟包重傳,調(diào)大nf_conntrack_max;veth接口錯(cuò)誤計(jì)數(shù)增長說明網(wǎng)絡(luò)棧有問題,檢查內(nèi)核日志
5.1.3 調(diào)試模式
# 使用nsenter進(jìn)入容器網(wǎng)絡(luò)命名空間(不需要容器內(nèi)有調(diào)試工具)
PID=$(docker inspect --format='{{.State.Pid}}')
sudo nsenter -t$PID-n ip addr
sudo nsenter -t$PID-n ss -tlnp
sudo nsenter -t$PID-n iptables -L -n
sudo nsenter -t$PID-n tcpdump -i eth0 -nn -c 50
# 在docker0網(wǎng)橋上抓包
sudo tcpdump -i docker0 -nn -w /tmp/docker0.pcap
# 在veth接口上抓包(找到容器對應(yīng)的veth)
VETH=$(ip link show | grep"$(docker inspect --format='{{.State.Pid}}' )"| awk'{print $2}'| tr -d':')
sudo tcpdump -i$VETH-nn -c 50
# 跟蹤iptables規(guī)則匹配(調(diào)試NAT問題)
sudo iptables -t nat -L -n -v --line-numbers
# 觀察各規(guī)則的pkts和bytes計(jì)數(shù)器變化
# 使用nicolaka/netshoot調(diào)試容器(自帶各種網(wǎng)絡(luò)工具)
docker run --rm -it --network container: nicolaka/netshoot
# 進(jìn)入后可以用 tcpdump, iperf3, nslookup, curl, ss 等工具
5.2 性能監(jiān)控
5.2.1 關(guān)鍵指標(biāo)監(jiān)控
# 查看容器網(wǎng)絡(luò)IO
docker stats --no-stream --format"table {{.Name}} {{.NetIO}}"
# 查看網(wǎng)橋流量
cat /sys/class/net/docker0/statistics/rx_bytes
cat /sys/class/net/docker0/statistics/tx_bytes
# 查看conntrack使用率
echo"$(cat /proc/sys/net/netfilter/nf_conntrack_count)/$(cat /proc/sys/net/netfilter/nf_conntrack_max)"| bc -l
# 查看veth接口錯(cuò)誤計(jì)數(shù)
ip -s link show | grep -A 6 veth
# 查看iptables規(guī)則計(jì)數(shù)
sudo iptables -t nat -L -n -v | grep DOCKER
5.2.2 監(jiān)控指標(biāo)說明
| 指標(biāo)名稱 | 正常范圍 | 告警閾值 | 說明 |
|---|---|---|---|
| conntrack使用率 | <60% | >80% | 超過80%開始丟包 |
| 容器網(wǎng)絡(luò)收發(fā)錯(cuò)誤 | 0 | >0 | 有錯(cuò)誤說明網(wǎng)絡(luò)棧異常 |
| docker0網(wǎng)橋流量 | 視業(yè)務(wù)而定 | 突增50%以上 | 流量突增可能是攻擊或異常 |
| DNS解析延遲 | <5ms | >50ms | Docker內(nèi)置DNS通常很快 |
| 端口映射連接數(shù) | 視業(yè)務(wù)而定 | 接近c(diǎn)onntrack_max | 連接數(shù)過多需要擴(kuò)容 |
| veth接口丟包率 | 0% | >0.01% | 丟包說明網(wǎng)絡(luò)擁塞或配置問題 |
5.2.3 Prometheus監(jiān)控配置
# Prometheus告警規(guī)則:docker-network-alerts.yml
groups:
-name:docker_network_alerts
rules:
-alert:ConntrackTableNearlyFull
expr:node_nf_conntrack_entries/node_nf_conntrack_entries_limit>0.8
for:5m
labels:
severity:critical
annotations:
summary:"conntrack表使用率超過80%"
description:"當(dāng)前使用率{{ $value | humanizePercentage }},即將導(dǎo)致新連接被丟棄"
-alert:ContainerNetworkErrors
expr:rate(container_network_receive_errors_total{name!=""}[5m])>0
for:2m
labels:
severity:warning
annotations:
summary:"容器{{ $labels.name }}網(wǎng)絡(luò)接收錯(cuò)誤"
description:"錯(cuò)誤率{{ $value }}/s"
-alert:HighNetworkTraffic
expr:rate(container_network_receive_bytes_total{name!=""}[5m])>100000000
for:5m
labels:
severity:warning
annotations:
summary:"容器{{ $labels.name }}網(wǎng)絡(luò)流量異常"
description:"接收流量{{ $value | humanize }}B/s,超過100MB/s"
5.3 備份與恢復(fù)
5.3.1 備份策略
#!/bin/bash
# Docker網(wǎng)絡(luò)配置備份腳本
BACKUP_DIR="/backup/docker-network/$(date +%Y%m%d)"
mkdir -p${BACKUP_DIR}
# 備份所有自定義網(wǎng)絡(luò)配置
fornetin$(docker network ls --filter'type=custom'-q);do
NET_NAME=$(docker network inspect --format='{{.Name}}'$net)
docker network inspect$net>${BACKUP_DIR}/${NET_NAME}.json
done
# 備份iptables規(guī)則
sudo iptables-save >${BACKUP_DIR}/iptables-rules.txt
sudo ip6tables-save >${BACKUP_DIR}/ip6tables-rules.txt
# 備份sysctl網(wǎng)絡(luò)參數(shù)
sysctl -a 2>/dev/null | grep -E"net.(ipv4|bridge|netfilter)">${BACKUP_DIR}/sysctl-network.txt
# 備份daemon.json
cp /etc/docker/daemon.json${BACKUP_DIR}/
echo"Network backup completed:${BACKUP_DIR}"
5.3.2 恢復(fù)流程
恢復(fù)daemon.json:cp daemon.json /etc/docker/ && systemctl restart docker
恢復(fù)sysctl參數(shù):cp sysctl-network.txt /etc/sysctl.d/docker-network.conf && sysctl --system
重建自定義網(wǎng)絡(luò):根據(jù)備份的JSON文件中的subnet、gateway等參數(shù)重新創(chuàng)建
驗(yàn)證網(wǎng)絡(luò)連通性:啟動(dòng)測試容器驗(yàn)證各網(wǎng)絡(luò)的連通性和隔離性
六、總結(jié)
6.1 技術(shù)要點(diǎn)回顧
bridge模式:默認(rèn)模式,通過docker0網(wǎng)橋+veth pair+iptables NAT實(shí)現(xiàn)。生產(chǎn)環(huán)境用自定義bridge,支持容器名DNS解析
host模式:直接使用宿主機(jī)網(wǎng)絡(luò)棧,零NAT開銷,適合網(wǎng)絡(luò)密集型應(yīng)用。代價(jià)是失去網(wǎng)絡(luò)隔離
網(wǎng)絡(luò)隔離:通過多個(gè)自定義網(wǎng)絡(luò)實(shí)現(xiàn)服務(wù)間隔離,前端網(wǎng)絡(luò)和后端網(wǎng)絡(luò)分離,最小化攻擊面
性能調(diào)優(yōu):關(guān)閉userland-proxy、調(diào)大conntrack表、高性能場景用host模式
排查思路:ip_forward → iptables規(guī)則 → DNS解析 → conntrack表,按這個(gè)順序排查覆蓋90%的網(wǎng)絡(luò)問題
6.2 進(jìn)階學(xué)習(xí)方向
容器網(wǎng)絡(luò)接口(CNI):Kubernetes使用CNI標(biāo)準(zhǔn)管理容器網(wǎng)絡(luò),理解CNI插件機(jī)制是進(jìn)入K8s網(wǎng)絡(luò)的基礎(chǔ)
學(xué)習(xí)資源:CNI規(guī)范文檔、Flannel/Calico源碼
實(shí)踐建議:手動(dòng)配置CNI插件,理解網(wǎng)絡(luò)創(chuàng)建和刪除的生命周期
eBPF網(wǎng)絡(luò):Cilium等新一代容器網(wǎng)絡(luò)方案用eBPF替代iptables,性能更好,可觀測性更強(qiáng)
學(xué)習(xí)資源:Cilium官方文檔
實(shí)踐建議:在測試環(huán)境部署Cilium,對比iptables方案的性能差異
Service Mesh:Istio/Linkerd在容器網(wǎng)絡(luò)之上提供流量管理、熔斷、鏈路追蹤等能力
學(xué)習(xí)資源:Istio官方教程
6.3 參考資料
Docker網(wǎng)絡(luò)官方文檔- 各網(wǎng)絡(luò)驅(qū)動(dòng)的詳細(xì)說明
Linux網(wǎng)絡(luò)命名空間- 理解容器網(wǎng)絡(luò)隔離的內(nèi)核基礎(chǔ)
iptables教程- 理解Docker的NAT規(guī)則
nicolaka/netshoot- 容器網(wǎng)絡(luò)調(diào)試工具集
附錄
A. 命令速查表
# 網(wǎng)絡(luò)管理 docker network ls # 查看所有網(wǎng)絡(luò) docker network create --subnet X mynet # 創(chuàng)建自定義網(wǎng)絡(luò) docker network rm mynet # 刪除網(wǎng)絡(luò) docker network inspect mynet # 查看網(wǎng)絡(luò)詳情 docker network connect mynet container # 容器加入網(wǎng)絡(luò) docker network disconnect mynet container # 容器離開網(wǎng)絡(luò) docker network prune # 清理未使用的網(wǎng)絡(luò) # 容器網(wǎng)絡(luò)操作 docker run --network host ... # host模式運(yùn)行 docker run --network none ... # 無網(wǎng)絡(luò)運(yùn)行 docker run --network container:other ... # 共享網(wǎng)絡(luò)運(yùn)行 docker run -p 8080:80 ... # 端口映射 docker run --ip 172.20.0.100 --network mynet # 指定IP docker port container # 查看端口映射 # 網(wǎng)絡(luò)調(diào)試 dockerexeccontainer ip addr # 查看容器網(wǎng)絡(luò) dockerexeccontainer ping target # 連通性測試 dockerexeccontainer nslookup name # DNS測試 sudo tcpdump -i docker0 -nn # 網(wǎng)橋抓包 sudo nsenter -t PID -n ip addr # 進(jìn)入網(wǎng)絡(luò)命名空間
B. 網(wǎng)絡(luò)模式對比表
| 特性 | bridge | host | none | container | overlay | macvlan |
|---|---|---|---|---|---|---|
| 網(wǎng)絡(luò)隔離 | 有 | 無 | 完全隔離 | 共享 | 有 | 有 |
| 性能損耗 | 5-10% | 0% | N/A | 0% | 10-15% | <2% |
| 端口映射 | 需要-p | 不需要 | N/A | 不需要 | 需要-p | 不需要 |
| 跨主機(jī)通信 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 | 支持(同網(wǎng)段) |
| DNS解析 | 自定義網(wǎng)絡(luò)支持 | 用宿主機(jī) | 無 | 共享 | 支持 | 無 |
| 適用場景 | 通用 | 高性能 | 安全隔離 | Sidecar | Swarm集群 | 物理網(wǎng)絡(luò)接入 |
C. 術(shù)語表
| 術(shù)語 | 英文 | 解釋 |
|---|---|---|
| 網(wǎng)絡(luò)命名空間 | Network Namespace | Linux內(nèi)核特性,為進(jìn)程提供獨(dú)立的網(wǎng)絡(luò)棧(接口、路由表、iptables規(guī)則) |
| veth pair | Virtual Ethernet Pair | 虛擬以太網(wǎng)對,一端在容器內(nèi)(eth0),一端在宿主機(jī)(vethXXX),數(shù)據(jù)從一端進(jìn)另一端出 |
| 網(wǎng)橋 | Bridge | 二層網(wǎng)絡(luò)設(shè)備,連接多個(gè)網(wǎng)絡(luò)接口,實(shí)現(xiàn)同網(wǎng)段內(nèi)的數(shù)據(jù)轉(zhuǎn)發(fā)。docker0就是一個(gè)Linux網(wǎng)橋 |
| NAT | Network Address Translation | 網(wǎng)絡(luò)地址轉(zhuǎn)換,Docker用MASQUERADE規(guī)則將容器IP轉(zhuǎn)換為宿主機(jī)IP訪問外網(wǎng) |
| VXLAN | Virtual Extensible LAN | 虛擬可擴(kuò)展局域網(wǎng),overlay網(wǎng)絡(luò)的底層隧道協(xié)議,用UDP 4789端口封裝二層幀 |
| conntrack | Connection Tracking | iptables的連接跟蹤機(jī)制,記錄每個(gè)網(wǎng)絡(luò)連接的狀態(tài),NAT依賴此機(jī)制 |
| ICC | Inter-Container Communication | 容器間通信,可以在網(wǎng)絡(luò)級別開啟或關(guān)閉 |
| macvlan | MAC VLAN | 在一個(gè)物理網(wǎng)卡上創(chuàng)建多個(gè)虛擬網(wǎng)卡,每個(gè)有獨(dú)立的MAC地址和IP |
-
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
8240瀏覽量
94540 -
容器
+關(guān)注
關(guān)注
0文章
531瀏覽量
22950 -
Docker
+關(guān)注
關(guān)注
0文章
532瀏覽量
14223
原文標(biāo)題:從網(wǎng)絡(luò)隔離到服務(wù)互通:Docker 網(wǎng)絡(luò)模式全解析
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
ARM平臺實(shí)現(xiàn)Docker容器技術(shù)
ARM平臺實(shí)現(xiàn)Docker容器技術(shù)
如何在Docker中創(chuàng)建容器
理解Docker容器并暢玩docker
詳解docker的四種網(wǎng)絡(luò)模式
docker的4種網(wǎng)絡(luò)模式
docker的4種網(wǎng)絡(luò)模式配置
Docker容器的四種網(wǎng)絡(luò)模式
Docker容器網(wǎng)絡(luò)的數(shù)據(jù)鏈路是什么
Docker容器網(wǎng)絡(luò)模式全解析
評論