【问题标题】:Containerized python app can't connect to RabbitMQ server running on Docker container容器化的 python 应用程序无法连接到在 Docker 容器上运行的 RabbitMQ 服务器
【发布时间】:2019-12-06 16:02:46
【问题描述】:

我正在尝试将我的 Python 应用程序连接到 RabbitMQ 服务器。 Python 应用程序和 RabbitMQ 服务器都在 Docker 容器中运行。我遇到的问题是我正在尝试使用我的 Python 应用程序连接到服务器并且我收到错误:

Traceback (most recent call last):
  File "cfg_rpc_server.py", line 9, in <module>
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='rabbitmq'))
  File "/usr/local/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 359, in __init__
    self._impl = self._create_connection(parameters, _impl_class)
  File "/usr/local/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 450, in _create_connection
    raise self._reap_last_connection_workflow_error(error)
  File "/usr/local/lib/python3.8/site-packages/pika/adapters/utils/selector_ioloop_adapter.py", line 562, in _resolve
    result = socket.getaddrinfo(self._host, self._port, self._family,
  File "/usr/local/lib/python3.8/socket.py", line 914, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known

docker-compose.yml

version: '3.4'

services:
  seq:
    image: datalust/seq:latest

  rabbitmq:
    image: rabbitmq:3.8.1-management-alpine

  mongodb:
    image: mongo
    volumes:
      - mongodb_volume:/data/db

  apigateway:
    image: ${DOCKER_REGISTRY-}apigateway
    build:
      context: .
      dockerfile: src/ApiGateway/Dockerfile

  detection.api:
    image: ${DOCKER_REGISTRY-}detectionapi
    build:
      context: .
      dockerfile: src/Services/Detection/Detection.API/Dockerfile
    depends_on:
      - rabbitmq
      - mongodb
    volumes:
      - ./data/output:/output

  training.api:
    image: ${DOCKER_REGISTRY-}trainingapi
    build:
      context: .
      dockerfile: src/Services/Training/Training.API/Dockerfile
    depends_on:
      - rabbitmq
      - mongodb

  webmvc:
    image: ${DOCKER_REGISTRY-}webmvc
    build:
      context: .
      dockerfile: src/Web/WebMVC/Dockerfile      

  mgr: # My python app
    image: ${DOCKER_REGISTRY-}mgr
    build:
        context: .
        dockerfile: src/BuildingBlocks/ConfigManager/Dockerfile
    depends_on:
      - rabbitmq
      - mongodb
volumes:
  mongodb_volume:
    external: false

Python 应用程序的 Dockerfile

FROM python:slim-buster

RUN mkdir /app
WORKDIR /app
COPY ["src/BuildingBlocks/ConfigManager", "."]

RUN pip install -r requirements.txt

CMD ["python", "cfg_rpc_server.py"]

Python App 代码片段:

import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(host='rabbitmq'))

我还检查了所有容器是否在同一个网络中,它们是否在同一网络中

