如何使用PostgreSQL数据库对Django应用程序进行Docker化

时间:2020-02-23 14:30:21  来源:igfitidea点击:

在本教程中,将介绍如何在开发阶段为使用PostgreSQL而不是默认SQLite DB的Django项目设置Docker环境。在上一篇文章中,我们讨论了如何对Django应用程序进行Docker化。

安装Docker Engine

我们需要在服务器/桌面上安装Docker运行时引擎。我们的Docker安装教程应该会很有帮助。

如何在CentOS/Debian/Ubuntu上安装Docker

设定环境

我为此项目设置了一个名为django-postgresql-docker-dev的GitHub存储库。随意进行分叉或者克隆/下载。首先,创建文件夹以保存项目。我的文件夹工作区称为django-postgresql-docker-dev。将CD放入文件夹,然后在IDE中将其打开。

创建Dockerfile

在容器化环境中,所有应用程序都位于容器中。容器本身由几个图像组成。我们可以创建自己的镜像或者使用Docker Hub中的其他镜像。

Dockerfile是Docker读取的Docker文本文档,用于自动创建/构建镜像。我们的Dockerfile将列出我们项目所需的所有依赖项。

创建一个名为Dockerfile的文件。在文件中执行以下内容:

# base image
FROM python:3

#maintainer
LABEL Author="CodeGenes"

# The enviroment variable ensures that the python output is set straight
# to the terminal with out buffering it first
ENV PYTHONBUFFERED 1

#directory to store app source code
RUN mkdir /zuri

#switch to /app directory so that everything runs from here
WORKDIR /zuri

#copy the app code to image working directory
COPY ./zuri /zuri

#let pip install required packages
RUN pip install -r requirements.txt

创建Django requirements.txt文件并添加项目需求。请注意,我有一些可能不需要的要求,但最重要的是Django和psycopg2

Django>=2.1.3,<2.2.0
psycopg2>=2.7,<3.0
django-crispy-forms==1.7.2
djangorestframework==3.8.2
djangorestframework-jwt==1.11.0
Pillow==5.2.0

创建用于保存源代码的文件夹;我是祖里。

使用Docker Compose

来自Docker文档;

Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,我们可以使用YAML文件来配置应用程序服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。

我们的项目使用PostgreSQL进行数据库连接。因此,我们将在docker-compose文件中定义两个服务。第一个服务是db,它是PostgreSQL镜像,第二个服务是zuri,这是我们的项目。创建一个名为docker-compose.yml的文件并添加以下行:

version: "3"
services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: zuri
      POSTGRES_DB: zuri
      POSTGRES_PASS: zuri1234
    volumes:
      - pgdata:/var/lib/posgresql/data
  zuri:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./zuri:/zuri
    command: python manage.py runserver 0.0.0.0:8000
    depends_on:
      - db
volumes:
  pgdata:

depends_on确保Postgres镜像可用于我们的zuri服务,因此它将自动创建并运行。

另外,请注意Postgres图像下的属性。我们已经定义了PostgreSQL要使用的环境变量并定义了一个卷。卷pgdata将由docker创建,并且我们的项目存储的所有数据都将保存在此处。建议这样做,因为如果我们删除容器,它也会删除其中的数据。

定义卷可确保即使我们删除容器,数据也仍然可用。

接下来,我们通过构建docker-compose文件并使用Django命令创建项目来创建Django项目。运行后记下名称zuri;它是docker-compose文件中的服务名称,startproject之后的名称zuri是Django管理员要创建的项目的名称。在项目的根目录中,打开命令行并输入:

$docker-compose run zuri django-admin startproject zuri .

现在,如果我们检查文件夹zuri,我们将看到创建的Django项目!

但是,我们有一个小问题。我们会注意到,创建的文件和文件夹归root拥有。我们可以通过运行以下命令轻松更改此设置:

$sudo chown -R $USER:$USER .

连接到数据库

要连接到数据库,请打开Django设置文件,并通过添加以下内容来编辑数据库设置:

# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'zuri',
        'USER': 'zuri',
        'HOST': 'db',
        'PORT': 5432,
    }
}

名称,用户和主机的参数必须与docker-compose文件中的参数相同。具体来说,host参数是Postgres服务名称的名称。

在Windows中,我们可能需要编辑ALLOWED_HOSTSinsidesettings.py并将Docker主机名或者IP地址添加到列表中。

编辑并添加:

ALLOWED_HOSTS = ['*']

好的,我们现在完成了,开始我们的容器运行:

$docker-compose up

然后访问http://localhost:8000 /

为了测试数据库是否正常工作,让我们进行迁移。打开一个新终端并执行:

$docker-compose run zuri python manage.py migrate

或者如果容器已经在运行:

$docker-compose exec zuri python manage.py migrate

从现在开始,我们将在docker-compose运行zuri [cmd]或者docker-compose exec zuri [cmd]之后运行django命令。