【Docker 07】Network - 网络

发布于:2025-06-18 ⋅ 阅读:(21) ⋅ 点赞:(0)

🌈 一、Docker 为什么需要网络管理

  • 容器本质上是隔离的独立运行环境,但在实际应用时,容器之间、容器与宿主机、容器与外界必须进行通信,这就需要用到网络管理。
  1. 容器之间需要通信。
  2. 容器需要对外提供服务。
  3. 实现容器和宿主机的安全隔离。
  4. 容器可能根本就不需要网络。

🌈 二、Docker 网络架构简介

  • Docker 容器网络是未应用程序所创造的虚拟环境的一部分,它可以让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等与网络有关的模块。
  • Docker 为了实现容器网络,主要采用的网络架构由 CNMLibnetworkDriver 这三部分组成。

⭐ 1. 容器网络模型 CNM

  • 容器网络模型(CNM:Container Network Model)规定了 Docker 网络的基础组成要素:SandboxEndpointNetwork

image-20250616164601362

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 宿主机上的容器进行通信,或当多个应用程序使用集群服务协同工作时,覆盖网络是最佳选择。

image-20250617094232335

🌈 四、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. 使用示例

  1. 创建一个名为 my_bridge1 的桥接网络。
docker network create --driver bridge my_bridge1

image-20250617104430853

  1. 创建一个名为 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

image-20250617104626324

⭐ 2. docker network inspect

  • 查看指定网络的详细信息(容器成员、子网、网关等)。

1. 基础语法

docker network inspect [options] network_name [network_name...]
options 的可选项 功能
-f 或 --format 指定信息的输出格式

2. 使用示例

  • 查看 my_bridge2 这个网络的详细信息。
docker network inspect my_bridge2

image-20250617105604652

⭐ 3. docker network connect

  • 用于将容器连接到指定网络。可以按名称或 IP 来连接容器。一旦连接,容器就可以和处于同一网络中的其他容器进行通信。

1. 基础语法

docker network connect [options] network_name container_name
options 的可选项 功能
--ip 指定 IP 地址
--ip6 指定 IPv6 地址

2. 使用示例

  1. 将正在运行的 CoffeeCat 连接到 my_bridge1 这个网络。
docker network connect my_bridge1 CoffeeCat

image-20250617110600781

  1. 启动容器时,将容器连接到指定网络。
# 还可以使用 docker run --network=<network_name> 选项启动容器并立即将其连接到网络。
docker container run -itd --network=my_bridge1 nginx:latest

image-20250617111355280

  1. 可以指定要分配给容器网络接口的 IP 地址。
docker network connect --ip 192.168.10.224 my_bridge2 CoffeeCat

image-20250617111746923

⭐ 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. 使用示例

  1. 列出所有的网络
docker network ls

image-20250617121116247

  1. 只显示网络名称中包含 bridge 的网络。
docker network ls -f name=bridge

image-20250617121028361

⭐ 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

image-20250617150203628


网站公告

今日签到

点亮在社区的每一天
去签到