- 文章信息 -

Docker技术概论(5):Docker网络-LMLPHP




1. 概述

Docker 网络是 Docker 容器技术的一个核心组成部分,它负责管理容器之间以及容器与外部世界之间的通信。Docker 网络的设计允许用户高效地配置和管理容器的网络连接,支持容器之间的隔离和通信,同时还能提供必要的安全性和可扩展性。

Docker 中,每个容器都可以被视为一个独立的网络实体,具有自己的 IP 地址、网络接口和路由规则。Docker 网络为这些容器提供了各种连接选项,包括桥接、覆盖、主机网络等模式,使得容器的部署和管理更加灵活。

1.1 Docker 网络类型

  1. 桥接网络(Bridge Network):这是 Docker 容器默认使用的网络类型。每个独立的容器都会连接到一个内部网络的私有网桥。
  2. 主机网络(Host Network):在这种模式下,容器共享主机的网络命名空间,直接使用主机的网络接口。
  3. 覆盖网络(Overlay Network):用于 Docker Swarm 集群中,支持不同 Docker 守护进程上的容器之间的网络连接。
  4. Macvlan 网络:使得容器可以直接映射到物理网络,它们拥有独立的 MAC 地址。
  5. None 网络:在这种模式下,容器有自己的网络命名空间,但不配置任何网络接口,通常用于需要手动配置网络的场景。

1.2 网络驱动

Docker 网络驱动负责实现不同的网络类型。Docker 提供了多种内置的网络驱动,如 bridgeoverlayhostmacvlan。用户也可以安装和使用第三方网络驱动。

1.3 容器网络模式

  • 桥接模式:默认模式,容器拥有独立的网络命名空间。
  • 主机模式:容器共享主机的网络堆栈,不进行网络隔离。
  • 无网络模式:容器有自己的网络堆栈,但不配置任何网络接口。
  • 覆盖模式:在 Docker Swarm 环境中使用,支持跨多个 Docker 主机的容器通信。

1.4 网络配置和管理

Docker 网络的配置和管理通常通过 Docker 命令行界面进行。例如,你可以使用 docker network create 创建新网络,docker network ls 列出网络,docker network connectdocker network disconnect 连接或断开容器与网络的连接。

1.5 安全性和隔离

Docker 网络提供了容器之间的隔离机制,增加了安全性。例如,位于不同网络的容器默认无法相互通信,除非显式配置网络规则来允许这种通信。

Docker 容器在网络方面的一些概念和虚拟机是相似的,VMWare虚拟机中就有专门的UI页面来进行相关设置,可以类比理解:

Docker技术概论(5):Docker网络-LMLPHP

接下来,详细介绍几种默认的Docker网络驱动。

2. 桥接网络(bridge)

2.1 基本概念

类似于 VMware 虚拟机中的 “桥接 模式”,Docker 的桥接网络(bridge network)是 Docker 容器使用的默认网络模式。在这种模式下,Docker 宿主机会创建一个虚拟的网络桥接,允许容器通过这个桥接与外部网络通信。这种模式为每个容器提供了与主机隔离的网络环境,容器之间可以相互通信,同时也能与外部网络进行交互。

Docker 中,桥接网络提供了与 VMware 的桥接模式类似的功能,允许容器直接连接到物理网络,并且具有独立的 IP 地址。同时,Docker 的端口映射功能则在某种程度上类似于 VMwareNAT 模式,它允许外部访问映射到宿主机端口的容器服务。Docker 网络的这些特性使得它非常适合于容器化环境,为容器提供了灵活性和隔离性。

2.2 工作原理

Docker 中启动容器时,如果没有指定网络模式,它默认连接到 Docker 主机上的一个桥接网络。这个桥接网络起初是空的,当容器连接到它时,Docker 会为每个容器分配一个 IP 地址和一个网络接口,并将这个接口连接到虚拟桥接上。

Docker 的桥接网络通常使用 NAT(网络地址转换)来连接到物理网络,使得容器能够通过宿主机的 IP 地址访问外部网络。

2.3 创建和管理

虽然 Docker 默认创建了一个名为 bridge 的桥接网络,但用户也可以创建自定义的桥接网络。自定义桥接网络提供了更好的隔离和网络配置选项。

1.创建自定义桥接网络

使用以下命令创建一个新的桥接网络:

docker network create --driver bridge my_bridge_network

这与 VMware 虚拟机的多个网络适配器类似。

2.连接容器到桥接网络

在启动容器时,可以使用 --network 选项指定容器连接到特定的桥接网络:

