You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:51:06