使用Docker连接Django和Postgresql

14

我有两个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',                      
    }
  }

如何使链接生效?谢谢提前。
2个回答

17

您的 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',                      
    }
  }

3
关于数据库同步/迁移的问题?我意识到在构建过程中无法链接postgres容器,但我需要在运行django服务器之前完成同步和迁移。 - syabro
那么在 --link my-postgres:[2nd arg] 中冒号后面的第二个参数将成为有关 Django 的 DATABASESdefault 设置中 HOST 键的值? - pkaramol
是的,语法是 --link <容器名称>:<别名> - Thomasleveil

0

同步数据库(syncdb)只有在构建和启动了db和Django容器之后才能使用,然后您可以使用fig/docker-compose/docker手动运行syncdb命令。 我正在考虑创建一个定时任务(AT job),让容器自己运行syncdb(并在syncdb之后创建一个管理员用户以创建必要的表)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接