docker run -d --name my_container --network my_bridge_network my_image

这类似于 VMware 中为虚拟机指定特定的网络适配器。

3.查看网络信息

要查看 Docker 网络的详细信息,包括哪些容器连接到特定网络,可以使用以下命令:

docker network inspect my_bridge_network

类似于在 VMware 中查看虚拟网络的详细配置。

2.4 网络隔离和通信

桥接网络不仅为容器提供了与宿主机的网络隔离,还可以在容器之间建立隔离的网络环境。只有连接到同一桥接网络的容器才能相互通信,这为构建安全的多容器应用提供了基础。

2.5 端口映射信

桥接网络模式中,可以通过端口映射(Port Mapping)将容器内的端口映射到宿主机的端口,从而使外部网络能够访问容器内的应用。例如,如果你的容器内运行了一个 Web 服务器,监听容器的 80 端口,你可以将其映射到宿主机的 8080 端口:

docker run -d -p 8080:80 my_web_server_image

Docker 的桥接网络为容器提供了一个简单有效的方式来与外部网络进行交互,同时保持了网络隔离。通过创建自定义桥接网络,用户可以实现更细粒度的网络管理和隔离策略。桥接网络是 Docker 网络中最常用的一种模式,适用于大多数标准的容器部署场景。

3. 主机网络(host)

3.1 基本概念

Docker 中,主机网络(host network)模式允许容器共享宿主机的网络命名空间。这意味着容器不会像在桥接或覆盖网络模式中那样获得自己的网络接口,而是直接使用宿主机的网络接口。当容器运行在主机网络模式下时,它能够无障碍地访问外部网络,同时也能够更高效地进行网络通信,因为不需要通过 Docker 的网络堆栈来转发数据。

3.2 工作原理

主机网络模式下,容器将不会获得独立的 IP 地址。容器的网络堆栈将直接映射到宿主机上,容器内的网络服务可以直接绑定到宿主机的 IP 地址和端口上。这种模式通常用于需要进行大量网络操作或需要提供高性能网络服务的场景。

3.3 使用场景

  • 性能敏感型应用:当容器化应用需要最大化网络性能时,使用主机网络是一个好选择。因为它消除了网络虚拟化带来的额外开销。
  • 端口冲突:在主机网络模式下,容器可以直接使用宿主机的端口,避免了端口映射可能带来的端口冲突问题。
  • 网络监控和管理:对于需要进行网络监控和管理的工具,主机网络模式能够提供更广泛的网络可视性和控制能力。

3.4 如何使用

要在 Docker 中使用主机网络模式,可以在运行容器时使用 --network host 选项。例如:

docker run -d --network host --name my_host_network_container my_image

这个命令会启动一个容器,它将直接使用宿主机的网络堆栈。

5 注意事项

  • 安全风险:使用主机网络模式会降低网络隔离级别,可能会增加安全风险。需要仔细管理容器对宿主机网络资源的访问。
  • 端口管理:因为容器可以直接绑定到宿主机的端口,所以必须确保容器不会尝试使用已被宿主机其他服务占用的端口。
  • 跨主机通信:主机网络模式不适用于需要跨多个宿主机通信的容器,这种情况下更适合使用覆盖(overlay)网络模式。

4. 覆盖网络(Overlay Network)

4.1 基本概念

覆盖网络(Overlay Network)是 Docker 的一个高级网络类型,主要用于 Docker Swarm 集群环境中。它允许不同 Docker 主机上的容器相互通信,无论它们的物理位置如何。覆盖网络通过在宿主机之间创建一个虚拟网络层,来连接分布在不同节点上的容器。

4.2 工作原理

覆盖网络使用网络驱动(如 VXLAN)在宿主机之间建立一个虚拟网络。这个网络工作在现有的物理网络之上,容器之间的通信会被封装并通过这个虚拟网络传输。当数据包到达目的地后,它会被解封装并传递给目标容器。这种方式使得容器间能够透明地通信,就像它们在同一个网络中一样。

4.3 使用场景

  • 多主机容器部署:当你需要在多个 Docker 主机上部署容器,并且这些容器需要相互通信时,覆盖网络是理想的选择。
  • Docker Swarm 集群:在 Docker Swarm 环境中,覆盖网络允许不同节点上的服务实例之间进行通信,非常适合微服务架构。
  • 跨主机负载均衡:覆盖网络支持跨多个宿主机的负载均衡,使得服务可以更加灵活地扩展和管理。

4.4 如何使用

