docker网络详解

docker网络

在容器化技术中,Docker 提供了一个强大的网络功能,让容器能够高效、灵活地进行通信。

Docker 网络(Docker Networking)是 Docker 容器与外部世界、以及容器之间进行数据交换的基础设施。Docker 网络使得容器能够共享主机网络、通过端口映射与外部系统通信,甚至可以创建隔离的网络环境来提高安全性。

Docker 支持多种网络模式,允许用户根据具体需求选择最合适的网络结构。Docker 提供了四种主要的网络模式 bridge(桥接网络)host(主机网络)none(无网络)container(容器共享网络)。每种模式都有其独特的特性和适用场景,接下来,我们将详细讲解这四种网络模式,帮助你理解它们的工作原理、优缺点以及使用方法。

bridge(桥接网络)

首先是bridge模式,这是docker默认的网络模式。

使用docker创建一个bridge 模式的容器命令格式如下:

docker run -it -p 8080:80 docker-test

-p 8080:80 表示将容器的80端口映射到主机的8080端口。

bridge 模式称为网桥模式,首先 Docker 会在主机上创建一个名为 docker0 的虚拟网桥,每当创建一个新的容器时,容器都会通过 docker0 与主机的网络连接,docker0 相当于网桥。

在docker run 命令中之后,执行 ifconfig 命令,可以看到 docker0 网卡的 IP 地址。

