国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Docker容器網(wǎng)絡(luò)模式全解析

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 2026-02-26 16:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Docker網(wǎng)絡(luò)模式詳解

一、概述

1.1 背景介紹

容器網(wǎng)絡(luò)是Docker使用中最容易出問(wèn)題的部分。容器之間怎么通信、容器怎么訪問(wèn)外網(wǎng)、外部怎么訪問(wèn)容器內(nèi)的服務(wù)——這三個(gè)問(wèn)題搞不清楚,排查網(wǎng)絡(luò)故障就是抓瞎。

Docker網(wǎng)絡(luò)基于Linux內(nèi)核的Network Namespace、veth pair、iptables和bridge實(shí)現(xiàn)。每個(gè)容器有自己獨(dú)立的網(wǎng)絡(luò)命名空間,通過(guò)veth pair連接到宿主機(jī)的網(wǎng)橋(docker0),再通過(guò)iptables NAT規(guī)則訪問(wèn)外網(wǎng)。理解這個(gè)數(shù)據(jù)包流向,網(wǎng)絡(luò)問(wèn)題排查就有了方向。

Docker提供了bridge、host、none、container、overlay、macvlan六種網(wǎng)絡(luò)模式,每種模式的隔離級(jí)別、性能、適用場(chǎng)景都不同。單機(jī)環(huán)境用bridge和host就夠了,跨主機(jī)通信需要overlay或macvlan。

1.2 技術(shù)特點(diǎn)

bridge模式:默認(rèn)模式,通過(guò)docker0網(wǎng)橋和veth pair實(shí)現(xiàn)容器間通信,通過(guò)iptables NAT實(shí)現(xiàn)外網(wǎng)訪問(wèn)。隔離性好,有約5%-10%的網(wǎng)絡(luò)性能損耗

host模式:容器直接使用宿主機(jī)網(wǎng)絡(luò)棧,沒(méi)有NAT開(kāi)銷,網(wǎng)絡(luò)性能和宿主機(jī)一致。但失去了網(wǎng)絡(luò)隔離性

none模式:容器沒(méi)有網(wǎng)絡(luò)接口(只有l(wèi)o),完全隔離。適合不需要網(wǎng)絡(luò)的批處理任務(wù)或安全敏感場(chǎng)景

container模式:多個(gè)容器共享同一個(gè)網(wǎng)絡(luò)命名空間,通過(guò)localhost通信。Kubernetes的Pod網(wǎng)絡(luò)就是基于這個(gè)原理

overlay模式:基于VXLAN的跨主機(jī)容器網(wǎng)絡(luò),Docker Swarm和部分K8s網(wǎng)絡(luò)插件使用

macvlan模式:容器直接獲得物理網(wǎng)絡(luò)的IP地址,像一臺(tái)獨(dú)立的物理機(jī)。適合需要直接接入物理網(wǎng)絡(luò)的場(chǎng)景

1.3 適用場(chǎng)景

bridge模式:大多數(shù)單機(jī)容器部署場(chǎng)景,開(kāi)發(fā)測(cè)試環(huán)境

host模式:對(duì)網(wǎng)絡(luò)性能要求高的應(yīng)用(Nginx反向代理、高頻交易系統(tǒng)),需要監(jiān)聽(tīng)大量端口的應(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的場(chǎng)景,傳統(tǒng)網(wǎng)絡(luò)架構(gòu)遷移

1.4 環(huán)境要求

組件 版本要求 說(shuō)明
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ā)是否開(kāi)啟
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ú)網(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è)容器通過(guò)veth pair連接到docker0,容器之間通過(guò)網(wǎng)橋二層轉(zhuǎn)發(fā)通信,訪問(wèn)外網(wǎng)通過(guò)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通,通過(guò)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ò)命名空間,沒(méi)有網(wǎng)絡(luò)隔離,也沒(méi)有NAT轉(zhuǎn)換開(kāi)銷。容器內(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)聽(tīng)宿主機(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)聽(tīng)在宿主機(jī)上

