【问题标题】:connecting from one docker to another using port forwarding and network=host fails使用端口转发和 network=host 从一个 docker 连接到另一个 docker 失败
【发布时间】:2020-02-20 17:14:16
【问题描述】:

我用python3.7.5写了一个连接RabbitMQ的应用:

使用 Ubuntu 作为 docker-machine

我正在使用 docker 运行 rabbitmq:
docker run --name rabbitmq -p 5671:5671 -p 5672:5672 -p 15672:15672 --hostname rabbitmq rabbitmq:3.6.6-management

测试:

  • 我的 python 应用通过 127.0.01:5672 连接到它

  • 预期:连接并正常工作

  • 实际:连接和工作

我将应用程序放入 docker 并构建并运行

--build-arg ENVIRONMENT_NAME=develop
-t pdf-svc-image:latest .
&& docker run
-P
--env ENVIRONMENT_NAME=local
--name html-to-pdf
-v /home/mickey/dev/core/components/pdf-svc/:/html-to-pdf
--privileged
--network host
pdf-svc-image:latest bash

(这个命令行是用pycharm创建的)

运行此代码时(在 docker 内),我得到一个异常


return await aio_pika.connect_robust(
            "amqp://guest:guest@{host}".format(host=consts.MESSAGE_QUEUE_HOST)
        )
  • [Errno 111] 连接调用失败('127.0.0.1',5672)
  • [Errno 99] 无法分配请求的地址

帮助?

【问题讨论】:

  • 我建议通读 Docker 文档中的Networking in Compose,即使您没有使用 Compose;它有一些关于事情通常如何运作的很好的背景信息。在 Compose 之外,您需要 docker network create 一个网络并在该 --network 上运行两个容器。尽可能避免主机网络。

标签: python-3.x docker rabbitmq network-programming pika


【解决方案1】:

根据https://docs.docker.com/network/host/

注意:鉴于容器在使用主机模式联网时没有自己的IP地址,端口映射不生效,-p、--publish、-P和--publish-all选项被忽略,而是产生警告:

我不确定这是您的情况。您将登录容器,然后运行 ​​ping, nslookup 以检查网络连接。

【讨论】:

    【解决方案2】:

    RabbitMQ 容器

      docker run --name rabbitmq \
          -p 5671:5671 -p 5672:5672 -p 15672:15672 \
          --hostname rabbitmq \
          --network host \      # <-- Add this line, now both container see each other
          rabbitmq:3.6.6-management
    

    应用容器

      docker run \
          -P \
          --env ENVIRONMENT_NAME=local \
          --name html-to-pdf \
          -v /home/mickey/dev/core/components/pdf-svc/:/html-to-pdf \
          --privileged \
          --network host \
          pdf-svc-image:latest bash
    

    然后在您的代码中,您需要使用 host = rabbitmq 而不是 127.0.0.1 加载变量。

    【讨论】:

    • 我不建议为简单的容器到容器通信禁用 Docker 的网络。
    • 是的,我说要添加忘记的网络。你在哪里看到你删除它?
    • --net host 表示禁用 Docker 的网络层。它可能会解决眼前的问题,但就像以 root 身份运行进程绕过权限问题一样:它不能解决根本问题,并且可能会产生意想不到的副作用。
    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多