连接MongoDB容器时出现Errno 111 Connection refused错误

72次阅读
没有评论

问题描述

在搭建一个使用Nginx反向代理的Flask应用时,Flask应用需要与MongoDB后端进行通信。然而,尽管已经尝试设置MongoDB的默认管理员用户,但在尝试使用管理员用户凭据进行认证时,出现了“认证失败错误”!以下是提供的docker-compose.yaml文件:

version: '3.7'
services:
  mongodb:
    env_file:
      - .env
    image: mongo:5.0.6
    ports:
      - "30000:27017"
    container_name: groupkash-mongodb
    restart: always
    environment:
      - MONGODB_DATA_DIR=/data/db
      - MONDODB_LOG_DIR=/dev/null
      - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME}
      - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}
    volumes:
      - ./mongodbdata:/data/db
    networks:
      - backend
  flask:
    env_file:
      - .env
    build:
      context: .
      dockerfile: Dockerfile
    container_name: groupkash-flask
    image: groupkash-gunicorn-flask:v1.0
    restart: always
    environment:
      - APP_ENV=${APP_ENV}
      - APP_DEBUG=${APP_DEBUG}
      - APP_PORT=${APP_PORT}
      - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME}
      - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}
    volumes:
      - ./appdata:/app/data
    depends_on:
      - mongodb
    networks:
      - frontend
      - backend
  webserver:
    build:
      context: nginx
      dockerfile: Dockerfile
    image: groupkash-webserver:v1.0
    container_name: groupkash-webserver
    restart: always
    environment:
      APP_ENV: "prod"
      APP_NAME: "webserver"
      APP_DEBUG: "true"
      SERVICE_NAME: "webserver"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginxdata:/var/log/nginx
    depends_on:
      - flask
    networks:
      - frontend
networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
volumes:
  mongodbdata:
    driver: local
  appdata:
    driver: local
  nginxdata:
    driver: local

连接字符串如下:

MONGO_URI=mongodb://user:password@172.21.0.2:30000/database

错误信息:

Error: 172.21.0.2:30000: [Errno 111] Connection refused, Timeout: 30s, Topology Description: <TopologyDescription id: 627bbf91d21f9dbb2f1e4267, topology_type: Unknown, servers: [<ServerDescription ('172.21.0.2', 30000) server_type: Unknown, rtt: None, error=AutoReconnect('172.21.0.2:30000: [Errno 111] Connection refused')>]>

使用docker network inspect命令可以看到MongoDB和Flask在同一个网络中。

解决方案

检查网络连接和端口设置

首先,确保你的MongoDB容器正在正确监听端口。在你的docker-compose.yaml文件中,你将MongoDB容器的27017端口映射到主机的30000端口。因此,在连接MongoDB时,应该使用主机的IP地址和端口30000。

验证环境变量

确保你在连接字符串中使用的用户名、密码和数据库名称与你在docker-compose.yaml文件中定义的环境变量一致。在你的连接字符串中,你使用了以下环境变量:

MONGO_URI=mongodb://user:password@172.21.0.2:30000/database

确保userpasswordMONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD环境变量的值一致。另外,检查连接字符串中的IP地址(172.21.0.2)是否正确匹配MongoDB容器的IP地址。

检查网络配置

虽然你已经确保MongoDB和Flask容器在同一个网络中,但仍然需要确保容器名称或服务名称在网络中是可解析的。如果你在连接字符串中使用了容器名称,那么确保网络配置正确,以便容器名称能够正确解析到IP地址。

检查防火墙设置

有时防火墙配置可能会导致连接被拒绝。确保主机和容器之间的通信不受防火墙阻止。

检查MongoDB配置

最后,确保MongoDB容器的配置正确。在你的docker-compose.yaml文件中,你为MongoDB容器设置了用户名和密码。请确保你在应用程序中正确使用这些凭据进行连接,并且MongoDB容器已经成功启动并创建了相应的管理员用户。

结论

连接MongoDB容器时出现“Errno 111 Connection refused”错误通常是由于网络配置、环境变量或容器设置的问题引起的。通过检查连接字符串、网络配置、防火墙设置和容器配置,你应该能够解决这个问题并成功连接到MongoDB后端。如果问题仍然存在,请仔细检查日志和错误消息,以获取更多的线索。

正文完