Host模式的性能對(duì)比

# 用iperf3測(cè)試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

# 測(cè)試bridge模式吞吐量
docker run --rm networkstatic/iperf3 -c <宿主機(jī)IP> -p 5201
# 典型結(jié)果:約30-40 Gbps(取決于硬件)

# 測(cè)試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)聽(tīng)同一端口。而且容器能看到宿主機(jī)所有網(wǎng)絡(luò)接口和連接,安全隔離性為零。

2.2.3 None模式詳解

None模式下容器只有l(wèi)o回環(huán)接口,沒(méi)有任何外部網(wǎng)絡(luò)連接。適合不需要網(wǎng)絡(luò)的計(jì)算任務(wù),或者需要完全自定義網(wǎng)絡(luò)的場(chǎng)景。

# 使用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ú)法訪問(wèn)外網(wǎng)
dockerexecisolated ping -c 1 8.8.8.8
# ping: sendto: Network is unreachable

# 適用場(chǎng)景:數(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è)容器通過(guò)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可以通過(guò)localhost訪問(wèn)nginx
dockerexecsidecar wget -qO- http://localhost:80
# 返回Nginx默認(rèn)頁(yè)面

# 兩個(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通過(guò)localhost收集app的日志

2.2.5 Overlay模式詳解

Overlay網(wǎng)絡(luò)基于VXLAN隧道實(shí)現(xiàn)跨主機(jī)容器通信。數(shù)據(jù)包在源主機(jī)封裝VXLAN頭部,通過(guò)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 --token  192.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)上,通過(guò)overlay網(wǎng)絡(luò)互通

注意:overlay網(wǎng)絡(luò)有約10%-15%的性能損耗(VXLAN封裝/解封裝開(kāi)銷)。對(duì)延遲敏感的應(yīng)用(如Redis集群),建議用macvlan或host模式。

2.2.6 Macvlan模式詳解

Macvlan讓容器直接獲得物理網(wǎng)絡(luò)的IP地址,每個(gè)容器有獨(dú)立的MAC地址,在網(wǎng)絡(luò)上表現(xiàn)得像一臺(tái)獨(dú)立的物理機(jī)。不經(jīng)過(guò)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ī)器可以直接訪問(wèn)192.168.1.200:3306

# 查看容器MAC地址
dockerexecdb ip link show eth0
# 每個(gè)容器有獨(dú)立的MAC地址

注意:macvlan模式下,容器和宿主機(jī)之間默認(rèn)無(wú)法通信(這是macvlan的設(shè)計(jì)限制)。如果需要宿主機(jī)訪問(wèn)容器,需要在宿主機(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ī)可以通過(guò)192.168.1.201訪問(wèn)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無(wú)法直接訪問(wèn)MySQL(不在同一網(wǎng)絡(luò))
# App可以同時(shí)訪問(wèn)Nginx和MySQL

# 斷開(kāi)容器的網(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)聽(tīng)內(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

# 查看端口映射對(duì)應(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è)面

# 驗(yàn)證DNS解析
docker run --rm --network testnet alpine nslookup server
# 預(yù)期解析到server容器的IP

# 驗(yàn)證外網(wǎng)訪問(wèn)
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ù)說(shuō)明

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開(kāi)銷大

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"無(wú)端口映射"

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"========== 連接測(cè)試 =========="
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)

場(chǎng)景描述:一個(gè)典型的Web應(yīng)用包含Nginx、App、MySQL、Redis四個(gè)服務(wù)。通過(guò)Docker網(wǎng)絡(luò)實(shí)現(xiàn)前后端隔離——Nginx和App在前端網(wǎng)絡(luò),App和數(shù)據(jù)庫(kù)在后端網(wǎng)絡(luò),Nginx無(wú)法直接訪問(wèn)數(shù)據(jù)庫(kù)。

