使用来自网络外部的docker服务名称

问题描述 投票:0回答:1

我的应用程序有两个依赖项,我在docker-compose中指定了一个postgres和kafka服务:

services:

  postgres:
    image: postgres:9.6-alpine
    ports:
      - "5432:5432"

  kafka:
    image: wurstmeister/kafka
    ports:
      - "9092:9092"

我在docker网络之外运行我的代码和测试,并使用这两个容器作为我的依赖项。

由于这些都暴露了端口,我可以通过以下命令配置我的应用程序:localhost:5432,localhost:9092。这有效。

我遇到的问题是当我想测试应用程序映像本身时,我将其作为服务添加到docker-compose文件中:

  app:
      image: myapp
      links:
        - postgres
        - kafka

该应用程序仍配置为使用localhost,因此我允许应用程序容器使用--net = host访问我的网络

虽然app容器现在可以访问localhost:5432和localhost:9092(通过容器内部卷曲确认),但是当代码运行且依赖关系无法访问时,主机名无法解析 - 可能是因为使用了localhost容器和混淆客户端库?我真的不确定。

感觉就像在app配置中使用localhost不是正确的方法。是否可以从docker网络外部引用服务名称'postgres'和'kafka'?

docker docker-compose docker-networking
1个回答
1
投票

为什么你想继续在你的应用程序中使用localhost:xxx

最适合您的方法是在从docker-compose启动时更改应用程序中的连接字符串。您只需使用postgres:5432kafka:9092,一切都会正常工作,因为在docker-compose网络中,所有机器在其服务名称下彼此可见。

如果出于某些原因,您坚持使用localhost作为连接目标,则需要将所有服务转换为host模式。但请记住 - 在这种情况下,端口不会公开,因此您可以使用其原始端口值访问服务。

version: '3'
services:
  postgres:
    image: postgres:9.6-alpine
    network_mode: "host"
  kafka:
    image: wurstmeister/kafka
    network_mode: "host"
  app:
    image: myapp
    network_mode: "host"

顺便说一句,忘记链接。 They are deprecated.

© www.soinside.com 2019 - 2024. All rights reserved.