| name | networking |
| description | Docker 容器网络 |
| version | 1.0.0 |
| author | terminal-skills |
| tags | ["docker","networking","bridge","overlay"] |
Docker 容器网络
概述
容器网络模式、跨主机通信等技能。
网络驱动
网络类型
查看网络
docker network ls
docker network inspect bridge
docker network inspect network_name
docker inspect container_name --format '{{json .NetworkSettings.Networks}}'
Bridge 网络
默认 bridge
docker run -d --name web nginx
docker inspect web --format '{{.NetworkSettings.IPAddress}}'
自定义 bridge
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 exec api ping web
连接多个网络
docker network create frontend
docker network create backend
docker run -d --name app --network frontend myapp
docker network connect backend app
docker network disconnect frontend app
Host 网络
docker run -d --network host nginx
None 网络
docker run -d --network none myapp
端口映射
docker run -d -p 8080:80 nginx
docker run -d -p 80:80 -p 443:443 nginx
docker run -d -p 127.0.0.1:8080:80 nginx
docker run -d -P nginx
docker port container_name
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 --hostname myhost nginx
docker run -d --add-host db:192.168.1.100 nginx
网络别名
docker network create mynet
docker run -d --name web --network mynet --network-alias webserver nginx
docker run --rm --network mynet busybox ping webserver
Overlay 网络(Swarm)
docker swarm init
docker network create -d overlay myoverlay
docker network create -d overlay --attachable myoverlay
docker service create --name web --network myoverlay nginx
Macvlan 网络
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
mymacvlan
docker run -d --network mymacvlan --ip 192.168.1.100 nginx
网络诊断
容器内诊断
docker exec -it container_name sh
apt-get update && apt-get install -y iputils-ping curl netcat-openbsd
docker run -it --network container:target_container nicolaka/netshoot
常用诊断命令
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name
docker network inspect mynet -f '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{"\n"}}{{end}}'
docker exec container1 ping container2
docker exec container1 curl http://container2:80
常见场景
场景 1:容器间通信
docker network create app-network
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
场景 2:隔离前后端
docker network create frontend
docker network create backend
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 db --network backend postgres
场景 3:调试网络问题
docker run -it --rm --network container:target nicolaka/netshoot
ip addr
ss -tlnp
curl -v http://service:port
tcpdump -i eth0
nslookup service_name
场景 4:限制网络带宽
docker run -d --cap-add NET_ADMIN myapp
tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
故障排查
| 问题 | 排查方法 |
|---|
| 容器间无法通信 | 检查是否在同一网络 |
| DNS 解析失败 | 检查是否使用自定义网络 |
| 端口无法访问 | 检查端口映射、防火墙 |
| 网络性能差 | 考虑使用 host 网络 |
docker network inspect network_name
docker inspect container_name | jq '.[0].NetworkSettings'
iptables -L -n -t nat