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

时间:2019-03-14 10:42:24

标签: docker docker-compose docker-networking

我的应用程序有2个依赖关系,它们是我在 docker-compose 中指定的一种postgres和kafka服务:

services:

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

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

我运行我的代码并外部进行测试,并将这两个容器用作我的依赖项。

由于这两个都暴露了端口,因此我可以配置我的应用以通过以下方式访问它们:localhost:5432,localhost:9092。这行得通。

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

  app:
      image: myapp
      links:
        - postgres
        - kafka

该应用仍配置为使用localhost,因此我允许该应用容器使用-net = host

访问我的网络

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

感觉在这里在应用程序配置中使用localhost不是正确的方法。是否可以从docker网络的外部引用服务名称“ postgres”和“ kafka”?

1 个答案:

答案 0 :(得分: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.