×

Docker `network_mode` 选项教程

2024-04-03 12:26:34 Falcon

介绍

在 Docker 的世界里,容器间的网络连接是通过不同的网络模式来管理的。其中,network_mode 是一个在 Docker 运行时以及 docker-compose.yml 文件中配置网络行为的关键选项。理解 network_mode 如何工作有助于您更有效地设计和运行 Docker 容器。

network_mode 的作用

network_mode 指定一个容器的网络配置,控制着容器与其他容器或网络的交互方式。这个选项可以设为以下值:

  • bridge: 默认网络模式,容器将会创建在一个隔离的网络环境中但可以与其他容器和宿主机通信。
  • host: 容器将使用宿主机的网络栈,不会独立于宿主机分配 IP,适用于需要处理大量流量的容器。
  • none: 容器将没有网络接入。
  • service:<name_or_id>: 容器将共享指定服务容器的网络环境,仅在 Docker Compose 中有效。
  • container:<name_or_id>: 容器将共享指定容器的网络环境,和 service:<name_or_id> 类似,但适用于 Docker CLI。

docker-compose.yml 中使用 network_mode

docker-compose.yml 文件中,network_mode 的使用可以让同一个 docker-compose.yml 文件中定义的服务共享网络栈。例如:

version: '3'
services:
  my-service:
    image: my-image
    network_mode: "service:other_service"

在上面的例子中,my-service 将会和名为 other_service 的服务共享网络栈。值得注意的是,在同一个 docker-compose.yml 文件中的服务才能使用这种模式。

跨不同 docker-compose.yml 文件共享网络

通常情况下,跨不同的 docker-compose.yml 文件共享网络栈是不支持的,因为每个 docker-compose.yml 定义的服务相互隔离。但您可以采取以下方法实现类似的效果:

使用外部网络

您可以创建一个外部网络,并让所有需要共享网络的服务都连接到这个网络上。比如,您需要先创建一个网络:

docker network create shared_network

然后,在所有需要使用这个网络的 docker-compose 文件中进行配置:

version: '3'
services:
  my-service:
    image: my-image
    networks:
      - shared_network
networks:
  shared_network:
    external: true

使用 Docker CLI 模拟 network_mode: container

有时您可能想要在不同的 docker-compose 项目之间共享一个服务的网络栈。可以手动运行容器,并使用 --network "container:<container_name>" 参数:

docker run -d --name my-service --network "container:other_container_name" my-image

请记住,这种方式需小心处理,它绕过了 Compose 的默认网络管理。

总结

理解和使用 network_mode 选项能让您更精准地控制容器的网络行为,不过它也增加了配置的复杂性。在实施时,请确保您完全了解 Docker 网络的工作原理和您所需的网络安全策略。 在讨论 network_mode 的教程中,我们可以引入之前提到的 tailscale 的用例来为读者提供一个实际的案例分析。

扩展:在 docker-compose.yml 中使用 network_mode 的案例分析 - Tailscale

使用场景

假设您正在运行一个服务 ts-webserver1,该服务通过 Tailscale(一种基于 WireGuard 协议的简化 VPN 服务)构建了一个安全的网络连接。现在,您希望另一个服务 some-other-service 能够加入这个网络,并且能像 ts-webserver1 那样共享同一个网络栈。

配置步骤

您可以在 docker-compose.yml 文件中通过设置 network_mode 来配置这样的网络连接。以下是配置示例:

  1. 对于 ts-webserver1 服务,首先确认它已经运行在 Tailscale 网络中,并在其 docker-compose.yml 文件中按如下方式配置:
version: '3'
services:
  ts-webserver1:
    image: your-webserver-image
    container_name: ts-webserver1_container
    # 使用host模式以确保可以通过Tailscale进行通信
    network_mode: "host"
    # 其他相关配置...

这里 network_mode 被设为 host,这意味着 ts-webserver1 将使用 Docker 宿主机的网络栈,并且可以直接通过 Tailscale 提供的 VPN 连接进行通信。 2. 接下来,要让 some-other-service 服务共享 ts-webserver1 的网络栈,您需要在相同的 docker-compose.yml 文件中,为 some-other-service 也设置 network_mode。例如:

  some-other-service:
    image: your-other-service-image
    # 通过指定 service:ts-webserver1 和 container_name,共享 ts-webserver1 的网络栈
    network_mode: "service:ts-webserver1"
    # 其他相关配置...

结果

上述 docker-compose.yml 文件生效后,some-other-service 将能够与 ts-webserver1 在同一个 Tailscale VPN 网络中通信,并且 some-other-service 会共享 ts-webserver1 的网络环境。

注意事项

  • 要确保 some-other-service 不需要独立的网络配置,因为它会直接使用 ts-webserver1 的网络设置。
  • 这种配置仅在同一个 docker-compose 定义文件中适用。如果 ts-webserver1some-other-service 在不同的 docker-compose.yml 文件中,您需要考虑其他方法,像前文提到的,利用 Docker CLI 运行容器并指定非Compose的网络配置,或者创建外部网络。 通过这个 network_mode 的使用案例,读者应该可以更清楚地理解该选项的功能以及如何应用于实际的 Docker 服务配置中。
本文收录于