實(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訪問(wèn)App(應(yīng)該成功)---"
dockerexecnginx wget -qO- --timeout=3 http://app:8080/health

echo"--- Nginx訪問(wèn)MySQL(應(yīng)該失?。?--"
dockerexecnginx ping -c 1 -W 2 172.21.0.10 ||echo"隔離生效:Nginx無(wú)法訪問(wèn)MySQL"

echo"--- App訪問(wèn)MySQL(應(yīng)該成功)---"
dockerexecapp ping -c 1 -W 2 172.21.0.10 &&echo"App可以訪問(wèn)MySQL"

運(yùn)行結(jié)果

--- Nginx訪問(wèn)App(應(yīng)該成功)---
{"status":"UP"}
--- Nginx訪問(wèn)MySQL(應(yīng)該失?。?--
PING 172.21.0.10: 1 data bytes
ping: sendto: Network is unreachable
隔離生效:Nginx無(wú)法訪問(wèn)MySQL
--- App訪問(wèn)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可以訪問(wèn)MySQL

案例二:使用Macvlan讓容器直接接入物理網(wǎng)絡(luò)

場(chǎng)景描述:公司有一套傳統(tǒng)的監(jiān)控系統(tǒng),通過(guò)SNMP輪詢固定IP獲取設(shè)備狀態(tài)?,F(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. 開(kāi)啟網(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ī)直接訪問(wèn)容器IP
# 在192.168.1.50這臺(tái)機(jī)器上:
ping 192.168.1.200
# 能ping通,容器就像一臺(tái)獨(dú)立的物理機(jī)

# 6. 解決宿主機(jī)無(wú)法訪問(wèn)容器的問(wèn)題
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)程開(kāi)銷,高并發(fā)下吞吐量提升約20%:

{
"userland-proxy":false
}

高性能場(chǎng)景用host網(wǎng)絡(luò):Nginx反向代理、HAProxy負(fù)載均衡這類網(wǎng)絡(luò)密集型應(yīng)用,bridge模式的NAT轉(zhuǎn)換有5%-10%的性能損耗。切換到host模式后,Nginx的QPS從12000提升到14000(測(cè)試環(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ā)場(chǎng)景下會(huì)滿,導(dǎo)致新連接被丟棄。生產(chǎn)環(huán)境建議調(diào)到100萬(wàn):

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ò)隔離:不同安全級(jí)別的服務(wù)放在不同的Docker網(wǎng)絡(luò)中。數(shù)據(jù)庫(kù)和緩存放在backend網(wǎng)絡(luò),Web服務(wù)放在frontend網(wǎng)絡(luò),只有應(yīng)用層同時(shí)連接兩個(gè)網(wǎng)絡(luò)。這樣即使Web容器被攻破,攻擊者也無(wú)法直接訪問(wèn)數(shù)據(jù)庫(kù):

docker network create --internal backend-secure
# --internal 禁止該網(wǎng)絡(luò)訪問(wèn)外網(wǎng),數(shù)據(jù)庫(kù)不需要外網(wǎng)訪問(wèn)

限制容器間通信(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)閉后,容器間只能通過(guò)端口映射通信

端口映射綁定內(nèi)網(wǎng)IP:不要把端口映射到0.0.0.0,綁定到內(nèi)網(wǎng)IP。我見(jiàn)過(guò)把MySQL 3306映射到0.0.0.0,結(jié)果被外網(wǎng)掃描到暴力破解的:

#  危險(xiǎn):監(jiān)聽(tīng)所有接口
docker run -d -p 3306:3306 mysql:8.0.35

#  安全:只監(jiān)聽(tīng)內(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
# 訪問(wèn) 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)段沖突。我遇到過(guò)Docker默認(rèn)的172.17.0.0/16和公司辦公網(wǎng)段沖突,導(dǎo)致開(kāi)發(fā)機(jī)無(wú)法訪問(wèn)172.17開(kāi)頭的內(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 常見(jiàn)錯(cuò)誤

錯(cuò)誤現(xiàn)象 原因分析 解決方案
容器無(wú)法訪問(wèn)外網(wǎng) ip_forward未開(kāi)啟或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 兼容性問(wèn)題

版本兼容:overlay網(wǎng)絡(luò)需要Docker 1.12+和Swarm模式。獨(dú)立容器加入overlay需要--attachable參數(shù)(Docker 17.06+)

平臺(tái)兼容:macvlan在虛擬機(jī)環(huán)境中可能不工作(取決于虛擬化平臺(tái)是否允許混雜模式)。AWS/阿里云等云平臺(tái)通常不支持macvlan

內(nèi)核兼容:VXLAN需要內(nèi)核4.0+,ipvlan需要內(nèi)核4.2+。CentOS 7默認(rèn)內(nèi)核3.10不支持這些特性,需要升級(jí)內(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 常見(jiàn)問(wèn)題排查

問(wèn)題一:容器無(wú)法訪問(wèn)外網(wǎng)

# 第一步:檢查IP轉(zhuǎn)發(fā)
sysctl net.ipv4.ip_forward
# 如果為0,開(kāi)啟:
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
dockerexec cat /etc/resolv.conf
# nameserver應(yīng)該指向Docker內(nèi)置DNS 127.0.0.11

# 第四步:分步測(cè)試
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:開(kāi)啟并寫入sysctl.conf持久化

MASQUERADE規(guī)則缺失:systemctl restart docker重建

DNS不通:在daemon.json中配置"dns": ["223.5.5.5", "8.8.8.8"]

問(wèn)題二:端口映射后外部無(wú)法訪問(wèn)

# 檢查端口映射是否生效
docker port 

# 檢查宿主機(jī)端口是否在監(jiān)聽(tīng)
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 找到占用進(jìn)程

問(wèn)題三:容器間網(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,說(shuō)明conntrack表快滿了

# 抓包分析
sudo tcpdump -i docker0 -nn -c 100

解決:conntrack表滿導(dǎo)致丟包重傳,調(diào)大nf_conntrack_max;veth接口錯(cuò)誤計(jì)數(shù)增長(zhǎng)說(shuō)明網(wǎng)絡(luò)棧有問(wèn)題,檢查內(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接口上抓包(找到容器對(duì)應(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問(wèn)題)
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)說(shuō)明

指標(biāo)名稱 正常范圍 告警閾值 說(shuō)明
conntrack使用率 <60% >80% 超過(guò)80%開(kāi)始丟包
容器網(wǎng)絡(luò)收發(fā)錯(cuò)誤 0 >0 有錯(cuò)誤說(shuō)明網(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ù)過(guò)多需要擴(kuò)容
veth接口丟包率 0% >0.01% 丟包說(shuō)明網(wǎng)絡(luò)擁塞或配置問(wèn)題

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表使用率超過(guò)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,超過(guò)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ò)連通性:?jiǎn)?dòng)測(cè)試容器驗(yàn)證各網(wǎng)絡(luò)的連通性和隔離性

六、總結(jié)

6.1 技術(shù)要點(diǎn)回顧

bridge模式:默認(rèn)模式,通過(guò)docker0網(wǎng)橋+veth pair+iptables NAT實(shí)現(xiàn)。生產(chǎn)環(huán)境用自定義bridge,支持容器名DNS解析

host模式:直接使用宿主機(jī)網(wǎng)絡(luò)棧,零NAT開(kāi)銷,適合網(wǎng)絡(luò)密集型應(yīng)用。代價(jià)是失去網(wǎng)絡(luò)隔離

網(wǎng)絡(luò)隔離:通過(guò)多個(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表、高性能場(chǎng)景用host模式

排查思路:ip_forward → iptables規(guī)則 → DNS解析 → conntrack表,按這個(gè)順序排查覆蓋90%的網(wǎng)絡(luò)問(wèn)題

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,性能更好,可觀測(cè)性更強(qiáng)

學(xué)習(xí)資源:Cilium官方文檔

實(shí)踐建議:在測(cè)試環(huán)境部署Cilium,對(duì)比iptables方案的性能差異

Service Mesh:Istio/Linkerd在容器網(wǎng)絡(luò)之上提供流量管理、熔斷、鏈路追蹤等能力

學(xué)習(xí)資源:Istio官方教程

6.3 參考資料

Docker網(wǎng)絡(luò)官方文檔- 各網(wǎng)絡(luò)驅(qū)動(dòng)的詳細(xì)說(shuō)明

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   # 容器離開(kāi)網(wǎng)絡(luò)
docker network prune             # 清理未使用的網(wǎng)絡(luò)

# 容器網(wǎng)絡(luò)操作
docker run --network host ...         # host模式運(yùn)行
docker run --network none ...         # 無(wú)網(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       # 連通性測(cè)試
dockerexeccontainer nslookup name      # DNS測(cè)試
sudo tcpdump -i docker0 -nn          # 網(wǎng)橋抓包
sudo nsenter -t PID -n ip addr        # 進(jìn)入網(wǎng)絡(luò)命名空間

B. 網(wǎng)絡(luò)模式對(duì)比表

特性 bridge host none container overlay macvlan
網(wǎng)絡(luò)隔離 無(wú) 完全隔離 共享
性能損耗 5-10% 0% N/A 0% 10-15% <2%
端口映射 需要-p 不需要 N/A 不需要 需要-p 不需要
跨主機(jī)通信 不支持 不支持 不支持 不支持 支持 支持(同網(wǎng)段)
DNS解析 自定義網(wǎng)絡(luò)支持 用宿主機(jī) 無(wú) 共享 支持 無(wú)
適用場(chǎng)景 通用 高性能 安全隔離 Sidecar Swarm集群 物理網(wǎng)絡(luò)接入

C. 術(shù)語(yǔ)表

術(shù)語(yǔ) 英文 解釋
網(wǎng)絡(luò)命名空間 Network Namespace Linux內(nèi)核特性,為進(jìn)程提供獨(dú)立的網(wǎng)絡(luò)棧(接口、路由表、iptables規(guī)則)
veth pair Virtual Ethernet Pair 虛擬以太網(wǎng)對(duì),一端在容器內(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èn)外網(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ò)級(jí)別開(kāi)啟或關(guān)閉
macvlan MAC VLAN 在一個(gè)物理網(wǎng)卡上創(chuàng)建多個(gè)虛擬網(wǎng)卡,每個(gè)有獨(dú)立的MAC地址和IP

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    8265

    瀏覽量

    94716
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    531

    瀏覽量

    22965
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    532

    瀏覽量

    14243

原文標(biāo)題:從網(wǎng)絡(luò)隔離到服務(wù)互通:Docker 網(wǎng)絡(luò)模式全解析

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    ARM平臺(tái)實(shí)現(xiàn)Docker容器技術(shù)

    T113-i工業(yè)核心板在支持Docker后,其性價(jià)比還將進(jìn)一步提升!圖2基于T113-i平臺(tái)實(shí)現(xiàn)Docker容器技術(shù) 如下為基于志T113-i工業(yè)平臺(tái),演示
    發(fā)表于 07-17 11:05

    ARM平臺(tái)實(shí)現(xiàn)Docker容器技術(shù)

    性價(jià)比志T113-i工業(yè)核心板在支持Docker后,其性價(jià)比還將進(jìn)一步提升! 圖2基于T113-i平臺(tái)實(shí)現(xiàn)Docker容器技術(shù) 如下為基于
    發(fā)表于 07-25 14:36

    如何在Docker中創(chuàng)建容器

    Docker是一個(gè)開(kāi)源的引擎,可以輕松的為任何應(yīng)用創(chuàng)建一個(gè)輕量級(jí)的、可移植的、自給自足的容器。開(kāi)發(fā)者在筆記本上編譯測(cè)試通過(guò)的容器可以批量地在生產(chǎn)環(huán)境中部署,包括VMs(虛擬機(jī))、bare metal
    發(fā)表于 01-03 15:58

    docker的四種網(wǎng)絡(luò)模式

    docker網(wǎng)絡(luò)模式
    發(fā)表于 10-16 08:11

    理解Docker容器并暢玩docker

    ,完全不影響其他容器的正常運(yùn)作)。這樣描述,還是不大明白,我們可以實(shí)際操作一下。先打開(kāi)兩個(gè)命令行,在其中一個(gè)命令行執(zhí)行以下命令:docker run -it --name a1_rm alpine命令解析
    發(fā)表于 11-05 09:54

    Docker容器管理命令(二)

    1、Docker容器管理命令的使用方法批量刪除docker 容器docker cp命令docker
    發(fā)表于 04-21 11:31

    詳解docker的四種網(wǎng)絡(luò)模式

    使用none模式Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進(jìn)行任何
    的頭像 發(fā)表于 01-21 09:21 ?7269次閱讀

    docker的4種網(wǎng)絡(luò)模式

    Docker 使用 Linux 橋接,在宿主機(jī)虛擬一個(gè) Docker 容器網(wǎng)橋(docker0),Docker 啟動(dòng)一個(gè)
    的頭像 發(fā)表于 08-14 11:50 ?2752次閱讀

    docker的4種網(wǎng)絡(luò)模式配置

    Docker 使用 Linux 橋接,在宿主機(jī)虛擬一個(gè) Docker 容器網(wǎng)橋(docker0),Docker 啟動(dòng)一個(gè)
    的頭像 發(fā)表于 10-10 10:37 ?2293次閱讀

    Docker容器的四種網(wǎng)絡(luò)模式

    Docker 在安裝后自動(dòng)提供 3 種網(wǎng)絡(luò),可以使用 docker network ls 命令查看。
    的頭像 發(fā)表于 10-17 14:53 ?2518次閱讀

    Docker容器網(wǎng)絡(luò)的數(shù)據(jù)鏈路是什么

    單主機(jī)容器網(wǎng)絡(luò)可能存在多個(gè)docker,分屬于不同的bridge,它們之間有通信的需求。
    的頭像 發(fā)表于 02-15 09:56 ?1799次閱讀
    <b class='flag-5'>Docker</b><b class='flag-5'>容器</b><b class='flag-5'>網(wǎng)絡(luò)</b>的數(shù)據(jù)鏈路是什么

    docker容器刪除后數(shù)據(jù)還在嗎

    的數(shù)據(jù)是否還會(huì)保留,這是一個(gè)需要深入分析和理解的問(wèn)題。 本文將詳細(xì)探討Docker容器刪除后數(shù)據(jù)的存儲(chǔ)機(jī)制,從容器使用的存儲(chǔ)驅(qū)動(dòng)、數(shù)據(jù)卷、掛載以及網(wǎng)絡(luò)等方面進(jìn)行講解,以幫助讀者全面理解
    的頭像 發(fā)表于 11-23 09:32 ?3373次閱讀

    docker容器容器之間通信

    Docker容器之間的通信方式、通信過(guò)程以及常見(jiàn)的通信模式。 一、Docker容器之間的通信方式 在Do
    的頭像 發(fā)表于 11-23 09:36 ?2506次閱讀

    docker進(jìn)入容器的方法有哪些

    Docker是一種流行的容器化平臺(tái),它能夠快速構(gòu)建、交付和運(yùn)行應(yīng)用程序。在使用Docker時(shí),我們經(jīng)常需要進(jìn)入容器進(jìn)行調(diào)試、管理和運(yùn)行命令等操作。本文將詳細(xì)介紹
    的頭像 發(fā)表于 11-23 09:45 ?1.4w次閱讀

    docker容器有幾種狀態(tài)

    Docker 容器的各種狀態(tài)及其含義。 Created(已創(chuàng)建):當(dāng)我們使用 docker create 命令創(chuàng)建一個(gè)容器時(shí),它會(huì)進(jìn)入已創(chuàng)建狀態(tài)。在這個(gè)狀態(tài)下,
    的頭像 發(fā)表于 11-23 09:50 ?3803次閱讀