使用端口公开映射连接localhost中的两个docker实例
我有两个docker容器要连接起来工作。一个docker实例(instance1)与客户端连接,另一个docker(instance2)希望与instance1连接。主要是当客户端向实例1发送请求时,InstantCe1希望调用instance2服务并获得响应。然后将其传递给客户机 目前,我正在使用以下docker命令来运行docker图像 实例1使用端口公开映射连接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 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一起做这个吗?