5.1 自定义网络的主要类型
Docker中的自定义网络提供了灵活的功能,用于配置和管理容器之间的网络交互。它们允许隔离容器、组织它们的交互并创建复杂的网络拓扑。在这次讲座中,我们将探讨如何在Docker中创建和配置自定义网络,以及它们的使用示例。
自定义网络的主要类型
Docker支持几种类型的自定义网络,每种类型都有自己的特性和适合不同的使用场景:
-
Bridge (桥接网络)
: 提供在单个主机上的容器之间的隔离和通信。这种网络类型默认用于本地应用程序,这些应用程序不需要与主机之外的内容交互。 -
Overlay (覆盖网络)
: 用于连接在不同主机上运行的容器,比如在Docker Swarm集群或Kubernetes中。它们为分布式应用提供高扩展性和安全性。 -
Macvlan
: 允许容器直接使用主机的物理网络接口。这对于性能要求高的网络应用程序以及需要绑定特定MAC地址的场景非常有用。在Macvlan网络中的容器可以与物理网络中的其他设备作为独立节点进行交互。 -
Host (主机网络)
: 容器使用主机的网络堆栈,这可以消除网络虚拟化的开销,但减少了隔离性。这种网络类型适用于需要最大网络性能的应用程序。
5.2 创建和使用桥接(bridge)网络
桥接网络(bridge)是最常见的用户自定义网络类型,通常用于在一个主机上隔离容器。连接到同一bridge网络的容器可以通过IP地址和主机名相互通信。
创建用户自定义的bridge 网络
要创建用户自定义的bridge 网络
,使用以下命令 docker network create
:
docker network create --driver bridge my_bridge_network
在用户自定义网络中启动容器
启动连接到该网络的容器:
docker run -d --name container1 --network my_bridge_network nginx
docker run -d --name container2 --network my_bridge_network busybox sleep 1000
检查容器之间的连接
你可以使用ping
命令检查容器之间的连接:
docker exec container2 ping -c 4 container1
如果容器正确连接到my_bridge_network
网络,ping
命令会成功运行。
5.3 在 Docker Compose
中使用自定义网络
在 Docker Compose
中使用自定义网络的例子
Docker Compose 简化了为多容器应用程序创建和管理网络的过程。你可以在 docker-compose.yml
文件中定义自定义网络。
docker-compose.yml
文件的例子:
version: '3.8'
services:
web:
image: nginx:latest
networks:
- my_bridge_network
app:
image: myapp:latest
networks:
- my_bridge_network
networks:
my_bridge_network:
driver: bridge
运行 Docker Compose:
docker compose up -d
在这个例子中,两个服务 (web
和 app
) 都连接到了自定义网络 my_bridge_network
。
5.4 配置和使用 macvlan
网络
macvlan
网络让容器可以直接使用主机的物理网络接口,这对需要高网络性能的应用很有用。处于这种网络中的容器会获得属于指定子网的独立 IP 地址,使它们能在和主机相同的网络中可见。
创建 macvlan
网络
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 my_macvlan_network
在这个命令中:
--subnet
: 指定容器所在的子网。--gateway
: 为容器设置网关。-o parent
: 指定主机绑定网络的物理接口。
在 macvlan
网络中运行容器
docker run -d --name container1 --network my_macvlan_network nginx
docker run -d --name container2 --network my_macvlan_network busybox sleep 1000
在这个例子中,两个容器都连接到了 my_macvlan_network
网络,并能通过物理接口 eth0
访问外部网络。
5.5 在 Docker Compose
中的使用示例
你也可以在 Docker Compose
中使用 macvlan
网络。比如:
version: '3.8'
services:
web:
image: nginx:latest
networks:
- my_macvlan_network
networks:
my_macvlan_network:
driver: macvlan
driver_opts:
parent: eth0
ipam:
config:
- subnet: 192.168.1.0/24
gateway: 192.168.1.1
启动 Docker Compose
:
docker compose up -d
在这个例子中,网络 my_macvlan_network
允许服务 web
与网段 192.168.1.0/24
内的设备(包括主机)进行交互。
实际建议:
- 访问配置: 确保你的路由器或网络管理员允许使用
macvlan
配置中指定的子网。 - 隔离: 如果安全性很重要,可以使用 VLAN 来分隔网络,这样容器只能访问需要的资源。
- 测试: 配置完成后,使用
ping
或curl
命令测试容器与外部网络的连接。
5.6 使用网络为微服务提供支持的示例
我们来看一个示例,这里有前端、后端和数据库,分别隔离在不同的网络中,但通过网络交叉实现彼此的交互。
文件 docker-compose.yml
version: '3.8'
services:
frontend:
image: myfrontend:latest
networks:
- front-tier
- back-tier
backend:
image: mybackend:latest
networks:
- back-tier
- db-tier
database:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
networks:
- db-tier
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
db-tier:
driver: bridge
启动 Docker Compose
:
docker compose up -d
在这个示例中:
- 服务
frontend
连接到网络front-tier
和back-tier
,这使得它既能与外部客户端交互,也能与后端交互。 - 服务
backend
连接到网络back-tier
和db-tier
,这使得它既能与前端交互,也能与数据库交互。 - 服务
database
仅连接到网络db-tier
,确保数据库与外部访问隔离。
实践建议:
- 使用隔离: 网络分离有助于限制服务对数据库或其他关键资源的访问。
- 检查连接: 使用
ping
或curl
命令,确保服务可以通过共享网络相互交互。 - 优化: 如果你的项目需要在集群或多个主机上运行,使用
overlay
网络更优。
这个示例展示了如何创建网络隔离,同时在应用程序的不同层级间实现交互。
GO TO FULL VERSION