如何在不使用服务名称的情况下在 MacOS 上连接两个容器

How do I connect two containers on MacOS without using service name

我正在 运行 宁两个 docker 服务,这不是我创作的,需要相互通信。第一个容器希望通过特定端口号与其他服务通信,比方说通过端口 8008。

当我运行一个Linuxmachines上的两个容器时,容器A可以很容易地通过8008端口到达容器B。

但是当我在 mac 上尝试 运行 时,容器 A 无法通过端口 8008 到达容器 B。它失败并出现以下错误:

FetchError: request to http://127.0.0.1:8008/ failed, reason: connect ECONNREFUSED 127.0.0.1:8008

我发现了这个 Whosebug 问题 ,它提供了一种让两个容器在 mac 上进行通信的方法,唯一的问题是该解决方案需要设置服务名称,并使用它来访问另一个容器(同时确保它们在同一网络上)

这对我不起作用,因为我无法控制容器 A 与容器 B 通信的方式。容器 A 希望容器 B 提供的服务可以通过 127.0.0.1 访问。

有什么办法可以设置吗?并让 MAC 上的两个容器使用 localhost/127.0.0.1?

相互通信

创建容器时,可以将另一个容器的网络堆栈分配给它。这允许两个容器通过环回接口(即本地主机)进行通信。虽然我不确定它是否适用于 Mac。尝试使用以下命令。

启动将在端口 80 上侦听的 NGINX 容器:

docker run --rm --name tmp-nginx nginx

打开另一个终端,用curl启动一个容器,给它tmp-nginx容器的网络:

docker run --rm --net=container:tmp-nginx curlimages/curl http://localhost:80

如果一切顺利,您会看到:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
[the rest is truncated]

如果可行,那么您可以对您的服务使用相同的技巧。只需使用额外的标志启动其中之一:

--net=container:[INSERT NAME OF THE OTHER CONTAINER]