快速入门:撰写和Django

预计阅读时间:8分钟

本快速入门指南演示了如何使用Docker Compose设置和运行简单的Django / PostgreSQL应用程序。在开始之前, 请安装Compose

定义项目组成部分

对于此项目,您需要创建一个Dockerfile,一个Python依赖项文件和一个docker-compose.yml文件。(您可以为此文件使用a.yml.yaml扩展名。)

  1. 创建一个空的项目目录。

    您可以将目录命名为易于记忆的名称。此目录是您的应用程序映像的上下文。该目录应仅包含用于构建该映像的资源。

  2. Dockerfile在您的项目目录中创建一个新文件。

    Dockerfile通过一个或多个配置该映像的构建命令来定义应用程序的映像内容。构建完成后,您可以在容器中运行映像。有关更多信息Dockerfile,请参阅《Docker用户指南》 和《Dockerfile参考》

  3. 将以下内容添加到中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要求,可以进一步修改父映像。

  4. 保存并关闭Dockerfile

  5. requirements.txt在您的项目目录中创建一个。

    RUN pip install -r requirements.txt您的中的命令会使用此文件Dockerfile

  6. 在文件中添加所需的软件。

    Django>=3.0,<4.0
    psycopg2-binary>=2.8
    
  7. 保存并关闭requirements.txt文件。

  8. docker-compose.yml在您的项目目录中创建一个名为的文件。

    docker-compose.yml文件描述了构成您的应用程序的服务。在此示例中,这些服务是Web服务器和数据库。撰写文件还描述了这些服务使用哪些Docker映像,它们如何链接在一起,可能需要将其安装在容器内的任何卷。最后,该docker-compose.yml文件描述了这些服务公开的端口。有关此文件如何工作的更多信息,请参见docker-compose.yml参考

  9. 将以下配置添加到文件中。

    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文档

  10. 保存并关闭docker-compose.yml文件。

创建一个Django项目

在此步骤中,通过从上一过程中定义的构建上下文中构建映像来创建Django入门项目。

  1. 更改为您的项目目录的根目录。

  2. 通过运行docker-compose run 命令创建Django项目,如下所示。

    $ sudo docker-compose run web django-admin startproject composeexample .
    

    这指示Composedjango-admin startproject composeexample 使用web服务的映像和配置在容器中运行。由于该web图像尚不存在,因此Compose从当前目录(如中的build: .行所指定)构建它docker-compose.yml

    一旦web服务形象建立,撰写运行它,并执行 django-admin startproject在容器命令。此命令指示Django创建代表Django项目的一组文件和目录。

  3. 在后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设置数据库连接。

  1. 在您的项目目录中,编辑composeexample/settings.py文件。

  2. 将替换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

  3. 保存并关闭文件。

  4. 从项目的顶级目录运行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应用程序应在8000Docker主机上的端口上运行。在Mac的Docker桌面和Windows的Docker桌面http://localhost:8000上,在网络浏览器上转到Django欢迎页面。

    Django范例

    笔记:

    在某些平台上(Windows 10),您可能需要在ALLOWED_HOSTS 内部进行编辑settings.py并将Docker主机名或IP地址添加到列表中。出于演示目的,您可以将值设置为:

    ALLOWED_HOSTS = ['*']
    

    这个值是不是对生产使用是安全的。 有关更多信息,请参考 Django文档

  5. 列出正在运行的容器。

    在另一个终端窗口中,使用docker psdocker 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
    
  6. 使用以下两种方法之一关闭服务并进行清理:

    • 通过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)。

更多撰写文档

文档docsdockercompose编排容器