Docker 网络实践:构建可用的跨主机容器间通信网络

阅读时长 5 分钟读完

随着 Docker 技术的不断普及,越来越多的应用开始通过容器的方式来运行和部署。在容器化的应用中,容器间的通信是一个非常重要的问题。在单台主机上,可以通过网桥(bridge)实现容器间的通信,但是当多个主机上的容器需要通信时,就需要用到其他的网络技术来实现。本文将介绍如何使用 Docker 官方提供的网络技术来构建可用的跨主机容器间通信网络。

容器网络模式

Docker 支持多种网络模式,包括 bridge、host、none 和 overlay 等。其中,bridge 是默认网络模式,也是最常用的模式。在 bridge 模式下,所有容器都通过网络模拟器加入到同一网段中,容器间可以直接通过 IP 地址进行通信。

当涉及到跨主机通信时,我们需要使用 overlay 模式。overlay 模式使用 VXLAN 技术来实现多个主机上的容器的通信,从而形成一个虚拟的网络。在 overlay 模式下,每个主机上都会运行一个 overlay 网络的代理,这个代理会通过 Docker Swarm 来协调容器的网络状态。

创建 overlay 网络

在使用 overlay 网络之前,需要先创建一个 overlay 网络。下面是创建一个名为 my-overlay 的 overlay 网络的命令:

在创建 overlay 网络时,需要指定网络的驱动为 overlay。同时,需要指定网络的名称,这个名称可以自定义。

启动容器

启动容器时,需要指定容器所在的网络。下面是启动一个名为 nginx1 的容器并将其加入到 my-overlay 网络中的命令:

在上面的命令中,--network 指定了容器所在的网络为 my-overlay。这样,容器就可以通过 my-overlay 网络与其他容器通信。

容器间通信

容器间可以通过容器名称或 IP 地址进行通信。例如,在容器 nginx1 中可以通过容器名称来访问容器 nginx2:

也可以通过容器的 IP 地址来访问容器 nginx2:

在 overlay 网络中,每个容器都有一个虚拟 IP 地址。这个 IP 地址由 Docker Swarm 自动生成,并且在容器间是唯一的。我们可以通过 docker network inspect 命令来查看 overlay 网络的信息,包括每个容器的 IP 地址和名称:

示例代码

下面是一个使用 overlay 网络的示例代码,它包括两个简单的 Web 应用,用于测试容器间的通信。在这个示例中,我们将创建一个 overlay 网络,并在两台主机上分别启动一个容器来运行这两个 Web 应用。这两个应用将通过 overlay 网络进行通信,并打印出对方的响应内容。

Dockerfile

app.js

-- -------------------- ---- -------
-- ------ --- --- --- ---
----- ------- - ------------------
----- --- - ---------

------------ ----- ---- -- -
  --------------- ----- ---- --- --- ----
--

---------------- -- -- -
  ---------------- --- - --------- -- ---- -------
--
展开代码

docker-compose.yml

-- -------------------- ---- -------
-------- ---
---------
  -----
    ------ -
    ------
      - ----
    -------
      --------- -
      ---------------
        ---------- ----------
    ---------
      - --------------
  -----
    ------ -----------
    -------- -- -- -------- ------ -- ------- ------- -- ---- -- ----- ----- -- ---- ---------- ----- -- -----
    -------
      --------- -
      ---------------
        ---------- ----------
    ---------
      - --------------
---------
  ---------------
    ------- -------
展开代码

在上面的示例中,我们定义了两个 Web 应用:一个是 web1,另一个是 web2。这两个应用将在不同的容器中运行,并通过 overlay 网络进行通信。web1 通过端口 3000 监听 HTTP 请求,并返回 "Hello world from Web app 1!"。web2 会在启动后不断向 web1 发送 HTTP 请求,并将 web1 返回的响应内容打印出来。

在启动示例时,需要在两个主机上分别运行一下命令:

这样,两个 Web 应用就会在不同的容器中运行,并通过 overlay 网络进行通信。可以通过浏览器或 curl 访问 web1 的虚拟 IP 地址来验证是否运行成功。同时,也可以通过 docker service logs 命令来查看每个容器的日志。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67bda0b1a231b2b7ed04ad63

纠错
反馈

纠错反馈