【问题标题】:Using docker service names from outside the network使用来自网络外部的 docker 服务名称
【发布时间】:2019-03-14 10:42:24
【问题描述】:

我的应用有 2 个我在 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

访问我的网络

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

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

【问题讨论】:

  • 一种愚蠢的可能性,您是否尝试将容器的主机名设置为本地计算机的主机名?或者甚至将与本地机器主机相关的/etc/hosts 行添加到docker 内部的/etc/hosts(这可以通过extra_hosts 使用docker-compose 来完成)?

标签: docker docker-compose docker-networking


【解决方案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.

【讨论】:

  • 这种方法非常适合在 docker compose 中运行时测试我的应用映像,但它不允许我从网络外部开发代码(这意味着我无法主动调试它,并且只需使用 postgres/kafka 容器作为依赖项)。例如,我将如何使用这种方法运行集成测试?我不想将它们作为另一个服务添加到 docker-compose 中,但是当它们不在网络内时,它们将如何与 postgres:5432 对话?
  • 这并不能回答是否可以从 docker 网络外部引用服务名称的问题
猜你喜欢
  • 2017-07-06
  • 2022-06-15
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多