【问题标题】:Docker container to container connect: connection refusedDocker容器到容器连接:连接被拒绝
【发布时间】:2019-10-10 07:53:11
【问题描述】:

当所有都在 docker 之外独立运行时,当核心尝试从 cerner 获取时,它可以正常工作。但是,当所有都被 dockerized 时,我得到以下结果:

获取http://cerner:8602/api/v1/patient/search:拨打 TCP 192.168.240.4:8602:连接:连接被拒绝。 .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

【问题讨论】:

  • 服务名称为fhir。您应该可以使用fhir 连接它,而不是cerner

标签: docker go docker-compose


【解决方案1】:

您应该使用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 的网络。

创建了一个容器 使用 web 的配置。它加入网络 myapp_default 下 网名。使用 db 的配置创建容器。它 加入名为 db 的网络 myapp_default。

在 v2.1+ 中,覆盖 网络总是可连接的

现在每个容器都可以查找主机名 web 或 db 并取回 合适的容器的 IP 地址。例如,Web 的应用程序 代码可以连接到 URL postgres://db:5432 并开始使用 Postgres 数据库。

请务必注意HOST_PORT 和CONTAINER_PORT之间的区别。在上面的例子中,对于 db,HOST_PORT8001容器端口5432(postgres 默认)。网络服务到服务通信使用CONTAINER_PORT。定义 HOST_PORT 后,该服务也可以在 swarm 外部访问。

在 Web 容器中,您到 db 的连接字符串看起来像 postgres://db:5432,而在主机上,连接字符串看起来像 postgres://{DOCKER_IP}:8001

compose-networking

【讨论】:

  • 在您的回答中,您可以使用 OPs 示例吗?您使用的那个更令人困惑,因为您有两个 8000 端口。还有postgres://{DOCKER_IP}:8001为什么引用图像名称?谢谢!
  • @AustinL 当您想从容器网络外部或主机访问 Postgres 容器时,您应该使用8001,因为它是可以看到外部世界的发布端口,而5432 是仅在容器网络中可见。
猜你喜欢
  • 2021-06-11
  • 2015-12-10
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
相关资源
最近更新 更多