要在 Docker Swarm 环境中创建一个覆盖网络,首先确保你的 Docker 环境已经初始化为 Swarm 模式,然后使用以下命令创建覆盖网络:

docker network create -d overlay my_overlay_network

创建了覆盖网络后,你可以在部署服务时指定使用这个网络:

docker service create --name my_service --network my_overlay_network my_image

4.5 注意事项

  • 网络性能:由于覆盖网络中存在数据封装和解封装的过程,可能会对网络性能造成一定影响。
  • 安全性Docker 提供了网络加密选项来保护覆盖网络中的数据传输。
  • 网络管理:管理覆盖网络可能需要对 Docker Swarm 集群的管理和网络原理有一定的了解。

5 Macvlan 网络

5.1 基本概念

Macvlan 网络是 Docker 提供的另一种网络类型,允许容器直接连接到物理网络。每个使用 Macvlan 网络的容器都会被分配一个独立的 MAC 地址,使其在网络上表现得就像是一个物理设备一样。这种网络类型适用于需要容器直接参与物理网络的场景,例如,当容器需要有自己的 IP 地址、或需要绕过 Docker 网络堆栈的复杂性时。

5.2 工作原理

Macvlan 网络通过创建一个或多个虚拟网络接口(Macvlan 接口)来工作,这些接口附加到宿主机的物理网络接口上。每个接口都有自己的 MAC 地址,容器通过这些虚拟接口与外部网络进行通信。这样,容器可以直接出现在物理网络上,而不是通过 Docker 主机的网络堆栈。

5.3 使用场景

  • 需要直接网络访问:对于需要绕过 NAT、或需要与外部网络中的其他设备直接通信的容器,Macvlan 网络是一个理想的选择。
  • 遗留系统集成:在一些遗留系统或需要直接网络访问的环境中,Macvlan 网络可以帮助容器更好地集成进这些环境中。
  • 网络性能:由于容器直接连接到物理网络,Macvlan 可以提供更好的网络性能,减少虚拟化带来的开销。

5.4 如何使用

创建 Macvlan 网络的基本步骤如下:

  1. 创建 Macvlan 网络

    docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my_macvlan_net
    

    这个命令会在宿主机的 eth0 网络接口上创建一个新的 Macvlan 网络,设置了子网和网关。

  2. 运行容器并连接到 Macvlan 网络

    docker run --network my_macvlan_net --name my_container my_image
    

    这个命令启动一个容器,并将其连接到刚刚创建的 Macvlan 网络。

5.5 注意事项

  • 网络隔离:使用 Macvlan 网络时,容器的网络隔离级别较低,容器直接暴露在物理网络上。
  • 路由和防火墙配置:可能需要在网络设备或宿主机上进行额外的路由和防火墙配置,以确保网络通信的正确性和安全性。
  • 宿主机通信:默认情况下,使用 Macvlan 的容器可能无法与其宿主机进行直接通信。这可能需要额外的网络配置来解决。

6 结论

Docker 网络是容器化技术中不可或缺的一部分,它不仅提供了容器之间以及容器与外部世界之间通信的能力,还支持了高度的网络隔离和安全性。通过不同的网络类型和配置,Docker 能够满足各种应用场景的需求,从简单的单机部署到复杂的多主机、跨主机的集群环境。

桥接网络作为默认的网络类型,适用于大多数标准部署场景,提供了容器与外部网络的连接以及容器之间的隔离。主机网络模式提供了最高的网络性能,适用于性能敏感型应用。覆盖网络支持跨主机的容器通信,是在 Docker Swarm 集群中运行分布式应用的理想选择。Macvlan 网络则允许容器直接连接到物理网络,适用于需要直接网络访问或遗留系统集成的场景。

每种网络类型都有其适用场景和注意事项。选择合适的网络类型和配置,可以帮助开发者和运维人员构建高效、安全且易于管理的容器化应用。同时,Docker 的网络配置和管理工具也提供了灵活性和便利性,使得网络管理变得更加简单。

Docker 网络提供了强大而灵活的网络功能,支持各种应用部署和运行模式。通过合理选择和配置网络类型,可以最大化地发挥 Docker 容器的潜力,构建出高性能、安全且易于管理的容器化应用。


如果你对Docker技术还不是很了解,可以考虑从本系列第一篇文章开始阅读:《Docker技术概论(1):Docker与虚拟化技术比较》

如果你觉得本文对你有所帮助,请在文章处点赞支持。 虽然这不会使我从中获得经济利益,但是你的赞是继续分享的巨大动力&^_^&

03-06 20:14