Docker网络高级配置
大约 6 分钟Docker指南Docker网络配置
Docker网络高级配置
Docker网络模型概述
Docker网络是容器间通信的基础,它提供了多种网络驱动来满足不同的使用场景。理解Docker网络模型对于构建可靠的容器化应用至关重要。
Docker网络驱动类型
1. Bridge网络(默认)
Bridge网络是Docker默认的网络驱动,适用于同一宿主机上的容器通信。
# 查看默认bridge网络
docker network ls
# 创建自定义bridge网络
docker network create --driver bridge mybridge
# 在自定义bridge网络中运行容器
docker run -d --name container1 --network mybridge nginx
docker run -d --name container2 --network mybridge nginx
# 测试容器间通信
docker exec container1 ping container2
2. Host网络
Host网络模式移除了容器与宿主机之间的网络隔离,容器直接使用宿主机的网络。
# 使用host网络运行容器
docker run -d --name mycontainer --network host nginx
# 注意:host模式下端口映射无效
3. None网络
None网络模式禁用容器的所有网络功能。
# 使用none网络运行容器
docker run -d --name mycontainer --network none alpine
4. Container网络
Container网络模式使新容器共享另一个容器的网络命名空间。
# 运行第一个容器
docker run -d --name container1 nginx
# 运行第二个容器共享第一个容器的网络
docker run -d --name container2 --network container:container1 alpine
5. Overlay网络
Overlay网络用于跨多个Docker宿主机的容器通信,通常与Docker Swarm一起使用。
# 初始化Docker Swarm
docker swarm init
# 创建overlay网络
docker network create --driver overlay --attachable myoverlay
# 在overlay网络中运行服务
docker service create --name myservice --network myoverlay nginx
自定义网络配置
1. 创建自定义网络
# 创建自定义bridge网络
docker network create \
--driver bridge \
--subnet=172.20.0.0/16 \
--ip-range=172.20.240.0/20 \
--gateway=172.20.0.1 \
mycustomnet
# 查看网络详细信息
docker network inspect mycustomnet
2. 网络别名和DNS
# 创建网络并设置别名
docker network create mynet
# 运行容器并设置网络别名
docker run -d --name web1 --network mynet --network-alias web nginx
docker run -d --name web2 --network mynet --network-alias web nginx
# 从另一个容器访问别名
docker run -it --name client --network mynet alpine
# 在容器内执行:nslookup web(会返回两个IP地址)
3. 链接容器(已废弃,推荐使用自定义网络)
# 创建容器链接(已废弃)
docker run -d --name db mysql:5.7
docker run -d --name web --link db:database nginx
高级网络功能
1. 网络命名空间
# 查看容器的网络命名空间
docker inspect container_name | grep -i network
# 进入容器的网络命名空间
pid=$(docker inspect -f '{{.State.Pid}}' container_name)
sudo nsenter -t $pid -n ip addr
2. 端口映射高级配置
# 指定主机IP和端口
docker run -d -p 192.168.1.100:8080:80 nginx
# 映射多个端口
docker run -d -p 8080:80 -p 8443:443 nginx
# 映射端口范围
docker run -d -p 8000-8010:8000-8010 nginx
# 随机端口映射
docker run -d -P nginx # 大写P表示随机映射EXPOSE的端口
3. IPv6支持
# 启用IPv6支持
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}
EOF
# 重启Docker服务
sudo systemctl restart docker
# 创建支持IPv6的网络
docker network create --ipv6 myipv6net
网络安全配置
1. 网络访问控制
# 创建受限网络
docker network create \
--driver bridge \
--internal \
restrictednet
# 在受限网络中运行容器(无法访问外网)
docker run -d --name internal --network restrictednet nginx
2. MAC地址和IP地址固定
# 固定容器的IP地址
docker network create --subnet=172.20.0.0/16 mynet
docker run -d --name mycontainer --network mynet --ip 172.20.0.10 nginx
# 固定容器的MAC地址
docker run -d --name mycontainer --mac-address 02:42:ac:11:00:02 nginx
3. 网络流量监控
# 监控容器网络流量
docker stats container_name
# 使用netshoot工具容器进行网络诊断
docker run -it --net container:container_name nicolaka/netshoot
Docker Compose网络配置
1. 默认网络
version: "3.8"
services:
web:
image: nginx
db:
image: mysql:5.7
# Docker Compose会自动创建一个默认网络
2. 自定义网络
version: "3.8"
services:
web:
image: nginx
networks:
- frontend
- backend
app:
image: node:alpine
networks:
- backend
- database
db:
image: mysql:5.7
networks:
- database
networks:
frontend:
driver: bridge
backend:
driver: bridge
database:
driver: bridge
3. 外部网络
version: "3.8"
services:
web:
image: nginx
networks:
- externalnet
networks:
externalnet:
external:
name: mynetwork
网络故障排查
1. 常用诊断命令
# 查看网络列表
docker network ls
# 查看网络详细信息
docker network inspect bridge
# 查看容器网络配置
docker inspect container_name | grep -A 20 NetworkSettings
# 测试容器连通性
docker exec container_name ping google.com
2. 网络连接问题排查
# 检查DNS解析
docker exec container_name nslookup google.com
# 检查路由表
docker exec container_name ip route
# 检查网络接口
docker exec container_name ip addr
# 检查端口监听
docker exec container_name netstat -tlnp
3. 性能监控
# 监控网络I/O
docker stats --format "table {{.Name}}\t{{.NetIO}}"
# 使用sar监控网络
sar -n DEV 1 5
# 使用iftop实时监控
iftop -i docker0
网络性能优化
1. 网络驱动选择
# 对于高性能需求,可以考虑使用host网络
docker run -d --network host --name highperf nginx
# 或者使用macvlan网络
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 mymacvlan
2. MTU优化
# 创建网络时指定MTU
docker network create --opt com.docker.network.driver.mtu=1454 mynetwork
# 或者在daemon.json中全局配置
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"mtu": 1454
}
EOF
3. 网络缓冲区优化
# 调整系统网络参数
sudo sysctl -w net.core.rmem_max=134217728
sudo sysctl -w net.core.wmem_max=134217728
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 134217728"
sudo sysctl -w net.ipv4.tcp_wmem="4096 65536 134217728"
第三方网络插件
1. Weave Net
# 安装Weave Net
sudo curl -L git.io/weave -o /usr/local/bin/weave
sudo chmod a+x /usr/local/bin/weave
# 启动Weave Net
weave launch
# 在Weave网络中运行容器
eval $(weave env)
docker run -d --name mycontainer nginx
2. Flannel
# 在Docker Swarm中使用Flannel
docker swarm init
docker network create --driver overlay --attachable flannel-net
3. Calico
# 使用Calico作为网络插件
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
网络最佳实践
1. 网络隔离
# 为不同环境创建独立网络
docker network create dev-network
docker network create prod-network
# 在不同网络中运行容器
docker run -d --name dev-web --network dev-network nginx
docker run -d --name prod-web --network prod-network nginx
2. 安全配置
# 使用内部网络隔离敏感服务
docker network create --internal securenet
docker run -d --name db --network securenet mysql:5.7
3. 监控和日志
# 启用详细的网络日志
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"debug": true
}
EOF
常用网络命令总结
命令 | 说明 |
---|---|
docker network ls | 查看网络列表 |
docker network create | 创建网络 |
docker network inspect | 查看网络详细信息 |
docker network rm | 删除网络 |
docker network prune | 清理未使用的网络 |
docker run --network | 指定容器网络 |
docker network connect | 连接容器到网络 |
docker network disconnect | 断开容器与网络的连接 |
总结
Docker网络配置是容器化应用部署中的重要环节。通过合理的网络配置,可以实现容器间的安全通信、性能优化和故障隔离。在实际应用中,应该根据业务需求选择合适的网络驱动和配置方案,确保应用的稳定性和安全性。