七.Docker网络
七.Docker网络
- 1. 概述
- 2.常见命令
- 3.网络模式
1. 概述
Docker 网络是容器间以及容器与外部网络通信的基础架构,提供了多种网络模式来满足不同的应用场景
Docker 提供多种网络驱动来适应不同需求:
bridge: 默认网络模式
host: 共享主机网络
none: 无网络
overlay: 跨主机网络
macvlan: 物理网络连接
Docker启动后会产生一个名称为docker0的虚拟网络

查看docker网络模式:默认创建3种网络模式
docker network ls

2.常见命令
查看网络:docker network Is
#基本用法,列出所有网络
docker network Is
# 过滤显示
docker network ls --filter driver=bridge
docker network ls --filter name=my-network
docker network ls --filter label=env=production查看网络详细信息:docker network inspect 网络名字
# 查看默认 bridge 网络
docker network inspect bridge# 查看指定网络
docker network inspect my-network创建一个网络:docker network create 网络名字
# 创建默认 bridge 网络
docker network create my-network
# 创建自定义 subnet 网络
docker network create --subnet=192.168.1.0/24 my-network
# 创建带 IP 范围的网络
docker network create \--subnet=192.168.1.0/24 \--ip-range=192.168.1.128/25 \
my-network
# 创建不同驱动的网络
docker network create --driver bridge my-bridge
docker network create --driver overlay my-overlay删除网络:docker network rm网络名字
# 删除单个网络
docker network rm my-network
# 删除多个网络
docker network rm network1 network2
# 删除所有未使用的网络
docker network prune
# 删除时确认提示
docker network prune -f连接容器到网络:docker network connect
# 连接运行中的容器到网络
docker network connect my-network my-container
# 连接时指定别名
docker network connect --alias web my-network my-container
# 连接时指定 IP 地址
docker network connect --ip 192.168.1.10 my-network my-container断开容器网络连接:docker network disconnect
# 断开容器网络连接
docker network disconnect my-network my-container
# 强制断开连接
docker network disconnect -f my-network my-container端口映射相关
# 发布多个端口
docker run -p 8080:80 -p 8443:443 nginx
# 发布所有暴露端口
docker run -P nginx
# 绑定到特定 IP
docker run -p 127.0.0.1:8080:80 nginx
# 发布 UDP 端口
docker run -p 53:53/udp bind自定义网络创建示例
# 创建生产环境网络
docker network create \--driver bridge \--subnet=172.20.0.0/16 \--ip-range=172.20.240.0/20 \--gateway=172.20.0.1 \--label env=production \--opt com.docker.network.bridge.name=prod-bridge \prod-network# 创建开发环境网络
docker network create \--driver bridge \--subnet=172.21.0.0/16 \dev-network网络连通性测试
# 在容器内测试网络
docker exec container-name ping google.com
docker exec container-name curl http://service-name:8080
# 查看容器网络配置
docker exec container-name ip addr
docker exec container-name route -n
# 查看容器网络统计
docker exec container-name netstat -i端口检查
# 查看容器端口映射
docker port container-name
# 在主机上检查端口占用
netstat -tlnp | grep :8080
ss -tlnp | grep :8080Docker 网络调试
# 查看 Docker 网络详细日志
docker info | grep -i network
# 查看网络驱动信息
docker info --format '{{.Plugins.Network}}'
# 检查网络配置
docker network ls -q | xargs docker network inspect网络性能和安全
# 创建网络时设置 MTU, 是网络接口能够传输的最大数据包大小,以字节为单位
docker network create \--opt com.docker.network.driver.mtu=1454 \my-network
# 在 daemon.json 中全局设置
{"mtu": 1454
}# 创建内部网络(无外网访问)
docker network create \--internal \internal-network# 禁用网络服务发现
docker network create \--opt com.docker.network.bridge.enable_icc=false \isolated-network
3.网络模式
docker容器内部的ip是有可能会发生改变的

-
bridge模式:使用-network bridge指定,默认使用docker0
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络,让主机和容器之间可以通过网桥相互通信。
Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
网桥docker0创建一堆虚拟设备接口叫veth,每个容器实例内部也有一块网卡,每个接口叫eth0;docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

-
host模式:使用-network host指定
直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。
容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。

