簡體   English   中英

docker-compose 使用 mongodb 運行 django

[英]docker-compose to run django with mongodb

我在使用 docker-compose 將 django 容器與 postgres 和 mongo 容器鏈接時遇到問題? 我正在嘗試使用“docker-compose up”來啟動 mongo 和 postgres 容器(因為我需要鏈接兩者),但 django 應用程序仍然無法在默認設置下連接到 mongodb。 我的 django-compose.yml 文件內容復制如下:

    db1:
      image: postgres
    db2:
      image: mongo
      ports:
        - "27017:27017"
    web:
      build: .
      command: python manage.py runserver 0.0.0.0:8000
      volumes:
        - .:/code
      ports:
        - "8000:8000"
      links:
        - db1
        - db2

它確實與具有默認設置的 postgres 連接。 我也可以在本地 telnet 到 mongodb 端口。 盡管如此,我還是在啟動 Web 容器時遇到此錯誤:

文件“/usr/local/lib/python2.7/site-packages/mongoengine/connection.py”,第124行,get_connection web_1 | raise ConnectionError("無法連接到數據庫 %s :\\n%s" % (alias, e)) web_1 | mongoengine.connection.ConnectionError:無法連接到數據庫默認值:web_1 | [Errno 111] 連接被拒絕

PS:我已經在我的本地主機上成功啟動了一個 django-postgres 連接的應用程序,但它無法連接到 AWS 實例上的 db。 這是我仍然需要解決的另一個問題。

我遇到了類似的問題但是使用了另一個服務(不是MongoDB)。 我不確定我做錯了什么,但這就是我能解決的問題:

import os
import mongoengine

MONGODB_HOST = os.environ.get('DB2_PORT_27017_TCP_ADDR', '127.0.0.1')
mongoengine.connect(host=MONGODB_HOST)
  • DB2docker-compose.yml中服務的名稱
  • 27017是暴露服務的端口。
  • 有關docker-compose環境變量的更多信息
  • 我把它放在我的設置文件中。 但是根據您的項目架構,您可以自由地將它放在您認為合適的任何位置

UPDATE

現在,使用與其別名類似的主機名,其他服務可以訪問docker-compose容器。 鏈接文檔

鏈接服務的容器可以在與別名相同的主機名上訪問,如果未指定別名,則可以訪問服務名稱。

這樣你可以像這樣連接到MongoDB:

import mongoengine

mongoengine.connect(host="db2")

您應該在docker compose文件中指定主機名,而不是IP地址。

從Tornado Web應用程序連接到Mongo DB,我遇到了類似的問題。 這是我的docker-compose.yml:

web:
  build: .
  ports:
   - "8888:8888"
  volumes:
   - .:/code
  links:
   - db
db:
  image: mongo:3.0

這是我的連接字符串:

motorengine.connect("db", host='db', port=27017, io_loop=io_loop)

我的錯誤是在docker compose文件中指定IP地址而不是主機名(db)。

您面臨的問題是應用程序容器和數據庫容器彼此獨立地啟動,最重要的是,應用程序容器不會等到數據庫容器啟動。 至於docker compose 1.1.0沒有允許考慮這種依賴性的特性。

這是一個眾所周知的問題,已經討論過了。 共識似乎是這不應該在docker compose級別上解決,而是在docker本身。 已有一個建議用於碼頭工人的基礎工作。

就我而言,我只是在應用程序本身中構建了這種智能。 我檢查端口連接,直到成功,然后啟動應用程序的其余部分。

我能夠容納Django和MongoDB,連接兩個容器。 我使用Dockerfiles構建容器和docker run來啟動容器並將它們連接起來。 只需按照此回購中的步驟操作即可。 由於最新版本的Django和mongoengine不兼容,因此我必須使用Dockerfiles對所需庫的已安裝版本擁有更多功能。 穩定的工作版本是

Django==1.10.0
pymongo==2.7.1
six==1.10.0
mongoengine==0.9.0

我設法通過以下配置建立了這種連接:

docker-compose.yml

version: "3.9"
services:
mongodb:
  environment:
    MONGO_INITDB_DATABASE: mydatabase
    MONGO_INITDB_ROOT_USERNAME: root
    MONGO_INITDB_ROOT_PASSWORD: password
  hostname: mongodb
  image: mongo
  ports:
    - "27017:27017"
  volumes: 
    - ./data-mongodb:/data/db
  
api:
  build: .
  command: "python manage.py runserver 0.0.0.0:8000"
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  depends_on:
    - mongodb

文件

# syntax=docker/dockerfile:1
FROM python:3
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
COPY . /code/

要求.txt

asgiref==3.4.1
Django==3.2.7
django-annoying==0.10.6
djangorestframework==3.12.4
djongo==1.3.6
psycopg2==2.9.1
psycopg2-binary==2.9.1
pymongo==3.12.1
pytz==2021.3
six==1.16.0
sqlparse==0.2.4

設置.py

DATABASES = {
    'default': {
      'ENGINE': 'djongo',
      'NAME': 'mydatabase',
      'CLIENT': {
          'host': 'mongodb://mongodb:27017',
          'username': 'root',
          'password': 'password',
          'authSource': 'admin',
          'authMechanism': 'SCRAM-SHA-1',
      }
  }
}

在此,使用的模型來自 Djongo 而不是from django.db import models

模型.py

from djongo import models

構建完成后,需要進入api容器並運行./manage.py migrate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM