我有两个要连接的docker容器。一个docker实例( instance1 )与客户端连接,另一个docker( instance2 )想要与instance1连接。主要是当客户端向实例1发送请求时,instatnce1想要调用instance2服务并获得响应。然后将其传递给客户端。
当前,我正在使用以下docker命令来运行docker映像
实例1
docker run --name instance1 -d -p 8290:8290 composite-service
该实例具有服务-http://localhost:8290/composite。 该服务在 instance2
中调用该服务实例2
docker run --name instance2 -d -p 8291:8290 service-backend
此实例具有服务-http://localhost:8291/service。当此调用服务响应一些数据到请求时。 (实际上,该服务在端口8290上启动,但在8291端口上暴露给外部)
问题是,当客户端在 instance1 (http://localhost:8290/composite)中调用服务时,它显示错误
Connection refused or failed for : localhost/127.0.0.1:8291
我该如何解决?我想将这两个容器与docker run命令中传递的现有端口映射连接起来。
我尝试使用--link
和--net
命令连接这两个容器,但结果相同。
答案 0 :(得分:2)
在bellackn's Answer的基础上,我认为最简单的方法是使用docker compose。
dockercompose文件看起来像这样。
version: "3.7"
services:
service:
image: composite-service:latest
ports:
- 8290:8290
backend:
image: service-backend:latest
expose:
- 8290
现在,您无需使用docker run …
,而是将上面的代码保存在名为docker-compose.yml
的文件中,然后从保存文件的文件夹中运行docker-compose up
。
现在,您的复合服务不再应该调用http://localhost:8291/service,而应使用backend:8290 / service之类的东西。
您可以在官方文档中了解有关撰写文件的更多信息:https://docs.docker.com/compose/compose-file/
另一个好处是,这种service-backend
仅可在Docker组成网络中访问(而不是在本地主机上)。
如果要访问后端,请删除expose
语句并添加ports
。
答案 1 :(得分:0)
localhost
始终指容器本身(除非您以--net host
开头)。
如果您希望容器进行通信,建议使用Docker Compose。然后,容器可以使用它们的服务名称相互引用(当然,如果您在同一网络中运行它们,但这是默认设置),即instance1
可以通过instance2
到达http://instance2:8291/service