当所有这些都在docker之外独立运行时,当核心尝试从cerner获取数据时,它没有问题。但是,如下所示,当所有docker化后都执行相同操作:
获取http://cerner:8602/api/v1/patient/search:拨打TCP 192.168.240.4:8602:connect:连接被拒绝。 .4是cerner容器的IP,.2是核心容器的IP
Cerner是从核心调用的容器的名称。如果我将名称更改为主机服务器的IP地址并使用端口,它也可以正常工作。它只是不允许使用容器DNS或IP的容器到容器。我尝试在有和没有专用网络的情况下都能获得相同的结果。
所有的容器都被刮掉了。
version: '3.7'
services: caConnector:
image: vertisoft/ca_connector:latest
ports:
- "8601:7001"
env_file:
- .env.ca_connector
networks:
- core-net
fhir:
image: vertisoft/fhir_connector:latest
container_name: cerner
ports:
- "8602:7002"
env_file:
- .env.fhir_connector
networks:
- core-net
core:
image: vertisoft/core:latest
ports:
- "8600:7000"
env_file:
- .env.core
networks:
- core-net
networks: core-net:
driver: bridge
答案 0 :(得分:2)
您应该使用containerPort
而不是服务中的hostPort调用容器服务来进行通信。您的情况下,使用容器名称进行连接的任何容器都应为7000 to 7002
。
获取http://cerner:8602/api/v1/patient/search:拨打TCP 192.168.240.4:8602:连接:连接被拒绝。
与错误一样,它尝试使用发布端口尝试连接。
例如
version: "3"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
ports:
- "8001:5432"
当您运行docker-compose up时,会发生以下情况:
创建了一个名为myapp_default的网络。
已创建一个容器 使用网络的配置。它在下面加入网络myapp_default 网站名称。容器是使用db的配置创建的。它 以db名称加入网络myapp_default。
在v2.1 +中,覆盖 网络总是可连接的
每个容器现在都可以查找主机名web或db并取回 相应容器的IP地址。例如,网络应用 代码可以连接到URL postgres:// db:5432并开始使用 Postgres数据库。
请务必注意 HOST_PORT与CONTAINER_PORT 之间的区别。在上面的示例中,对于db, HOST_PORT 为8001
,而容器端口为5432
(默认为postgres)。联网的服务到服务通信使用 CONTAINER_PORT 。定义HOST_PORT时,也可以在群集外部访问该服务。
在Web容器中,您与db的连接字符串看起来像postgres://db:5432
,而在主机上,连接字符串看起来像postgres://{DOCKER_IP}:8001
。