Skip to main content

4.Docker网络

Docker 提供了灵活且强大的网络功能,以支持容器之间的通信、与主机的通信以及容器与外部服务的连接。

网络命名空间

网络命名空间(network namespace)是一种隔离网络资源的机制。每个网络命名空间都拥有自己的网络接口、路由表、防火墙规则等网络资源,从而实现了网络的隔离。

Docker 利用了 Linux 内核提供的网络命名空间功能,以及其他网络功能来创建容器间的隔离和通信。

特点和功能

  • 隔离性 : 每个容器都有自己独立的网络命名空间,这意味着容器之间的网络资源是相互隔离的。例如,容器 A 中的网络接口和路由表与容器 B 中的完全独立,它们互不影响。
  • 网络接口 : 每个网络命名空间都包含一个独立的网络接口。在 Docker 中,这个接口通常是容器的虚拟网桥(veth pair),其中一个端口连接到容器内部,另一个端口连接到宿主机的网桥或路由器上。
  • 路由表 : 每个网络命名空间都有自己的路由表。这意味着容器可以拥有不同的路由规则,可以通过不同的网关访问外部网络。
  • 防火墙规则 : 每个网络命名空间都有自己的防火墙规则。Docker 使用 iptables 实现了容器间的网络隔离和访问控制,通过防火墙规则限制容器间的通信。
  • 网络命名空间的创建 : Docker 在创建容器时会为其创建一个独立的网络命名空间。通过 ip netns 命令可以查看当前系统中的网络命名空间列表。
  • 容器间通信 : 容器间的通信是通过 Linux 内核提供的网络桥接技术实现的。当容器连接到同一个网络命名空间时,它们可以通过网络进行通信,就像同一局域网内的设备一样。

Docker 网络模型

Docker 使用一种基于插件的网络模型,允许用户创建和管理不同类型的网络。这些网络可以是桥接网络(Bridge Network)、主机网络(Host Network)、覆盖网络(Overlay Network)等。

桥接网络(Bridge Network)

桥接网络是 Docker 默认的网络模型。在桥接网络中,每个容器分配一个唯一的 IP 地址,并且容器可以通过容器名称进行相互通信。此外,桥接网络可以通过主机的 NAT(Network Address Translation)机制访问外部网络。

示例:

# 创建一个桥接网络
docker network create my-bridge-network

# 运行容器并连接到桥接网络
docker run --name my-container --network my-bridge-network -d nginx

主机网络(Host Network)

使用主机网络模式,容器与主机共享网络命名空间,直接使用主机的网络接口。这样容器就能够直接使用主机的网络,无需进行端口映射。

示例:

# 运行容器并使用主机网络
docker run --name my-container --network host -d nginx

覆盖网络(Overlay Network)

Overlay 网络利用了 Docker 中的网络驱动程序和网络插件的概念,通过使用 VXLAN 或者类似技术在不同的 Docker 主机之间创建虚拟网络,使得这些主机上的容器能够像在同一局域网内一样进行通信。这种网络技术被称为覆盖网络(Overlay Network)。

覆盖网络允许在不同的 Docker 主机之间创建跨主机的网络。这对于容器编排工具(如 Docker Swarm 和 Kubernetes)中的多主机部署非常有用。

示例:

创建自定义网络:

# 创建一个自定义网络时
docker network create <network-name>

# 指定自定义网络的子网和网关
docker network create --subnet=<subnet> --gateway=<gateway> <network-name>

# 自定义网络可以通过以下命令连接到容器
docker run --network=<network-name> ...

示例:

创建Overlay(覆盖网络)类型的自定义网络

# 创建一个覆盖网络
docker network create --driver overlay my-overlay-network # 指定网络驱动程序为 overlay

# 在 Swarm 集群中运行容器并连接到覆盖网络
docker service create --name my-service --network my-overlay-network nginx

网路网络创建和使用

用户定义的桥接网络

用户可以创建自己的桥接网络,将容器连接到该网络,并使用容器名称进行通信。这使得用户可以更灵活地管理容器之间的网络关系。

# 创建用户定义的桥接网络
docker network create my-custom-bridge

# 运行容器并连接到用户定义的桥接网络
docker run --name container-1 --network my-custom-bridge -d nginx
docker run --name container-2 --network my-custom-bridge -d nginx

链接容器

在 Docker 中,可以使用 --link 选项将一个容器连接到另一个容器。这种方式已经过时,推荐使用用户定义的网络来实现容器间的通信。

# 运行容器并使用链接
docker run --name container-1 -d nginx
docker run --name container-2 --link container-1 -d nginx

生产环境一般不这么使用,此处仅用演示。