Quickstart: Compose and Django
预计阅读时间:8分钟
本快速入门指南演示了如何使用 Docker Compose 设置和运行简单的 Django/PostgreSQL 应用程序. 在开始之前,安装 Compose .
Define the project components
对于这个项目,您需要创建一个 Dockerfile、一个 Python 依赖文件和一个docker-compose.yml
文件. (您可以为此文件使用.yml
或.yaml
扩展名.)
-
创建一个空的项目目录.
您可以将目录命名为易于记忆的名称. 此目录是您的应用程序映像的上下文. 该目录应该只包含构建该图像的资源.
-
在项目目录中创建一个名为
Dockerfile
的新文件.Dockerfile 通过一个或多个配置该映像的构建命令定义应用程序的映像内容. 构建后,您可以在容器中运行映像. 有关
Dockerfile
的更多信息,请参阅Docker 用户指南和Dockerfile 参考. -
将以下内容添加到
Dockerfile
.# syntax=docker/dockerfile:1 FROM python:3 ENV PYTHONDONTWRITEBYTECODE=1 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
.此文件由
Dockerfile
中的RUN pip install -r requirements.txt
命令使用. -
在文件中添加所需的软件.
Django>=3.0,<4.0 psycopg2>=2.8
-
保存并关闭
requirements.txt
文件. -
在项目目录中创建一个名为
docker-compose.yml
的文件.docker-compose.yml
文件描述了构建您的应用程序的服务. 在此示例中,这些服务是 Web 服务器和数据库. compose 文件还描述了这些服务使用哪些 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" environment: - POSTGRES_NAME=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres depends_on: - db
该文件定义了两个服务:
db
服务和web
服务.Note:
这使用内置开发服务器在端口 8000 上运行您的应用程序.不要在生产环境中使用它. 有关详细信息,请参阅Django 文档.
-
保存并关闭
docker-compose.yml
文件.
Create a Django project
在此步骤中,您将通过从上一个过程中定义的构建上下文构建映像来创建一个 Django 启动项目.
-
切换到项目目录的根目录.
-
通过运行docker-compose run命令创建 Django 项目,如下所示.
$ sudo docker-compose run web django-admin startproject composeexample .
这指示 Compose 使用
web
服务的映像和配置在容器中运行django-admin startproject composeexample
. 由于web
图像尚不存在,Compose 从当前目录构建它,由build: .
docker-compose.yml
中的行.一旦构建了
web
服务映像,Compose 就会运行它并在容器中执行django-admin startproject
命令. 此命令指示 Django 创建一组代表 Django 项目的文件和目录. -
docker-compose
命令完成后,列出项目的内容.$ ls -l drwxr-xr-x 2 root root composeexample drwxr-xr-x 3 root root data -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 用户身份运行. 更改新文件的所有权.请勿更改 Postgres 文件所在的 data 文件夹的权限,否则 Postgres 将因权限问题无法启动.
$ sudo chown -R $USER:$USER composeexample manage.py
如果您在 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
Connect the database
在本节中,您将为 Django 设置数据库连接.
-
在您的项目目录中,编辑
composeexample/settings.py
文件. -
将
DATABASES = ...
替换为以下内容:# settings.py import os [...] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.environ.get('POSTGRES_NAME'), 'USER': os.environ.get('POSTGRES_USER'), 'PASSWORD': os.environ.get('POSTGRES_PASSWORD'), 'HOST': 'db', 'PORT': 5432, } }
这些设置由
docker-compose.yml
中指定的postgres Docker 映像确定. -
保存并关闭文件.
-
从项目的顶级目录运行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 应用程序应该在 Docker 主机上的端口
8000
上运行. 在 Docker Desktop for Mac 和 Docker Desktop for Windows 上,在 Web 浏览器上访问http://localhost:8000
以查看 Django 欢迎页面.Note:
在某些平台(Windows 10)上,您可能需要在
settings.py
中编辑ALLOWED_HOSTS
并将您的 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
-
使用以下任一方法关闭服务并进行清理:
-
通过在启动应用程序的同一 shell 中键入
Ctrl-C
来停止应用程序: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
).
More Compose documentation
- Docker 撰写概述
- 安装 Docker Compose
- Getting Started with Docker Compose
- Docker Compose 命令行参考
- 撰写文件参考
- 很棒的撰写示例