在没有 Docker compose 的情况下连接两个容器的最简单方法是什么?

问题描述 投票:0回答:1

考虑到我无法使用

Docker compose
和一个非常简单的
Docker
设置:

  • NodeJs 应用程序(容器
    A
  • 公开 REST api 的服务(容器
    B

如何从

B
连接到
A
来查询 API,无需 SSH,而只是将内容附加到
docker run...

我已经成功获取了

B
的内部IP(使用
docker container inspect B
)并向
A
发出类似
fetch("http://ip-of-b/api")
之类的请求。它有效,但效果不佳。事实上,如果我再次部署,
B
ip 会发生变化。

是否有一种非常简单的方法可以在这两个容器之间建立生产桥梁? 我读过有关

--add-host=host.docker.internal:host-gateway
的内容,但我不明白它是如何工作的/它是相关的。

PS:将来,我可能会有第三个容器(

C
),它也必须能够连接到
A

docker networking bridge
1个回答
0
投票

我已成功获取 B 的内部 ip(使用 docker 容器检查 B)并向 A 请求类似 fetch("http://ip-of-b/api") 的内容。

该解决方案是有问题的,因为容器 ip 是动态的;如果您要重新启动两个容器之一,您将无法再连接。您想使用容器names

重要的是要认识到 Docker Compose 只是 docker API 的一个方便的包装器;您可以使用

docker run
完成完全相同的事情。当您启动 Docker Compose 应用程序堆栈时,Compose 首先创建用户定义的网络,然后将所有容器附加到该网络。这很重要,因为用户定义网络上的容器可以通过名称相互引用。

我们可以用

docker run
做同样的事情。首先创建一个网络:

docker network create mynetwork

然后启动连接到该网络的一个容器:

docker run --name app1 --network=mynetwork app1-image

然后启动第二个容器:

docker run --name app2 --network=mynetwork app2-image

现在,在

app1
容器中,您可以使用主机名
app2
来引用第二个容器,在
app2
容器中,您可以使用主机名
app1
来引用第一个容器。这是一个简单的、可运行的示例:

docker network create mynetwork
docker run -d --name app1 --network mynetwork docker.io/alpinelinux/darkhttpd
docker run -d --name app2 --network mynetwork docker.io/alpinelinux/darkhttpd
docker run -d --name app3 --network mynetwork docker.io/alpinelinux/darkhttpd

以容器

app1
为例,我们可以成功地通过适当的容器名称访问我们的服务。以下命令均成功运行:

docker exec app1 wget -O- http://app1:8080
docker exec app1 wget -O- http://app2:8080
docker exec app1 wget -O- http://app3:8080

您可以在 Docker 网络文档中阅读更多相关信息。

© www.soinside.com 2019 - 2024. All rights reserved.