繁体   English   中英

将Django和Postgresql与Docker链接起来

[英]Linking Django and Postgresql with 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构建映像(基于此映像 ):

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因为在该映像创建的任何容器中都不会运行Postgresql服务器:

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

然后在运行连接它的Django容器时

--link my-postgres:my-postgres

您的数据库设置不正确。

在Django容器中:127.0.0.1指的是没有运行任何侦听端口5432的服务的Django容器。

所以你的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',                      
    }
  }

只有在构建并启动db和django容器之后,syncdb才有效,然后您可以使用fig / docker-compose / docker手动运行syncdb命令。 我正在考虑创建一个AT作业,让容器运行syncdb本身(并在syncdb之后创建一个admin用户 - 用于创建必要的表)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM