如何使用PostgreSQL数据库对Django应用程序进行Docker化
在本教程中,将介绍如何在开发阶段为使用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命令。