docker-compose用mongodb运行django

使用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 | 引发ConnectionError(“无法连接到数据库%s:\ n%s”%(别名,e))web_1 | mongoengine.connection.ConnectionError:无法连接到数据库默认值:web_1 | [Errno 111]连接被拒绝

PS:我已经在本地主机上成功启动了一个django-postgres连接的应用程序,但在AWS实例上无法连接到数据库。 这是我仍然需要根深蒂固的另一个问题。

我遇到了类似的问题,但与另一个服务(而不是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环境variables
  • 我把它放在我的设置文件中。 但是,根据您的项目架构,您可以随意将其放在适当的位置

UPDATE

现在,docker-compose容器可以被其他服务使用类似于其别名的主机名访问。 链接文档 :

链接服务的容器将可以在与别名相同的主机名上访问,如果没有指定别名,则服务名称是可访问的。

这样你就可以像这样连接到MongoDB:

 import mongoengine mongoengine.connect(host="db2") 

您面对的问题是应用程序容器和数据库容器彼此独立,最重要的是,应用程序容器不会等到数据库容器启动。 有docker工人组成1.1.0没有任何function,将允许考虑这种依赖关系。

这是一个众所周知的问题,已经被讨论过了。 共识似乎是,这不应该在docker组成层面上解决,但在docker本身。 docker工人已经有了一个build议 。

就我而言,我只是在应用程序本身构build了这种智能。 我检查端口连接,直到成功,然后启动应用程序的其余部分。

您应该像docker撰写文件中指定主机名,而不是IP地址。

从Tornado Web应用程序连接到Mongo DB时,我遇到了类似的问题。 这是我的docker-compose.yml:

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

这是我的连接string:

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

我的错误是指定的IP地址,而不是主机名(db),如在docker撰写文件。

我能够容纳Django和MongoDB,连接两个容器。 我使用Dockerfiles来构build容器和docker run以启动容器并将它们连接起来。 只要按照这个回购的步骤。 由于最新版本的Django和mongoengine是不兼容的,所以我需要使用Dockerfiles来获得所需库的已安装版本的更多权限。 稳定的工作版本是

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