chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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 --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)上,通過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
dockerexec cat /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 找到占用進(jì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,說明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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

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

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

    Docker是一個(gè)開源的引擎,可以輕松的為任何應(yīng)用創(chuàng)建一個(gè)輕量級的、可移植的、自給自足的容器。開發(fā)者在筆記本上編譯測試通過的容器可以批量地在生產(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í)際操作一下。先打開兩個(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 ?7241次閱讀

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

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

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

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

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

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

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

    單主機(jī)容器網(wǎng)絡(luò)可能存在多個(gè)docker,分屬于不同的bridge,它們之間有通信的需求。
    的頭像 發(fā)表于 02-15 09:56 ?1784次閱讀
    <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è)需要深入分析和理解的問題。 本文將詳細(xì)探討Docker容器刪除后數(shù)據(jù)的存儲機(jī)制,從容器使用的存儲驅(qū)動(dòng)、數(shù)據(jù)卷、掛載以及網(wǎng)絡(luò)等方面進(jìn)行講解,以幫助讀者全面理解
    的頭像 發(fā)表于 11-23 09:32 ?3356次閱讀

    docker容器容器之間通信

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

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

    Docker是一種流行的容器化平臺,它能夠快速構(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 ?3789次閱讀