智能
助手
最大化  清空记录 停止  历史记录
翻译选中文本
选中一段文本后进行翻译
名词解释
选中一段文本后进行名词解释
知识图谱生成
通过图谱展示知识信息
登录用户在知识浏览页面可用
答案生成
AI自动回答一个问答功能中的问题
登录用户在问答浏览页面,且问题开放回答中可用
知识摘要
自动为当前知识生成摘要
知识浏览页面可用
知识问答
针对当前知识进行智能问答
知识浏览面可用
   51  
查询码: 00000210
5 网络管理
作者: 文艺范儿 于 2025年12月20日 发布在分类 / Docker & K8S / docker基础 ,于 2025年12月20日 编辑
docker

5. 网络管理

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 服务

跨主机逻辑网络隔离

5.1 bridge

—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)

5.2 host

—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)

5.3 none

—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)

5.4 container

—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>
...

5.5 custom network 自定义网络

与默认的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

5.6 常用命令

# 查看网络列表
docker network ls

# 创建自定义网络(推荐生产)
docker network create --driver bridge backend_net

# 连接容器到网络
docker network connect backend_net web

# 查看容器网络详情
docker inspect web | grep -A 10 "NetworkSettings"

5.7 最佳实践

  • 生产环境使用 自定义桥接网络,替代默认的 bridge,提升容器间通信安全性。

1️⃣ 为什么要使用自定义桥接网络?

对比项 默认 bridge 自定义桥接网络

DNS 自动解析

不支持容器名互访(需用 —link已废弃)

支持容器名 / 别名自动 DNS 解析

隔离性

所有容器在同一网络,易产生不必要的互通

可按业务划分网络,减少攻击面

安全性

默认允许所有容器互通,需手动加 iptables 限制

默认只允许同一网络内互通,不同网络隔离

可维护性

网络混杂,难以管理多环境

可按环境(prod、test)或业务单元划分网络

SRE 原则:网络隔离是减少“横向渗透”风险的第一道防线,默认 bridge不符合最小权限原则。


2️⃣ 架构示意

  • web-ui只能通过自定义前端网络访问 app-service
  • app-servicedb-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-servicedb-service在同一网络,可用容器名 db-service直接访问数据库。
  • web-ui不在 prod-backend-net,无法直接访问 db-service,提升安全性。
  • 若需跨网络通信,可在 app-service中显式连接第二个网络(如 docker network connect prod-frontend-net app-service),但需审计必要性。

4️⃣ 安全性提升体现

  1. 默认隔离

    不同网络的容器默认不能互相通信,除非显式连接,减少攻击面。

  2. 最小权限

    前端容器无法直接访问数据库,即使前端被攻破,也难以横向渗透到数据层。

  3. 可审计

    网络划分清晰,方便在防火墙 / iptables / 云安全组中做细粒度控制。

  4. 故障域隔离

    某业务网络出现问题(如容器扫描、DDoS),不会影响其他业务网络。

5️⃣ SRE 运维建议

  • 网络命名规范[env]-[layer]-net,如 prod-backend-nettest-cache-net
  • 定期审计docker network lsdocker network inspect检查是否有不该互联的容器。
  • 监控:采集容器网络流量(cAdvisor + Prometheus + eBPF)发现异常跨网络通信。
  • 回滚预案:保留旧网络配置,出现问题时可快速切回已知安全拓扑。

多台 Docker 服务器上的容器如何实现互连?

方案 1:使用 Docker Overlay 网络(推荐用于 Swarm 集群)

方案 2:使用 第三方容器网络插件(CNI 插件)

适用场景:你不想用 Swarm,而是希望更灵活、更现代化的跨主机网络(比如 Kubernetes、独立 Docker 主机集群)。

方案 3:通过 主机网络互通 + 端口映射 / 负载均衡

适用场景:不想引入复杂网络插件,仅做简单服务互通。

笔记
0人参与


 历史版本

备注 修改日期 修改人
创建版本 2025-12-20 00:55:35[当前版本] 文艺范儿

  目录
    文艺知识分享平台 -V 5.2.5 -wcp