【问题标题】:how to connect to localhost:9092 from docker container using docker-compose and not using docker bridge如何使用 docker-compose 从 docker 容器连接到 localhost:9092 而不是使用 docker bridge
【发布时间】:2017-07-28 22:28:23
【问题描述】:

我在我的 本地机器 上的 9092 端口上运行 Kafka 服务器。 我正在使用 docker-compose 在 docker 容器中运行一项服务,该服务需要向 kafka 服务器发送消息。

我也尝试使用“localhost”和 IP 在服务代码中编写我的生产者,但两者都不起作用。

谁能帮我解决这个问题?

【问题讨论】:

标签: docker apache-kafka docker-compose


【解决方案1】:

使用 docker-compose:

使用 network_mode 选项允许连接到 localhost 端口

network_mode: "host"

没有 docker-compose:

使用 --net 标志允许连接到本地主机端口

docker run -it --net=host

你也可以使用 --network 标志

--network="host"

根据官方 Docker 文档,这些“让容器可以完全访问本地系统服务,例如 D-bus,因此被认为是不安全的。”

当然,如果您将在 localhost:9092 上运行的服务容器化,那么您也可以在 Docker 容器中运行它,并使用 --link 标志将您的两个 Docker 容器链接在一起:

docker run -t -d myService
docker run -t -d --link myService:myService_ref myOtherService

【讨论】:

  • 一旦他使用docker-compose,我建议使用版本3中的external_links标签,而不是使用docker run,这样对他的改动会更少,文档:docs.docker.com/compose/compose-file/#externallinks
  • net=host 是大锤/最后的手段/不是最佳实践选项。
  • @GreensterRox,我正在使用 docker-compose。如何使用 docker-compose up 配置和运行它?
  • @ManishKumar 查看 docker-compose --help 我没有看到指定“网络”参数的选项。您可以尝试从容器内连接到主机的 IP 地址吗?
  • @GreensterRox 通过将 network_mode: "host" 放入 docker-compose.yml 解决了
【解决方案2】:

您可以修复主机的 IP 地址,并使用 'extra_hosts' 选项通过 docker-compose 将其传递给 docker:

类似:

sudo ifconfig lo0 alias 172.16.123.1 

然后在 docker compose 中:

extra_hosts:
 - "service.localhost:172.16.123.1"

那么在容器内你应该能够:

ping service.localhost

【讨论】:

    【解决方案3】:

    从容器连接到本地机器。为 localhost 设置 IP 别名

    sudo ifconfig lo:0 172.18.1.1 up
    

    添加到 docker-compose 配置服务行

    extra_hosts:
          - 'local.machine:172.18.1.1'
    

    容器重启后就可以用来连接了

    'web-socket-server' => 'ws://172.18.1.1',
    

    【讨论】:

      猜你喜欢
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 2019-04-01
      • 2022-11-13
      相关资源
      最近更新 更多