将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必要的表)