networking
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDocker 容器网络
Docker 容器网络
概述
概述
容器网络模式、跨主机通信等技能。
容器网络模式、跨主机通信等技能。
网络驱动
网络驱动
网络类型
网络类型
bash
undefinedbash
undefinedbridge(默认)- 单主机容器通信
bridge(默认)- 单主机容器通信
host - 共享主机网络
host - 共享主机网络
none - 无网络
none - 无网络
overlay - 跨主机通信(Swarm)
overlay - 跨主机通信(Swarm)
macvlan - 分配 MAC 地址
macvlan - 分配 MAC 地址
undefinedundefined查看网络
查看网络
bash
undefinedbash
undefined列出网络
列出网络
docker network ls
docker network ls
网络详情
网络详情
docker network inspect bridge
docker network inspect network_name
docker network inspect bridge
docker network inspect network_name
查看容器网络
查看容器网络
docker inspect container_name --format '{{json .NetworkSettings.Networks}}'
undefineddocker inspect container_name --format '{{json .NetworkSettings.Networks}}'
undefinedBridge 网络
Bridge 网络
默认 bridge
默认 bridge
bash
undefinedbash
undefined容器使用默认 bridge
容器使用默认 bridge
docker run -d --name web nginx
docker run -d --name web nginx
查看 IP
查看 IP
docker inspect web --format '{{.NetworkSettings.IPAddress}}'
docker inspect web --format '{{.NetworkSettings.IPAddress}}'
默认 bridge 容器间通过 IP 通信
默认 bridge 容器间通过 IP 通信
不支持容器名解析
不支持容器名解析
undefinedundefined自定义 bridge
自定义 bridge
bash
undefinedbash
undefined创建网络
创建网络
docker network create mynet
docker network create --driver bridge --subnet 172.20.0.0/16 mynet
docker network create mynet
docker network create --driver bridge --subnet 172.20.0.0/16 mynet
使用自定义网络
使用自定义网络
docker run -d --name web --network mynet nginx
docker run -d --name api --network mynet myapi
docker run -d --name web --network mynet nginx
docker run -d --name api --network mynet myapi
自定义网络支持容器名解析
自定义网络支持容器名解析
docker exec api ping web
undefineddocker exec api ping web
undefined连接多个网络
连接多个网络
bash
undefinedbash
undefined创建网络
创建网络
docker network create frontend
docker network create backend
docker network create frontend
docker network create backend
容器连接多个网络
容器连接多个网络
docker run -d --name app --network frontend myapp
docker network connect backend app
docker run -d --name app --network frontend myapp
docker network connect backend app
断开网络
断开网络
docker network disconnect frontend app
undefineddocker network disconnect frontend app
undefinedHost 网络
Host 网络
bash
undefinedbash
undefined使用主机网络
使用主机网络
docker run -d --network host nginx
docker run -d --network host nginx
容器直接使用主机端口
容器直接使用主机端口
无需端口映射
无需端口映射
性能最好,但端口可能冲突
性能最好,但端口可能冲突
undefinedundefinedNone 网络
None 网络
bash
undefinedbash
undefined无网络
无网络
docker run -d --network none myapp
docker run -d --network none myapp
完全隔离,无网络访问
完全隔离,无网络访问
适用于安全敏感场景
适用于安全敏感场景
undefinedundefined端口映射
端口映射
bash
undefinedbash
undefined映射端口
映射端口
docker run -d -p 8080:80 nginx # HOST:CONTAINER
docker run -d -p 80:80 -p 443:443 nginx # 多端口
docker run -d -p 127.0.0.1:8080:80 nginx # 绑定特定 IP
docker run -d -P nginx # 随机端口
docker run -d -p 8080:80 nginx # HOST:CONTAINER
docker run -d -p 80:80 -p 443:443 nginx # 多端口
docker run -d -p 127.0.0.1:8080:80 nginx # 绑定特定 IP
docker run -d -P nginx # 随机端口
查看端口映射
查看端口映射
docker port container_name
undefineddocker port container_name
undefinedDNS 配置
DNS 配置
bash
undefinedbash
undefined自定义 DNS
自定义 DNS
docker run -d --dns 8.8.8.8 nginx
docker run -d --dns 8.8.8.8 --dns 8.8.4.4 nginx
docker run -d --dns 8.8.8.8 nginx
docker run -d --dns 8.8.8.8 --dns 8.8.4.4 nginx
自定义主机名
自定义主机名
docker run -d --hostname myhost nginx
docker run -d --hostname myhost nginx
添加 hosts 记录
添加 hosts 记录
docker run -d --add-host db:192.168.1.100 nginx
undefineddocker run -d --add-host db:192.168.1.100 nginx
undefined网络别名
网络别名
bash
undefinedbash
undefined创建网络
创建网络
docker network create mynet
docker network create mynet
使用别名
使用别名
docker run -d --name web --network mynet --network-alias webserver nginx
docker run -d --name web --network mynet --network-alias webserver nginx
其他容器可通过别名访问
其他容器可通过别名访问
docker run --rm --network mynet busybox ping webserver
undefineddocker run --rm --network mynet busybox ping webserver
undefinedOverlay 网络(Swarm)
Overlay 网络(Swarm)
bash
undefinedbash
undefined初始化 Swarm
初始化 Swarm
docker swarm init
docker swarm init
创建 overlay 网络
创建 overlay 网络
docker network create -d overlay myoverlay
docker network create -d overlay myoverlay
创建可附加的 overlay(非 Swarm 服务也可使用)
创建可附加的 overlay(非 Swarm 服务也可使用)
docker network create -d overlay --attachable myoverlay
docker network create -d overlay --attachable myoverlay
在服务中使用
在服务中使用
docker service create --name web --network myoverlay nginx
undefineddocker service create --name web --network myoverlay nginx
undefinedMacvlan 网络
Macvlan 网络
bash
undefinedbash
undefined创建 macvlan 网络
创建 macvlan 网络
docker network create -d macvlan
--subnet=192.168.1.0/24
--gateway=192.168.1.1
-o parent=eth0
mymacvlan
--subnet=192.168.1.0/24
--gateway=192.168.1.1
-o parent=eth0
mymacvlan
docker network create -d macvlan
--subnet=192.168.1.0/24
--gateway=192.168.1.1
-o parent=eth0
mymacvlan
--subnet=192.168.1.0/24
--gateway=192.168.1.1
-o parent=eth0
mymacvlan
使用 macvlan
使用 macvlan
docker run -d --network mymacvlan --ip 192.168.1.100 nginx
docker run -d --network mymacvlan --ip 192.168.1.100 nginx
容器获得独立 MAC 地址,可直接在物理网络通信
容器获得独立 MAC 地址,可直接在物理网络通信
undefinedundefined网络诊断
网络诊断
容器内诊断
容器内诊断
bash
undefinedbash
undefined进入容器
进入容器
docker exec -it container_name sh
docker exec -it container_name sh
网络工具
网络工具
apt-get update && apt-get install -y iputils-ping curl netcat-openbsd
apt-get update && apt-get install -y iputils-ping curl netcat-openbsd
或使用 netshoot
或使用 netshoot
docker run -it --network container:target_container nicolaka/netshoot
undefineddocker run -it --network container:target_container nicolaka/netshoot
undefined常用诊断命令
常用诊断命令
bash
undefinedbash
undefined查看容器 IP
查看容器 IP
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name
查看网络中的容器
查看网络中的容器
docker network inspect mynet -f '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{"\n"}}{{end}}'
docker network inspect mynet -f '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{"\n"}}{{end}}'
测试连通性
测试连通性
docker exec container1 ping container2
docker exec container1 curl http://container2:80
undefineddocker exec container1 ping container2
docker exec container1 curl http://container2:80
undefined常见场景
常见场景
场景 1:容器间通信
场景 1:容器间通信
bash
undefinedbash
undefined创建网络
创建网络
docker network create app-network
docker network create app-network
启动数据库
启动数据库
docker run -d --name db --network app-network postgres
docker run -d --name db --network app-network postgres
启动应用(通过容器名访问数据库)
启动应用(通过容器名访问数据库)
docker run -d --name app --network app-network
-e DATABASE_URL=postgres://db:5432/mydb
myapp
-e DATABASE_URL=postgres://db:5432/mydb
myapp
undefineddocker run -d --name app --network app-network
-e DATABASE_URL=postgres://db:5432/mydb
myapp
-e DATABASE_URL=postgres://db:5432/mydb
myapp
undefined场景 2:隔离前后端
场景 2:隔离前后端
bash
undefinedbash
undefined创建网络
创建网络
docker network create frontend
docker network create backend
docker network create frontend
docker network create backend
前端只在 frontend
前端只在 frontend
docker run -d --name nginx --network frontend -p 80:80 nginx
docker run -d --name nginx --network frontend -p 80:80 nginx
后端连接两个网络
后端连接两个网络
docker run -d --name api --network frontend myapi
docker network connect backend api
docker run -d --name api --network frontend myapi
docker network connect backend api
数据库只在 backend
数据库只在 backend
docker run -d --name db --network backend postgres
undefineddocker run -d --name db --network backend postgres
undefined场景 3:调试网络问题
场景 3:调试网络问题
bash
undefinedbash
undefined使用 netshoot 调试
使用 netshoot 调试
docker run -it --rm --network container:target nicolaka/netshoot
docker run -it --rm --network container:target nicolaka/netshoot
常用命令
常用命令
ip addr
ss -tlnp
curl -v http://service:port
tcpdump -i eth0
nslookup service_name
undefinedip addr
ss -tlnp
curl -v http://service:port
tcpdump -i eth0
nslookup service_name
undefined场景 4:限制网络带宽
场景 4:限制网络带宽
bash
undefinedbash
undefined使用 tc 限制带宽(需要 NET_ADMIN 权限)
使用 tc 限制带宽(需要 NET_ADMIN 权限)
docker run -d --cap-add NET_ADMIN myapp
docker run -d --cap-add NET_ADMIN myapp
在容器内
在容器内
tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
undefinedtc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
undefined故障排查
故障排查
| 问题 | 排查方法 |
|---|---|
| 容器间无法通信 | 检查是否在同一网络 |
| DNS 解析失败 | 检查是否使用自定义网络 |
| 端口无法访问 | 检查端口映射、防火墙 |
| 网络性能差 | 考虑使用 host 网络 |
bash
undefined| 问题 | 排查方法 |
|---|---|
| 容器间无法通信 | 检查是否在同一网络 |
| DNS 解析失败 | 检查是否使用自定义网络 |
| 端口无法访问 | 检查端口映射、防火墙 |
| 网络性能差 | 考虑使用 host 网络 |
bash
undefined检查网络配置
检查网络配置
docker network inspect network_name
docker network inspect network_name
检查容器网络
检查容器网络
docker inspect container_name | jq '.[0].NetworkSettings'
docker inspect container_name | jq '.[0].NetworkSettings'
检查 iptables 规则
检查 iptables 规则
iptables -L -n -t nat
undefinediptables -L -n -t nat
undefined