将Django和Postgresql与Docker链接起来

我有两个Docker容器。 第一个是Postgresql容器,我使用下面的命令运行。

sudo docker run -v /home/mpmsp/project/ezdict/postgresql/data:/var/lib/postgresql/data -p 127.0.0.1:5432:5432 -name my-postgres -d postgres 

它是基于官方的形象 ,它工作得很好,我可以从主机连接到Postgresql。

第二个容器是我的Django应用程序的容器。 该图像使用以下Dockerfile(基于此图像 )构build:

 FROM python:3-onbuild EXPOSE 8000 5432 CMD ["/bin/bash"] 

我用下面的命令运行这个容器

 sudo docker run --link my-postgres:my-postgres -v /home/mpmsp/project/ezdict/ezbkend:/usr/src/app -name my-app -i -t my-app 

docker ps输出显示容器已链接

 NAMES my-app/my-postgres, my-postgres 

但是,当我去localhost:8000,我看到从Django的错误页面,输出如下

 OperationalError at /api-auth/login/ could not connect to server: Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432? Request Method: GET Request URL: http://127.0.0.1:8000/api-auth/login/ Django Version: 1.6.4 Exception Type: OperationalError Exception Value: could not connect to server: Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432? Exception Location: /usr/local/lib/python3.4/site-packages/psycopg2/__init__.py in connect, line 164 Python Executable: /usr/local/bin/python Python Version: 3.4.1 Python Path: ['/usr/src/app', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/root/.local/lib/python3.4/site-packages', '/usr/local/lib/python3.4/site-packages'] Server time: Птн, 10 Окт 2014 12:07:07 +0400 

应用程序的settings.py

  DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'mydb', 'USER': 'postgres', 'PASSWORD': '', 'HOST': '127.0.0.1', 'PORT': '5432', } } 

如何使链接工作? 提前致谢

您的Django映像的Dockerfile不应该公开端口5432因为从该映像创build的任何容器中都不会运行Postgresql服务器:

 FROM python:3-onbuild EXPOSE 8000 CMD ["/bin/bash"] 

然后当你正在运行的Django容器链接

--link my-postgres:my-postgres

您的数据库设置不正确。

在Django容器中:127.0.0.1引用了Django容器,该容器没有运行侦听端口5432的任何服务。

所以你的settings.py文件应该是:

  DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'mydb', 'USER': 'postgres', 'PASSWORD': '', 'HOST': 'my-postgres', 'PORT': '5432', } } 

当你运行你的Django容器时:

sudo docker run --link my-postgres:db -v /home/mpmsp/project/ezdict/ezbkend:/usr/src/app -name my-app -i -t my-app

那么你的settings.py文件必须是:

  DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'mydb', 'USER': 'postgres', 'PASSWORD': '', 'HOST': 'db', 'PORT': '5432', } } 

只有在dbdb和django容器被构build和启动后,syncdb才能正常工作,那么你可以用fig / docker-compose / docker手动运行syncdb命令。 我正在考虑创build一个AT作业,让容器自己运行syncdb(并在syncdb之后创build一个admin用户 – 用于创build必要的表)