PS C:\Windows\system32> docker network inspect c6818581e269
[
    {
        "Name": "dockercompose6314373887499575973_default",
        "Id": "c6818581e269d602cd6f774747845552341fb282d6be780049e716b5ad0c7be3",
        "Created": "2019-12-06T15:37:10.8675273Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.26.0.0/16",
                    "Gateway": "172.26.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "10fd0dd1cc98770ddd69c5d9ce07d51a6714a9f9826a27fb8d52309f5a2055e3": {
                "Name": "Detection.API",
                "EndpointID": "d21f3433119f6671a214ba48513160ba5af9441829ca29da1edbcf79bd137098",
                "MacAddress": "02:42:ac:1a:00:09",
                "IPv4Address": "172.26.0.9/16",
                "IPv6Address": ""
            },
            "325c6dda2bd14b4d08c6dbbf37672823529accac1d5152aadf336f96688f8923": {
                "Name": "Training.API",
                "EndpointID": "51124c1531d93cc718c1c4cfd92b2ea6ff1ac2f5cc0512db3993e90532199874",
                "MacAddress": "02:42:ac:1a:00:08",
                "IPv4Address": "172.26.0.8/16",
                "IPv6Address": ""
            },
            "3941454d159d0665851b332c89494eda137f95f8ae48b3731a3ebe6189defb85": {
                "Name": "dockercompose6314373887499575973_mgr_1",
                "EndpointID": "9d92c5aae7ce6e794d2e158fd3709bc1df726c937f4d681f8aaf0ef6be307291",
                "MacAddress": "02:42:ac:1a:00:03",
                "IPv4Address": "172.26.0.3/16",
                "IPv6Address": ""
            },
            "5d0971e9091fa431c0a9820d6ff492c3abbc3a1e58009e9a518f4e6c0a244bd0": {
                "Name": "ApiGateway",
                "EndpointID": "a81fe63e9d607ae91a35c06f9a9f400c795a1d287b3bbfa9ccfa41cd0e068240",
                "MacAddress": "02:42:ac:1a:00:04",
                "IPv4Address": "172.26.0.4/16",
                "IPv6Address": ""
            },
            "929290c65a1c2cdcd212383049b37632d7cb86bde5f7870a7f925ff30dac633c": {
                "Name": "dockercompose6314373887499575973_seq_1",
                "EndpointID": "9753b94aeac93dad134bec6689a6c4daed2c6199f5b702f4bee8c90554838ee5",
                "MacAddress": "02:42:ac:1a:00:06",
                "IPv4Address": "172.26.0.6/16",
                "IPv6Address": ""
            },
            "92a18333f5ca808872aadf55a1a4a917c9094b8dc4798df483f3003d4e8a3476": {
                "Name": "dockercompose6314373887499575973_rabbitmq_1",
                "EndpointID": "29340f69550353c3d53f71829541112ad71a67d4c795121297b573b9d7a42ccb",
                "MacAddress": "02:42:ac:1a:00:05",
                "IPv4Address": "172.26.0.5/16",
                "IPv6Address": ""
            },
            "c96dacaa40a4aa1898dce05402054d8a36d9f144837cb83cc1345dbbdb46ae33": {
                "Name": "WebMVC",
                "EndpointID": "a976bb304e22f55f16b74588f3ef972b7d7b00a3fa28b3784e6e57cbd7e96599",
                "MacAddress": "02:42:ac:1a:00:02",
                "IPv4Address": "172.26.0.2/16",
                "IPv6Address": ""
            },
            "d690db70785a7c7cb975ce9a8162ff8e41dd7aadc6e58f506a94df5d194b269d": {
                "Name": "dockercompose6314373887499575973_mongodb_1",
                "EndpointID": "5279d09e077d1c1f0becb611ff31f16d84d388cfe4cbc2357371b895ceddd83c",
                "MacAddress": "02:42:ac:1a:00:07",
                "IPv4Address": "172.26.0.7/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "dockercompose6314373887499575973",
            "com.docker.compose.version": "1.24.1"
        }
    }
]

我还尝试在不同的图像上运行 Python 应用程序,然后检查nslookup rabbitmq,我收到了正确的 rabbitmq 服务器 IP 地址。在这一点上,我想我已经尝试了一切,我不知道还要检查什么。知道如何解决这个问题吗?另一件事是我的 .NET Core 应用程序与 rabbitmq 主机连接没有任何问题。

我正在为 Windows 运行 Docker。

【问题讨论】:

  • 您好,欢迎来到 SO,您能否尝试执行您的容器并尝试 ping 您的其他容器
  • @ghovat 当然。返回 root@90afea6c988f:/app# ping rabbitmq ping: rabbitmq: Name or service not known

标签: python docker rabbitmq


【解决方案1】:

我相信你错过了一件事,如果这不起作用,你应该尝试另一件事。

首先,

您是否公开了必要的端口?运行容器时,请执行以下操作: docker run -p 15672:15672 -p 5672:5672 &lt;your-rabbitmq-container&gt;

我很肯定这是一个端口问题。

其次,

如果这不起作用,您可以尝试将host='rabbitmq' 替换为host='&lt;ip-address&gt;',您可以通过docker exec -it &lt;ip-address&gt; /bin/bash 找到您的IP 地址并在您的容器中输入hostname -I

最后,

RabbitMQ 不能在默认访客用户的本地主机之外工作。您将需要创建一个用户,以便您可以在 localhost 之外使用它。但是,首先只需添加端口并尝试!

【讨论】:

  • 我相信所有必要的端口都暴露了(docker ps screenshot link)。至于将主机更改为有效的 IP 地址。但我不明白为什么其他服务可以解析主机名“rabbitmq”,但这个 python 不能。谢谢你的回答。
  • 这个也可以。稍后我会写一个详细的答案,星期五很晚!
  • 使用 Docker Desktop 时会导致严重问题。检查容器 IP 地址不起作用!请有任何建议
猜你喜欢
  • 2020-09-28
  • 2021-12-16
  • 2021-07-02
  • 2017-11-03
  • 2022-01-16
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多