## 9.6 网络隔离 Docker 网络提供了天然的隔离能力,不同网络之间的容器默认无法通信。这是 Docker 网络安全的重要基础。 ### 9.6.1 网络隔离原理 不同网络之间默认隔离,容器只能与同一网络中的容器直接通信: ```bash ## 创建两个网络 $ docker network create frontend $ docker network create backend ## 容器 A 在 frontend $ docker run -d --name web --network frontend nginx ## 容器 B 在 backend $ docker run -d --name db --network backend postgres ## web 无法直接访问 db(不同网络) $ docker exec web ping db ping: db: Name or service not known ``` ### 9.6.2 安全优势 这种隔离机制带来以下安全优势: | 场景 | 说明 | |------|------| | **前后端分离** | 前端容器无法直接访问数据库网络 | | **微服务隔离** | 不同微服务组可以使用不同网络 | | **多租户** | 不同租户的容器在不同网络中完全隔离 | | **最小权限** | 容器只能访问必要的网络资源 | ### 9.6.3 跨网络通信 如果确实需要某个容器跨网络通信,可以将其同时连接到多个网络: ```bash ## 创建一个中间件容器,连接到两个网络 $ docker run -d --name api --network frontend myapi $ docker network connect backend api ## 现在 api 容器既可以访问 frontend 中的 web,也可以访问 backend 中的 db ``` 这种方式让你可以精确控制哪些容器可以跨网络通信,遵循最小权限原则。 ### 9.6.4 典型网络架构 一个典型的多层应用网络架构如下: ```mermaid graph TD subgraph FrontendNet ["frontend 网络"] LB["负载均衡器"] Web1["Web 服务器 1"] Web2["Web 服务器 2"] end subgraph BackendNet ["backend 网络"] API["API 服务器"] DB["数据库"] Cache["Redis 缓存"] end LB --> Web1 LB --> Web2 Web1 -.-> API Web2 -.-> API API --> DB API --> Cache ``` 在这种架构中,API 服务器同时连接到 `frontend` 和 `backend` 网络,充当两个网络之间的桥梁。负载均衡器和 Web 服务器无法直接访问数据库,增强了安全性。