随着 Docker 技术的不断普及,越来越多的应用开始通过容器的方式来运行和部署。在容器化的应用中,容器间的通信是一个非常重要的问题。在单台主机上,可以通过网桥(bridge)实现容器间的通信,但是当多个主机上的容器需要通信时,就需要用到其他的网络技术来实现。本文将介绍如何使用 Docker 官方提供的网络技术来构建可用的跨主机容器间通信网络。
容器网络模式
Docker 支持多种网络模式,包括 bridge、host、none 和 overlay 等。其中,bridge 是默认网络模式,也是最常用的模式。在 bridge 模式下,所有容器都通过网络模拟器加入到同一网段中,容器间可以直接通过 IP 地址进行通信。
当涉及到跨主机通信时,我们需要使用 overlay 模式。overlay 模式使用 VXLAN 技术来实现多个主机上的容器的通信,从而形成一个虚拟的网络。在 overlay 模式下,每个主机上都会运行一个 overlay 网络的代理,这个代理会通过 Docker Swarm 来协调容器的网络状态。
创建 overlay 网络
在使用 overlay 网络之前,需要先创建一个 overlay 网络。下面是创建一个名为 my-overlay 的 overlay 网络的命令:
$ docker network create --driver overlay my-overlay
在创建 overlay 网络时,需要指定网络的驱动为 overlay。同时,需要指定网络的名称,这个名称可以自定义。
启动容器
启动容器时,需要指定容器所在的网络。下面是启动一个名为 nginx1 的容器并将其加入到 my-overlay 网络中的命令:
$ docker run --name nginx1 --network my-overlay -d nginx
在上面的命令中,--network 指定了容器所在的网络为 my-overlay。这样,容器就可以通过 my-overlay 网络与其他容器通信。
容器间通信
容器间可以通过容器名称或 IP 地址进行通信。例如,在容器 nginx1 中可以通过容器名称来访问容器 nginx2:
$ curl http://nginx2
也可以通过容器的 IP 地址来访问容器 nginx2:
$ curl http://10.0.0.2
在 overlay 网络中,每个容器都有一个虚拟 IP 地址。这个 IP 地址由 Docker Swarm 自动生成,并且在容器间是唯一的。我们可以通过 docker network inspect 命令来查看 overlay 网络的信息,包括每个容器的 IP 地址和名称:
$ docker network inspect my-overlay
示例代码
下面是一个使用 overlay 网络的示例代码,它包括两个简单的 Web 应用,用于测试容器间的通信。在这个示例中,我们将创建一个 overlay 网络,并在两台主机上分别启动一个容器来运行这两个 Web 应用。这两个应用将通过 overlay 网络进行通信,并打印出对方的响应内容。
Dockerfile
# Dockerfile for the Web app FROM node:latest WORKDIR /app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD [ "npm", "start" ]
app.js
-- -------------------- ---- ------- -- ------ --- --- --- --- ----- ------- - ------------------ ----- --- - --------- ------------ ----- ---- -- - --------------- ----- ---- --- --- ---- -- ---------------- -- -- - ---------------- --- - --------- -- ---- ------- --展开代码
docker-compose.yml
-- -------------------- ---- ------- -------- --- --------- ----- ------ - ------ - ---- ------- --------- - --------------- ---------- ---------- --------- - -------------- ----- ------ ----------- -------- -- -- -------- ------ -- ------- ------- -- ---- -- ----- ----- -- ---- ---------- ----- -- ----- ------- --------- - --------------- ---------- ---------- --------- - -------------- --------- --------------- ------- -------展开代码
在上面的示例中,我们定义了两个 Web 应用:一个是 web1,另一个是 web2。这两个应用将在不同的容器中运行,并通过 overlay 网络进行通信。web1 通过端口 3000 监听 HTTP 请求,并返回 "Hello world from Web app 1!"。web2 会在启动后不断向 web1 发送 HTTP 请求,并将 web1 返回的响应内容打印出来。
在启动示例时,需要在两个主机上分别运行一下命令:
$ docker stack deploy --compose-file docker-compose.yml my-stack
这样,两个 Web 应用就会在不同的容器中运行,并通过 overlay 网络进行通信。可以通过浏览器或 curl 访问 web1 的虚拟 IP 地址来验证是否运行成功。同时,也可以通过 docker service logs 命令来查看每个容器的日志。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67bda0b1a231b2b7ed04ad63