使用端口公开映射连接localhost中的两个docker实例

使用端口公开映射连接localhost中的两个docker实例,docker,Docker,我有两个docker容器要连接起来工作。一个docker实例(instance1)与客户端连接,另一个docker(instance2)希望与instance1连接。主要是当客户端向实例1发送请求时,InstantCe1希望调用instance2服务并获得响应。然后将其传递给客户机 目前,我正在使用以下docker命令来运行docker图像 实例1 docker run --name instance1 -d -p 8290:8290 composite-service 此实例有一个服务-。

我有两个docker容器要连接起来工作。一个docker实例(instance1)与客户端连接,另一个docker(instance2)希望与instance1连接。主要是当客户端向实例1发送请求时,InstantCe1希望调用instance2服务并获得响应。然后将其传递给客户机

目前,我正在使用以下docker命令来运行docker图像

实例1

docker run --name instance1 -d -p 8290:8290 composite-service
此实例有一个服务-。 此服务调用实例2中的服务

docker run --name instance2 -d -p 8291:8290 service-backend
实例2

docker run --name instance2 -d -p 8291:8290 service-backend
此实例有一个服务-。当调用此服务时,会对请求响应一些数据。(实际上,此服务是在端口8290上启动的,但它在端口8291中暴露给外部)

问题是,当客户端在实例1()中调用服务时,它显示错误

Connection refused or failed for : localhost/127.0.0.1:8291
我如何解决这个问题?我想用docker运行命令中传递的现有端口映射连接这2个容器


我尝试了
--link
--net
命令来连接这两个容器,但结果是一样的。

容器中的localhost
总是指容器本身(除非以
--net host
开头)


如果您希望容器通信,我建议。然后,容器可以使用它们的服务名称相互引用(当然,如果您在同一网络中运行它们,但这是默认值),也就是说,
instance1
可以通过
http://instance2:8291/service

根据bellackn的答案,我认为最简单的方法是使用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

现在,您的复合服务不再需要调用,而是使用类似backend:8290/service的东西

您可以在官方文档中阅读有关撰写文件的更多信息:

另一个好处是,通过这种方式,
服务后端
只能在docker compose网络中访问(而不是在本地主机上)。
如果您想访问后端,请删除
expose
语句并添加
端口

我在运行docker映像时尝试了
--net host
命令。但问题是,它不允许保留端口映射,并发出了警告。你能帮助我如何用Docker Compose或其他简单的方法来完成吗?作为一个简单的解决方案,我尝试创建一个网络,并使用“--net”命令。但是我在使用主机网络时失败了,您可以设置
-P
标志,而不是
-P…
。这样,您在Dockerfile中的
EXPOSE
下配置的任何端口都将从您的容器映射到“真实”本地主机。试试这个快速检查一下。稍后我会回来获取有关如何使用Docker Compose执行此操作的更详细的答案。当我使用
Docker run--name instance1-d--network=“host”-P 8290:8290复合服务
命令时,现在它的意思是无法在本地找到图像“8290:8290”。你知道为什么吗?只要去掉端口号,
-P
就足够了。同样,这取决于在Dockerfile中使用
EXPOSE
定义的端口是否无效。你能帮我和Docker Composer一起做这个吗?