[英]dockerizing django, docker-compose works but not docker run
[英]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)
DB2
是docker-compose.yml中服務的名稱 27017
是暴露服務的端口。 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)。
我能夠容納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.