【Docker 07】Network - 网络
🌈 一、Docker 为什么需要网络管理
- 容器本质上是隔离的独立运行环境,但在实际应用时,容器之间、容器与宿主机、容器与外界必须进行通信,这就需要用到网络管理。
- 容器之间需要通信。
- 容器需要对外提供服务。
- 实现容器和宿主机的安全隔离。
- 容器可能根本就不需要网络。
🌈 二、Docker 网络架构简介
- Docker 容器网络是未应用程序所创造的虚拟环境的一部分,它可以让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等与网络有关的模块。
- Docker 为了实现容器网络,主要采用的网络架构由 CNM、Libnetwork 和 Driver 这三部分组成。
⭐ 1. 容器网络模型 CNM
- 容器网络模型(CNM:Container Network Model)规定了 Docker 网络的基础组成要素:
Sandbox
、Endpoint
、Network
。
1. 沙盒 Sandbox
- 提供了容器的虚拟网络栈(端口、套接字、IP 路由表、防火墙、DNS 配置等),主要用于隔离容器网络和宿主机网络,形成了完全独立的容器网路环境。
- 每个容器对应一个 Sandbox,Sandbox 本质上就是一个网络命名空间(Linux Namespace),一个 Sandbox 可以连接多个网络端点(Endpoint)。
2. 端点 Endpoint
- Endpoint 是一个用来连接 Sandbox 和网络(Network)的接口(可以有自己的 MAC、IP 地址等),它的主要职责是创建连接。
- 一个 Endpoint 只能接入一个 Network,当容器需要接入多个网络时,就需要多个 Endpoint(如 Container B)。
3. 网络 Network
- Network 是多个 Endpoint 的集合,是 Docker 内部的虚拟子网,使网络内的参与者可以进行通信。
- 如:Container A 和 B 可以借助 Network A 进行通讯,但 Container A 和 C 不能通过 Container B 的两个 Endpoint 进行通信。
- 一种 Network 对应着一个网络驱动 Driver(如 bridge、overlay、macvlan、host 等)。
⭐ 2. 容器网络管理库 Libnetwork
- Libnetwork 是 CNM 的一个标准实现,它实现了 CNM 定义中的全部三个组件(Sandbox、Endpoint、Network)。
Libnetwork 的核心职责
功能 | 说明 |
---|---|
创建 / 删除网络 | 提供 API 创建自定义网络(如 docker network create) |
分配网络资源 | 包括 IP 地址、MAC 地址、网段、路由等 |
管理 Endpoint | 管理容器与网络的连接接口 |
维护 Sandbox | 容器的网络堆栈和配置 |
支持多网络驱动 | 内置多个驱动,支持外部插件 |
与 Docker Engine 集成 | Docker 调用 Libnetwork 来完成网络配置 |
⭐ 3. 网络驱动 Driver
- Driver 是 Libnetwork 和底层网络实现之间的桥梁,负责具体网络功能的实现(真正执行容器间的网络连接逻辑、接口配置和数据转发机制)。
- Driver 决定了:容器如何关联、容器如何访问外部网络、网络隔离方式、IP / MAC 分配策略、是否支持跨主机通信等。
Docker 默认内置的网络驱动
驱动类型 | 说明 |
---|---|
Bridge | 默认网络驱动,基于 Linux 网桥实现容器间的通信 |
Host | 容器与宿主机共享网络命名空间,性能高但无隔离 |
Overlay | 跨主机通信驱动,通过 VXLAN 隧道构建虚拟网络 |
MacVLan | 为容器分配宿主机的物理网卡 IP,直接和外部通信 |
IPVLan | 为容器分配宿主机的 IP,共享 MAC 地址 |
None | 容器无网络,只保留 loopback(本地环回),完全隔离网络 |
🌈 三、常见网络类型介绍
⭐ 1. 桥接网络 bridge
- Docker 默认使用的网络类型,每创建一个容器,Docker 就会自动将其连接到默认的 bridge 网络。
- bridge 驱动会在 Docker 管理的主机上创建一个 Linux 虚拟网桥(docker0)。默认情况下,网桥上的容器可以相互通信,也可以通过 bridge 驱动程序配置,来实现对外部容器的访问。
- 使用场景:当需要多个容器在同一个 Docker 主机上通信时,桥接网络是最佳选择。
⭐ 2. 主机网络 host
- 对于独立容器,移除了容器和 Docker 宿主机之间的网络隔离(容器不会获得自己的网络命名空间,而是直接使用宿主机的网络(IP 和 端口))。
- 由于主机网络会让容器直接使用主机的端口,可能会造成端口冲突。
- 使用场景:对于某些性能要求高,或需要直接使用主机网络的场景,可以使用主机网络。
⭐ 3. 容器网络 container
- 容器共享另一个容器的网络命名空间(指定新创建的容器和引进存在的一个容器共享一个网络)。
- 新创建的容器不会创建自己的网卡、配置自己的 IP,而是和一个指定的容器共享 iP、端口等,两个容器只有网络方面是共享的,其他诸如文件系统、进程列表啥的还是隔离的。
- 使用场景:多个容器之间需要紧密协作时(如主应用和辅助容器共享网络)可以使用该网络类型。
⭐ 4. 禁用网络 none
- Docker 容器拥有自己的 Network Namespace,但并不会为容器进行任何网络配置(没有网卡、IP、路由等信息)。容器完全网络隔离,无法访问其他容器或外部网络。
- 使用场景:需要极高的安全隔离性,或完全自定义网络配置。
⭐ 5. 覆盖网络 overlay
- 借助 Docker 集群模块(Docker Swarm)搭建的跨 Docker Daemon 网络。它将多个 Docker 守护进程连接在一起,使得集群服务能够相互通信。
- 使用场景:当需要运行在不同 Docker 宿主机上的容器进行通信,或当多个应用程序使用集群服务协同工作时,覆盖网络是最佳选择。
🌈 四、Docker 网络管理命令
命令 | 别名 | 功能 |
---|---|---|
docker network create | 创建自定义网络 | |
docker network inspect | 查看网络详情 | |
docker network connect | 将容器连接到网络 | |
docker network disconnect | 将容器从网络断开 | |
docker network prune | 删除所有不使用的网络 | |
docker network ls | docker network list | 列出网络 |
docker network rm | docker network remove | 指定删除 1 / n 个网络 |
⭐ 1. docker network create
- 创建一个自定义网络,可指定驱动类型、子网、网关等。
1. 基础语法
docker network create [options] network_name
options 的可选项 | 功能 |
---|---|
-d 或 --driver | 指定网络驱动类型 |
--subnet | 自定义子网 |
--gateway | 指定网关地址 |
--ipv6 | 启用 ipv6 |
2. 使用示例
- 创建一个名为 my_bridge1 的桥接网络。
docker network create --driver bridge my_bridge1
- 创建一个名为 my_bridge2 的桥接网络,并将其子网设置为 192.168.10.0/24,以及网关设置为 192.168.10.1。
docker network create --subnet 192.168.10.0/24 --gateway 192.168.10.1 -d bridge my_bridge2
⭐ 2. docker network inspect
- 查看指定网络的详细信息(容器成员、子网、网关等)。
1. 基础语法
docker network inspect [options] network_name [network_name...]
options 的可选项 | 功能 |
---|---|
-f 或 --format | 指定信息的输出格式 |
2. 使用示例
- 查看 my_bridge2 这个网络的详细信息。
docker network inspect my_bridge2
⭐ 3. docker network connect
- 用于将容器连接到指定网络。可以按名称或 IP 来连接容器。一旦连接,容器就可以和处于同一网络中的其他容器进行通信。
1. 基础语法
docker network connect [options] network_name container_name
options 的可选项 | 功能 |
---|---|
--ip | 指定 IP 地址 |
--ip6 | 指定 IPv6 地址 |
2. 使用示例
- 将正在运行的 CoffeeCat 连接到 my_bridge1 这个网络。
docker network connect my_bridge1 CoffeeCat
- 启动容器时,将容器连接到指定网络。
# 还可以使用 docker run --network=<network_name> 选项启动容器并立即将其连接到网络。
docker container run -itd --network=my_bridge1 nginx:latest
- 可以指定要分配给容器网络接口的 IP 地址。
docker network connect --ip 192.168.10.224 my_bridge2 CoffeeCat
⭐ 4. docker network disconnect
- 用于将指定容器从指定网络中断开。
1. 基础语法
docker network disconnect [options] network_name container_name
options 的可选项 | 功能 |
---|---|
-f | 强制断开 |
2. 使用示例
- 断开 CoffeeCat 容器与 my_bridge1 网络的连接。
docker network disconnect my_bridge1 CoffeeCat
⭐ 5. docker network prune
- 删除所有不使用(无容器连接)的网路。
1. 基础语法
docker network prune [options]
options 的可选项 | 功能 |
---|---|
-f 或 --force | 跳过确认提示 |
2. 使用示例
docker network prune
⭐ 6. docker network ls
- 列出所有的网络(包括默认网络和用户创建的网络)。
1. 基础语法
docker network ls [options]
options 的可选项 | 功能 |
---|---|
-f 或 --filter | 按照指定条件进行过滤 |
-fromat | 按照指定格式打印内容 |
--no-trunc | 不截断信息 |
-q 或 --quiet | 只显示网络 ID |
2. 使用示例
- 列出所有的网络
docker network ls
- 只显示网络名称中包含 bridge 的网络。
docker network ls -f name=bridge
⭐ 7. docker network rm
- 用于删除指定的 1 / n 个网络(前提是被删除的网络未被容器使用)。
1. 基础语法
docker network rm network_name [network_name...]
2. 使用示例
- 删除 my_bridge2 网络。
# 将 my_bridge2 网络与 CoffeeCat 容器断开连接
docker network disconnect my_bridge2 CoffeeCat
# 删除 my_bridge2 网络
docker network rm my_bridge2