快速入门:撰写和Django
预计阅读时间:8分钟
本快速入门指南演示了如何使用Docker Compose设置和运行简单的Django / PostgreSQL应用程序。在开始之前, 请安装Compose。
定义项目组成部分
对于此项目,您需要创建一个Dockerfile,一个Python依赖项文件和一个docker-compose.yml
文件。(您可以为此文件使用a.yml
或.yaml
扩展名。)
-
创建一个空的项目目录。
您可以将目录命名为易于记忆的名称。此目录是您的应用程序映像的上下文。该目录应仅包含用于构建该映像的资源。
-
Dockerfile
在您的项目目录中创建一个新文件。Dockerfile通过一个或多个配置该映像的构建命令来定义应用程序的映像内容。构建完成后,您可以在容器中运行映像。有关更多信息
Dockerfile
,请参阅《Docker用户指南》 和《Dockerfile参考》。 -
将以下内容添加到中
Dockerfile
。# syntax=docker/dockerfile:1 FROM python:3 ENV PYTHONUNBUFFERED=1 WORKDIR /code COPY requirements.txt /code/ RUN pip install -r requirements.txt COPY . /code/
这
Dockerfile
始于Python 3父映像。通过添加新code
目录来修改父映像。通过安装requirements.txt
文件中定义的Python要求,可以进一步修改父映像。 -
保存并关闭
Dockerfile
。 -
requirements.txt
在您的项目目录中创建一个。RUN pip install -r requirements.txt
您的中的命令会使用此文件Dockerfile
。 -
在文件中添加所需的软件。
Django>=3.0,<4.0 psycopg2-binary>=2.8
-
保存并关闭
requirements.txt
文件。 -
docker-compose.yml
在您的项目目录中创建一个名为的文件。该
docker-compose.yml
文件描述了构成您的应用程序的服务。在此示例中,这些服务是Web服务器和数据库。撰写文件还描述了这些服务使用哪些Docker映像,它们如何链接在一起,可能需要将其安装在容器内的任何卷。最后,该docker-compose.yml
文件描述了这些服务公开的端口。有关此文件如何工作的更多信息,请参见docker-compose.yml
参考。 -
将以下配置添加到文件中。
version: "3.9" services: db: image: postgres volumes: - ./data/db:/var/lib/postgresql/data environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - db
该文件定义了两个服务:
db
服务和web
服务。笔记:
这将使用内置开发服务器在端口8000上运行您的应用程序。请勿在生产环境中使用它。有关更多信息,请参阅Django文档。
-
保存并关闭
docker-compose.yml
文件。
创建一个Django项目
在此步骤中,通过从上一过程中定义的构建上下文中构建映像来创建Django入门项目。
-
更改为您的项目目录的根目录。
-
通过运行docker-compose run 命令创建Django项目,如下所示。
$ sudo docker-compose run web django-admin startproject composeexample .
这指示Compose
django-admin startproject composeexample
使用web
服务的映像和配置在容器中运行。由于该web
图像尚不存在,因此Compose从当前目录(如中的build: .
行所指定)构建它docker-compose.yml
。一旦
web
服务形象建立,撰写运行它,并执行django-admin startproject
在容器命令。此命令指示Django创建代表Django项目的一组文件和目录。 -
在后
docker-compose
命令完成后,列出项目的内容。$ ls -l drwxr-xr-x 2 root root composeexample -rw-rw-r-- 1 user user docker-compose.yml -rw-rw-r-- 1 user user Dockerfile -rwxr-xr-x 1 root root manage.py -rw-rw-r-- 1 user user requirements.txt
如果您在Linux上运行Docker,则
django-admin
创建的文件由root拥有。发生这种情况是因为容器以root用户身份运行。更改新文件的所有权。$ sudo chown -R $USER:$USER .
如果您在Mac或Windows上运行Docker,则应该已经拥有所有文件的所有权,包括由生成的文件
django-admin
。列出文件只是为了验证这一点。$ ls -l total 32 -rw-r--r-- 1 user staff 145 Feb 13 23:00 Dockerfile drwxr-xr-x 6 user staff 204 Feb 13 23:07 composeexample -rw-r--r-- 1 user staff 159 Feb 13 23:02 docker-compose.yml -rwxr-xr-x 1 user staff 257 Feb 13 23:07 manage.py -rw-r--r-- 1 user staff 16 Feb 13 23:01 requirements.txt
连接数据库
在本部分中,您将为Django设置数据库连接。
-
在您的项目目录中,编辑
composeexample/settings.py
文件。 -
将替换
DATABASES = ...
为以下内容:# settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'PASSWORD': 'postgres', 'HOST': 'db', 'PORT': 5432, } }
这些设置由中指定的 postgres Docker映像确定
docker-compose.yml
。 -
保存并关闭文件。
-
从项目的顶级目录运行docker-compose up命令。
$ docker-compose up djangosample_db_1 is up-to-date Creating djangosample_web_1 ... Creating djangosample_web_1 ... done Attaching to djangosample_db_1, djangosample_web_1 db_1 | The files belonging to this database system will be owned by user "postgres". db_1 | This user must also own the server process. db_1 | db_1 | The database cluster will be initialized with locale "en_US.utf8". db_1 | The default database encoding has accordingly been set to "UTF8". db_1 | The default text search configuration will be set to "english". <...> web_1 | July 30, 2020 - 18:35:38 web_1 | Django version 3.0.8, using settings 'composeexample.settings' web_1 | Starting development server at http://0.0.0.0:8000/ web_1 | Quit the server with CONTROL-C.
此时,您的Django应用程序应在
8000
Docker主机上的端口上运行。在Mac的Docker桌面和Windows的Docker桌面http://localhost:8000
上,在网络浏览器上转到Django欢迎页面。笔记:
在某些平台上(Windows 10),您可能需要在
ALLOWED_HOSTS
内部进行编辑settings.py
并将Docker主机名或IP地址添加到列表中。出于演示目的,您可以将值设置为:ALLOWED_HOSTS = ['*']
这个值是不是对生产使用是安全的。 有关更多信息,请参考 Django文档。
-
列出正在运行的容器。
在另一个终端窗口中,使用
docker ps
或docker container ls
命令列出正在运行的Docker进程。$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES def85eff5f51 django_web "python3 manage.py..." 10 minutes ago Up 9 minutes 0.0.0.0:8000->8000/tcp django_web_1 678ce61c79cc postgres "docker-entrypoint..." 20 minutes ago Up 9 minutes 5432/tcp django_db_1
-
使用以下两种方法之一关闭服务并进行清理:
-
通过
Ctrl-C
在启动它的地方键入相同的shell来停止该应用程序:Gracefully stopping... (press Ctrl+C again to force) Killing test_web_1 ... done Killing test_db_1 ... done
-
或者,要更优雅地关闭,请切换到其他shell,然后从Django示例项目目录的顶层运行 docker-compose。
$ docker-compose down Stopping django_web_1 ... done Stopping django_db_1 ... done Removing django_web_1 ... done Removing django_web_run_1 ... done Removing django_db_1 ... done Removing network django_default
-
关闭应用程序后,就可以安全地删除Django项目目录(例如rm -rf django
)。