curl localhost从一个docker容器连接到另一个docker容器

curl localhost从一个docker容器连接到另一个docker容器,docker,curl,Docker,Curl,我有以下docker compose并在本地运行: version: '3.4' services: testservice.api: image: testservice.api build: context: . dockerfile: Services/.../Dockerfile ports: - "5101:80" sql.data: image: postgres.jchem build:

我有以下
docker compose
并在本地运行:

version: '3.4'
services:
  testservice.api:
    image: testservice.api
    build:
      context: .
      dockerfile: Services/.../Dockerfile
    ports:
      - "5101:80"
  sql.data:
    image: postgres.jchem
    build:
      context: ../db/postgres
      dockerfile: Dockerfile
    ports:
      - "5432:5432"
      - "9090:9090"
现在,在
sql.data
容器中,我尝试执行
curlhttp://localhost:5101/...

但我得到退出代码(7)连接失败
当我尝试通过
curl连接时http://testservice.api/...
它可以工作。

为什么我不能连接到
localhost:port
?我如何通过
curl localhost:port
实现从docker容器内连接到另一个容器?

当您在容器内说localhost时,它将读取为容器本身。使容器能够与其他容器通信。您需要确保这些容器连接在同一网络上,然后您可以尝试通过它们的DNS(服务名称)或容器IP访问它们

为什么我不能连接localhost:port

这是因为每个容器都有自己的网络接口,因此有自己的“localhost”

如何使用curl localhost:port实现从docker容器到另一个容器的连接


您可以在每个compose服务中使用
网络模式:“主机”
,以便每个容器使用相同的主机网络接口。不过,我建议您调整应用程序,使其可配置,以便将其服务依赖项URL作为参数获取(例如)。

当您“在”容器中时,localhost指的是容器本身,不是主机。我想从docker版本3开始,所有容器都自动运行在同一个网络中?同一个网络与共享同一个网络地址不同,每个容器在虚拟网络中都接收自己的IP地址。我如何才能访问另一个容器中的容器,该容器的地址与我从主机使用的地址相同(在本例中为localhost:5101)?如何使容器将localhost:5101转换为testservice.api?在容器中,查看
/etc/hosts
,假设它是一个Linux容器,这可能会添加一些额外的上下文