| 备注 | 修改日期 | 修改人 |
| 创建版本 | 2025-12-20 00:55:35[当前版本] | 文艺范儿 |
docker有5种网络类型:bridge、host、none、container、overlay
| 网络类型 | 驱动 | 作用 | 典型场景 | 隔离性 |
|---|---|---|---|---|
bridge |
bridge |
单机容器间通信 + NAT 访问外网 |
默认单机容器互联 |
同一 bridge 内互通,不同 bridge 隔离 |
host |
host |
容器共享宿主机网络栈 |
高性能网络需求(如 NFV) |
无隔离(与宿主机同 IP) |
none |
null |
完全禁用网络 |
安全隔离、离线计算 |
完全隔离(无网卡) |
container |
container |
共享另一个容器的网络命名空间 |
紧密耦合的 sidecar / 代理模式 |
与被共享容器网络完全一致 |
overlay |
overlay |
跨主机容器通信(Swarm 集群) |
多主机 Docker Swarm 服务 |
跨主机逻辑网络隔离 |
—net=bridge 或者 —network bridge (默认网络类型:不用加此参数也是默认用的)
#自定义 bridge docker network create --driver bridge my_bridge docker run -d --name app --network my_bridge myapp
默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
[root@docker-71 ~]# docker run -it -d --name box01 --net=bridge busybox
3275e6b4c29cbba63d1eeb5b54a94cca42003e7fca13cbe214c22c7c4819a24a
[root@docker-71 ~]# docker exec -it box01 sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr EA:70:88:7F:1E:A0
inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:656 (656.0 B) TX bytes:126 (126.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
—net=host 或者 —network host
容器不会获得一个独立的network namespace,而是与宿主机公用一个。这意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离的。
[root@docker-71 ~]# docker run -it -d --name box02 --net=host busybox
ac24965357c368da59b99ad9721190752fe45ef1f8688002bf8fba4a15255d49
[root@docker-71 ~]# docker exec -it box02 sh
/ # ifconfig
docker0 Link encap:Ethernet HWaddr A6:9C:2A:C2:EC:F9
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::a49c:2aff:fec2:ecf9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:29 errors:0 dropped:0 overruns:0 frame:0
TX packets:31 errors:0 dropped:2 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3755 (3.6 KiB) TX bytes:2380 (2.3 KiB)
ens34 Link encap:Ethernet HWaddr 00:0C:29:02:47:3F
inet addr:192.168.1.71 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe02:473f/64 Scope:Link
inet6 addr: 240e:335:861b:4220:20c:29ff:fe02:473f/64 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:602705 errors:0 dropped:33353 overruns:0 frame:0
TX packets:499280 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:168339435 (160.5 MiB) TX bytes:64072139 (61.1 MiB)
ens35 Link encap:Ethernet HWaddr 00:0C:29:02:47:49
inet addr:192.168.31.71 Bcast:192.168.31.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe02:4749/64 Scope:Link
inet6 addr: 240e:335:861b:4221:20c:29ff:fe02:4749/64 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:197331 errors:0 dropped:3496 overruns:0 frame:0
TX packets:55146 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:150829552 (143.8 MiB) TX bytes:6383801 (6.0 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:308182 errors:0 dropped:0 overruns:0 frame:0
TX packets:308182 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:76672331 (73.1 MiB) TX bytes:76672331 (73.1 MiB)
veth150b31a Link encap:Ethernet HWaddr B2:1D:F9:25:1D:5F
inet6 addr: fe80::b01d:f9ff:fe25:1d5f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:23 errors:0 dropped:0 overruns:0 frame:0
TX packets:50 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3909 (3.8 KiB) TX bytes:3638 (3.5 KiB)
vethd844801 Link encap:Ethernet HWaddr 3A:9C:78:86:0D:17
inet6 addr: fe80::389c:78ff:fe86:d17/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:126 (126.0 B) TX bytes:796 (796.0 B)
—net=none 或者 —network none
获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。
[root@docker-71 ~]# docker run -it -d --name box03 --net=none busybox
39f40320d7f0f43bb4ec1f24a06c4f2f351b0af34390f96d4ca964da068f052b
[root@docker-71 ~]# docker exec -it box03 sh
/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
—net=container:Name/ID 或者 —network container:Name/ID
与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。
[root@docker-71 ~]# docker run -itd --name bs -p 99:80 busybox fe9d61fe035fa134a8df9ae2df344d14e076e63a5ef481399c4bf3448e98a971 [root@docker-71 ~]# docker run -itd --name nginx01 --net=container:bs nginx f419e28542c7d93442ec52af22493e813932b3a635b069914edada0c3fbc6084 [root@docker-71 ~]# curl 127.0.0.1:99 ... <title>Welcome to nginx!</title> ...
与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名或者主机名容器之间网络通信。
docker network create bs-test docker run -itd --name box1 --net=bs-test busybox docker run -itd --name box2 --net=bs-test busybox docker exec -it box1 sh / # ping box2 docker network inspect bs-test
# 查看网络列表 docker network ls # 创建自定义网络(推荐生产) docker network create --driver bridge backend_net # 连接容器到网络 docker network connect backend_net web # 查看容器网络详情 docker inspect web | grep -A 10 "NetworkSettings"
bridge,提升容器间通信安全性。1️⃣ 为什么要使用自定义桥接网络?
| 对比项 | 默认 bridge |
自定义桥接网络 |
|---|---|---|
DNS 自动解析 |
不支持容器名互访(需用 —link已废弃) |
支持容器名 / 别名自动 DNS 解析 |
隔离性 |
所有容器在同一网络,易产生不必要的互通 |
可按业务划分网络,减少攻击面 |
安全性 |
默认允许所有容器互通,需手动加 iptables 限制 |
默认只允许同一网络内互通,不同网络隔离 |
可维护性 |
网络混杂,难以管理多环境 |
可按环境(prod、test)或业务单元划分网络 |
SRE 原则:网络隔离是减少“横向渗透”风险的第一道防线,默认
bridge不符合最小权限原则。
2️⃣ 架构示意
web-ui只能通过自定义前端网络访问 app-service。app-service与 db-service在后端网络内互通,但与前端网络隔离。bridge中所有容器都在同一网络,无法天然隔离。3️⃣ 操作步骤示例
1.创建自定义桥接网络
# 创建生产后端网络 docker network create \ --driver bridge \ --subnet=172.20.0.0/16 \ --gateway=172.20.0.1 \ prod-backend-net # 创建生产前端网络 docker network create \ --driver bridge \ --subnet=172.21.0.0/16 \ --gateway=172.21.0.1 \ prod-frontend-net
--subnet指定 IP 段,避免与主机和其他网络冲突。
--gateway明确网关,方便路由追踪。
2.运行容器并连接到指定网络
# 数据库服务(仅加入后端网络) docker run -d --name db-service \ --network prod-backend-net \ -e POSTGRES_PASSWORD=secret \ postgres:13 # 应用服务(同时可加入多个网络) docker run -d --name app-service \ --network prod-backend-net \ myorg/app:1.0 # 前端 Web 服务(仅加入前端网络) docker run -d --name web-ui \ --network prod-frontend-net \ -p 80:80 \ myorg/web:1.0
关键点:
app-service与 db-service在同一网络,可用容器名 db-service直接访问数据库。web-ui不在 prod-backend-net,无法直接访问 db-service,提升安全性。app-service中显式连接第二个网络(如 docker network connect prod-frontend-net app-service),但需审计必要性。4️⃣ 安全性提升体现
默认隔离
不同网络的容器默认不能互相通信,除非显式连接,减少攻击面。
最小权限
前端容器无法直接访问数据库,即使前端被攻破,也难以横向渗透到数据层。
可审计
网络划分清晰,方便在防火墙 / iptables / 云安全组中做细粒度控制。
故障域隔离
某业务网络出现问题(如容器扫描、DDoS),不会影响其他业务网络。
5️⃣ SRE 运维建议
[env]-[layer]-net,如 prod-backend-net、test-cache-net。docker network ls、docker network inspect检查是否有不该互联的容器。多台 Docker 服务器上的容器如何实现互连?
方案 1:使用 Docker Overlay 网络(推荐用于 Swarm 集群)
方案 2:使用 第三方容器网络插件(CNI 插件)
适用场景:你不想用 Swarm,而是希望更灵活、更现代化的跨主机网络(比如 Kubernetes、独立 Docker 主机集群)。
方案 3:通过 主机网络互通 + 端口映射 / 负载均衡
适用场景:不想引入复杂网络插件,仅做简单服务互通。