-
none模式:使用-network none指定
在none模式下(禁用网络),不为Docker容器进行任何网络配置。即Docker容器没有网卡、IP、路由等信息,只有一个lo(127.0.0.1)。
例:docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8 -
container模式:使用–network container:容器NAME或者容器ID
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
例:docker run -it -network container:name1 --name name2 centos /bin/sh -
自定义网络
自定义网络的核心作用- 网络隔离与安全
实现不同应用间的网络隔离
控制容器间的通信权限
提供更安全的网络环境 - 服务发现与DNS解析
容器间可通过容器名直接通信
自动DNS解析,无需手动配置IP
支持网络别名实现负载均衡 - 灵活的网络拓扑
可动态连接/断开网络
支持多网络连接
可自定义IP地址和子网 - 跨主机通信
Overlay网络支持集群环境
实现分布式应用部署
不同场景的解决方案
场景一:单主机多应用隔离
适用情况:同一台主机上运行多个独立应用# 为每个应用创建独立网络 docker network create app1-network docker network create app2-network# 应用1的容器组 docker run -d --name app1-db --network app1-network mysql:8.0 docker run -d --name app1-web --network app1-network nginx:alpine# 应用2的容器组 docker run -d --name app2-db --network app2-network postgres:13 docker run -d --name app2-web --network app2-network nginx:alpine优势:
完全隔离不同应用的网络通信
防止意外的网络访问
简化应用管理
场景二:微服务架构部署
适用情况:前后端分离的微服务应用# 创建分层网络 docker network create frontend-network docker network create backend-network# 数据库层(仅后端网络) docker run -d --name database --network backend-network mysql:8.0# 应用服务层(连接前后端网络) docker run -d --name api-server \--network backend-network \--network-alias api \my-api:latest# Web前端(仅前端网络) docker run -d --name web-server \--network frontend-network \nginx:alpine# 反向代理(连接前端网络,可访问API) docker run -d --name reverse-proxy \--network frontend-network \--network backend-network \nginx:alpine优势:
明确的服务边界
控制数据流向
提高安全性
场景三:开发测试环境
适用情况:为不同开发团队或项目创建独立环境# 为不同团队创建网络 docker network create teamA-dev-network docker network create teamB-dev-network# 团队A的开发环境 docker run -d --name teamA-mysql --network teamA-dev-network mysql:8.0 docker run -d --name teamA-redis --network teamA-dev-network redis:alpine docker run -d --name teamA-app --network teamA-dev-network my-app:dev# 团队B的开发环境 docker run -d --name teamB-mysql --network teamB-dev-network mysql:8.0 docker run -d --name teamB-redis --network teamB-dev-network redis:alpine docker run -d --name teamB-app --network teamB-dev-network my-app:dev优势:
环境完全隔离
避免资源冲突
便于并行开发
场景四:负载均衡与高可用
适用情况:需要实现服务负载均衡# 创建服务网络 docker network create service-network# 多个应用实例 docker run -d --name web1 --network service-network --network-alias web nginx:alpine docker run -d --name web2 --network service-network --network-alias web nginx:alpine docker run -d --name web3 --network service-network --network-alias web nginx:alpine# 负载均衡器 docker run -d --name load-balancer \--network service-network \-p 80:80 \haproxy:alpine优势:
自动服务发现
内置负载均衡
动态扩展支持
场景五:跨主机集群部署
适用情况:Docker Swarm或Kubernetes集群环境# 创建overlay网络(适用于Swarm) docker network create -d overlay \--subnet=192.168.1.0/24 \--attachable \cluster-network# 在不同节点部署服务 docker service create \--name database \--network cluster-network \mysql:8.0docker service create \--name web \--network cluster-network \--replicas 3 \nginx:alpine优势:
跨主机通信
服务编排支持
高可用性
场景六:网络调试与监控
适用情况:需要监控网络流量或调试网络问题# 创建监控网络 docker network create monitoring-network# 应用容器 docker run -d --name app --network monitoring-network my-app:latest# 网络监控容器(连接同一网络) docker run -d --name network-monitor \--network monitoring-network \--cap-add NET_ADMIN \nicolaka/netshoot \tcpdump -i any -w /data/capture.pcap优势:
便于网络问题排查
支持流量监控
不影响应用容器

- 网络隔离与安全
