Quickstart: Compose and Django

预计阅读时间:8分钟

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

Define the project components

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

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

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

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

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

  3. 将以下内容添加到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/
    

    DockerfilePython 3 父映像开头. 通过添加新的code目录来修改父图像. 通过安装在requirements.txt文件中定义的 Python 需求,可以进一步修改父映像.

  4. 保存并关闭Dockerfile .

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

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

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

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

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

    docker-compose.yml文件描述了构建您的应用程序的服务. 在此示例中,这些服务是 Web 服务器和数据库. compose 文件还描述了这些服务使用哪些 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"
        environment:
          - POSTGRES_NAME=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
        depends_on:
          - db
    

    该文件定义了两个服务: db服务和web服务.

    Note:

    这使用内置开发服务器在端口 8000 上运行您的应用程序.不要在生产环境中使用它. 有关详细信息,请参阅Django 文档.

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

Create a Django project

在此步骤中,您将通过从上一个过程中定义的构建上下文构建映像来创建一个 Django 启动项目.

  1. 切换到项目目录的根目录.

  2. 通过运行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 项目的文件和目录.

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

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

  2. 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 映像确定.

  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 应用程序应该在 Docker 主机上的端口8000上运行. 在 Docker Desktop for Mac 和 Docker Desktop for Windows 上,在 Web 浏览器上访问http://localhost:8000以查看 Django 欢迎页面.

    Django example

    Note:

    在某些平台(Windows 10)上,您可能需要在settings.py中编辑ALLOWED_HOSTS并将您的 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. 使用以下任一方法关闭服务并进行清理:

    • 通过在启动应用程序的同一 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

documentation, docs, docker, compose, orchestration, containers

by  icopy.site