docker0: flags=4163  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:a5ff:fe8e:31f1  prefixlen 64  scopeid 0x20
        ether 02:42:a5:8e:31:f1  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5  bytes 526 (526.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

使用 bridge 模式新创建的容器,其内部都有一个虚拟网卡,名为 eth0,容器之间可以通过 172.17.x.x 相互访问。

我们可以通过docker exec -it /bin/bash进入容器,使用 ifconfig 命令可以看到 容器 的 IP 地址。

在bridge模式中,容器之间可以直接通过 IP 地址相互访问,但是容器与外部的连接需要通过端口映射(如-p 8080:80)来完成。

bridge模式的网络架构如下图所示:

+------------------+        +------------------+
| Container 1      |        | Container 2      |
| IP: 172.17.0.2   |        | IP: 172.17.0.3   |
+------------------+        +------------------+
        |                        |
        +------------------------+
                    |
                Docker Bridge(docker0)
                IP : 172.17.0.1
                    |
              +-----------------+
              |    Host OS      |
              +-----------------+

bridge 模式

优点:

  • 简单,容器之间可以直接通过 IP 地址相互访问
  • 提供了较好的隔离性,容器之间的网络连接由 docker0 网桥管理,网络管理更加灵活。

缺点

  • 虽然 bridge 模式提供了相对较高的隔离性,但由于 NAT 转发存在额外的性能开销,可能会影响到网络性能,特别是在高吞吐量的场景中。
  • 在端口映射配置不当的情况下,可能会导致端口冲突

host(主机网络)

在host模式下,容器直接使用主机的网络栈。容器不会拥有自己的 IP 地址,而是和主机共享相同的网络接口。使用这种模式时,容器内的应用可以直接使用主机的 IP 地址,这对于需要极高网络性能的应用(例如高吞吐量网络应用)会有帮助,但会导致端口冲突的问题。

host 模式的网络架构如下图所示:

+--------------------+
|      Host OS       |
+--------------------+
       |         |
       |         |
+------v---------v----------+
| Container 1   IP: Host IP |
+---------------------------+

host的模式的创建方法:docker run -it --net=host docker-test。通过--net=host参数来指定容器使用主机网络。可以在容器内通过ifconfig命令查看到主机的IP地址。

host 模式的优缺点:
优点

  • 高性能:容器直接使用主机的网络栈,省去了网络地址转换(NAT)等额外开销,适合高吞吐量的应用场景,例如实时音视频处理等。
  • 更直接的网络访问:容器中的应用可以直接访问主机的网络资源和服务,使得某些需要与主机紧密交互的应用更易实现。

缺点

  • 端口冲突:因为容器共享主机的 IP 地址,容器内的服务端口直接暴露在主机网络上,因此与主机上的其他服务或其他容器可能发生端口冲突。
  • 隔离性较差:host 模式下容器与主机的网络环境没有隔离,不适合对网络隔离要求较高的应用,可能会带来一定的安全风险。
  • 兼容性问题:在某些操作系统或云平台上(如 Windows 或 Mac 的 Docker 桌面版),host 模式可能不完全兼容或不可用,因此使用受限。

none(无网络)

在 None 模式下,容器没有任何网络接口。这种模式通常用于隔离性较强的场景,比如需要完全控制网络环境或者使用其他特殊网络插件的场景。None 模式的容器默认只有 lo 回环接口,而没有外部网络连接。

none 模式的网络架构如下图所示:

+-----------------+
|  Container 1    |
|   (No Network)  |
+-----------------+

none的模式的创建方法: docker run -it --net=none docker-test。通过--net=none参数来指定容器使用无网络。

none 模式的优缺点:
优点

  • 高度隔离:none 模式完全禁用了容器的网络连接,使容器与外部网络隔离,适合对网络安全和隔离性要求极高的场景。
  • 便于自定义网络配置:如果需要在容器中配置自定义的网络环境或使用其他网络插件进行特殊设置,none 模式提供了一个干净的起点。

缺点

  • 缺少外部连接:容器无法直接访问主机或外部网络,也无法与其他容器通信,限制了容器的交互能力。
  • 较少使用场景:由于缺乏网络连接,none 模式仅适用于少数特殊应用,通常需要借助其他网络插件或手动配置来满足需求。

container(容器共享网络)

在 container 模式下,多个容器共享同一个网络栈。通常,先启动一个基础容器(比如容器 A),并为它配置网络(例如使用默认的 bridge 模式)。随后启动的其他容器(如容器 B、C、D 等)可以通过 --network container: 参数连接到容器 A 的网络环境,从而共享容器 A 的网络栈。

在这种模式下,所有连接到同一网络栈的容器共享相同的 IP 地址和端口空间。因此,容器 B、C 和 D 将无法拥有自己的独立 IP 地址或端口,它们会与容器 A 共用相同的 IP 和端口。这意味着容器之间可以直接通过 localhost 或者 127.0.0.1 进行通信,类似于运行在同一主机上的多个进程。

以下是 container 模式的网络架构图:

+------------------------+
|       Host OS          |
+------------------------+
           |
   +-------v--------+
   | Container A    |  <-- 网络栈:IP 172.17.0.2
   |   (Bridge)     |
   +----------------+
           |
   +-------v--------+
   | Container B    |  <-- 共享网络:IP 172.17.0.2
   +----------------+
           |
   +-------v--------+
   | Container C    |  <-- 共享网络:IP 172.17.0.2
   +----------------+
           |
   +-------v--------+
   | Container D    |  <-- 共享网络:IP 172.17.0.2
   +----------------+

container 模式的优缺点:

优点

  • 高效通信:容器间通信直接通过 localhost 实现,不需要额外的网络配置。
  • 简化网络设置:适合需要高度紧密耦合的多容器应用场景,例如微服务间需要低延迟的通信。
    缺点
  • 端口冲突:共享同一 IP 和端口空间,容易导致端口冲突。
  • 隔离性差:各容器没有独立的网络环境,对安全隔离要求较高的场景不适用。

总结

Container、Bridge、Host、None 四种网络模式,是 Docker 网络的四种主要模式。每种模式都有其独特的特性和适用场景,在不同的场景下选择不同的模式,可以帮助我们更好地管理容器的网络环境。
参考资料:了解docker网络

创作不易,转载请注明出处

你可能感兴趣的:(docker,docker,网络,eureka)