Django-Rest应用Docker Compose运行时MongoDB连接拒绝问题
解决Docker Compose下Django无法连接MongoDB的问题
这个问题其实很常见——容器里的localhost指向的是容器自身,而不是你的宿主机!所以当你在Django的settings.py里写host: 'localhost'时,Docker里的Django服务会尝试连接自己容器内的27017端口,自然会被拒绝。
我分两种常见场景给你解决方案:
场景1:MongoDB运行在宿主机上(不是Docker容器)
如果你的MongoDB是直接装在宿主机上的,需要做两个调整:
- 修改MongoDB的配置(通常是
mongod.conf),把绑定IP从127.0.0.1改成0.0.0.0,允许外部容器访问; - 在Django的
settings.py里,把host改成宿主机的局域网IP(比如192.168.1.100),而不是localhost。
另外也可以在docker-compose.yml里给web服务加上network_mode: host,让容器直接使用宿主机网络,但这种方式会失去Docker网络隔离的优势,一般不推荐。
场景2:MongoDB也是用Docker Compose启动的容器(更推荐的方式)
这是Docker部署的标准做法,把MongoDB也作为一个服务加入到docker-compose.yml中:
第一步:修改docker-compose.yml,添加MongoDB服务
version: '3.8' services: web: build: . command: python manage.py runserver 0.0.0.0:8000 ports: - "8000:8000" depends_on: - mongodb # 确保web服务在mongodb之后启动 environment: - MONGODB_HOST=mongodb # 也可以用环境变量传递,更灵活 mongodb: image: mongo:latest ports: - "27017:27017" volumes: - mongodb_data:/data/db # 持久化数据,防止容器删除后数据丢失 volumes: mongodb_data: # 定义数据卷
第二步:修改Django的settings.py配置
把host改成Docker Compose中MongoDB服务的名称(也就是上面的mongodb):
MONGODB_DATABASES = { "default": { "name": 'api', "host": 'mongodb', # 这里用服务名,Docker内部DNS会自动解析 "port": 27017, # 其他配置如用户名密码等,按需添加 } }
注意事项
depends_on只是保证启动顺序,但不会等待MongoDB完全就绪(比如数据库服务还没初始化完成)。如果遇到偶尔连接失败的情况,可以给web服务加一个等待脚本,比如用wait-for-it.sh来等待MongoDB端口开放后再启动Django。
比如修改web服务的command:
command: ["./wait-for-it.sh", "mongodb:27017", "--", "python", "manage.py", "runserver", "0.0.0.0:8000"]
这样就能确保Django在MongoDB完全可用后再启动啦!
内容的提问来源于stack exchange,提问作者Oleksandr Baranov
相关产品推荐
相关产品推荐

