问题描述
在搭建一个使用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
确保user
和password
与MONGO_INITDB_ROOT_USERNAME
和MONGO_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后端。如果问题仍然存在,请仔细检查日志和错误消息,以获取更多的线索。