分享

如何使用的Django和PostgreSQL和Docker

 书*金 2018-12-14

https:///django-docker-postgresql/


在本教程中,我们将使用Docker和PostgreSQL创建一个新的Django项目。Django提供内置的SQLite支持,但即使是本地开发,最好使用像PostgreSQL这样的“真实”数据库,它与生产中的内容相匹配。

可以在本地使用类似的工具运行PostgreSQL Postgres.app然而,许多开发者今天的优先选择是使用泊坞窗,创建独立的操作系统的工具。最简单的思考方式是作为一个包含Django项目所需内容的大型虚拟环境:依赖项,数据库,缓存服务以及所需的任何其他工具。

使用Docker的一个重要原因是它完全消除了本地开发设置的任何问题。您只需运行整个项目的Docker镜像,而不必担心在项目中安装或运行本地数据库的软件包。最重要的是,这可以在小组中共享,使团队开发更加简单。

安装Docker

第一步是为本地计算机安装桌面Docker应用程序:

Docker的初始下载可能需要一些时间才能下载。这是一个很大的档案。此时请随意伸展双腿!

Docker完成安装后,我们可以确认正在运行的版本。它至少应该是18版。

Docker Compose是一个额外的工具,自动包含在Docker的Mac和Windows下载中。但是,如果您使用的是Linux,则需要手动添加它。您可以sudo pip install docker-compose在Docker安装完成后运行该命令来执行此操作

Django项目

我们将使用留言板应用Django的初学者它使用可在管理员中更新的SQLite为基本留言板应用程序提供代码。

在桌面上创建一个新目录并将repo克隆到其中。

$ cd ~/Desktop
$ git clone https://github.com/wsvincent/djangoforbeginners.git
$ cd djangoforbeginners
$ cd ch4-message-board-app

然后安装指定的软件包Pipenv并启动一个新shell。

$ pipenv install
$ pipenv shell

migrate在这些更改后确保我们的数据库。

(mb) $ python manage.py migrate

如果您现在使用该python manage.py runserver命令,则可以在http:// localhost:8000上看到我们的应用程序的工作版本

Docker(再次)

希望Docker在这一点上完成安装。要确认安装是否成功,请退出本地服务器,Control+c然后docker run hello-world在命令行上键入您应该看到这样的回复:

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image whi
ch runs the executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client,
which sent it to your terminal.

To try something more ambitious, you can run an Ubuntu container
with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub./

For more examples and ideas, visit:
 https://docs./get-started/

图像和容器

Docker中有两个重要的概念:图像容器

  • 图像:项目中所有软件包的说明列表
  • 容器:图像的运行时实例

换句话说,图像描述了将要发生的事情,而容器实际运行的。

要配置Docker镜像和容器,我们使用两个文件:Dockerfiledocker-compose.yml

Dockerfile包含图像的说明列表,也就是说,在容器的环境中实际发生了什么。

创建一个新Dockerfile文件。

(mb) $ touch Dockerfile

然后在文本编辑器中添加以下代码。

# Pull base image
FROM python:3.7-slim

# Set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Set work directory
WORKDIR /code

# Install dependencies
RUN pip install pipenv
COPY ./Pipfile /code/Pipfile
RUN pipenv install --system --skip-lock

# Copy project
COPY . /code/

在顶部,我们使用Python 3.7 官方Docker镜像接下来我们创建两个环境变量。PYTHONUNBUFFERED确保我们的控制台输出看起来很熟悉,并且不被Docker缓冲,这是我们不想要的。PYTHONDONTWRITEBYTECODE意味着Python不会尝试编写.pyc我们也不想要的文件。

下一行设置WORKDIR/code这意味着/code将来工作目录位于运行任何命令,就像manage.py我们可以使用WORKDIR而不需要记住我们的代码实际定位在Docker上的确切位置。

然后我们安装我们的依赖项,确保我们有最新版本pip,安装pipenv,将本地复制Pipfile到Docker,然后运行它来安装我们的依赖项。RUN命令允许我们在Docker中运行命令,就像在命令行上一样。

我们无法运行Docker容器,直到它有一个图像,所以让我们通过第一次构建图像​​来做到这一点。

$ docker build .

如果成功,你会看到很多输出!

接下来我们需要一个新docker-compose.yml文件。这告诉Docker 如何运行我们的Docker容器。

(mb) $ touch docker-compose.yml

然后输入以下代码。

version: '3.7'

services:
  db:
    image: postgres:10.1-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
  web:
    build: .
    command: python /code/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - 8000:8000
    depends_on:
      - db

volumes:
  postgres_data:

在最上面我们使用最新版本的Compose,它是“3.6”。

db数据库,我们要为Postgres的10.1泊坞窗图像,并使用volumes告诉撰写其中容器应设在我们的码头工人容器。

因为web我们正在指定Web服务的运行方式。First Compose需要从当前目录构建映像并启动服务器0.0.0.0:8000我们volumes用来告诉Compose将代码存储在我们的Docker容器中/code/ports配置让我们自己的8000端口映射到端口8000的泊坞窗容器。这是默认的Django端口。最后depends_on说我们应该db在运行我们的Web服务之前先启动它

最后一部分volumes是因为Compose有一条规则,您必须在顶级volumes键中列出命名卷

Docker已经完成了!

更新到PostgreSQL

我们需要更新我们的留言板应用程序以使用PostgreSQL而不是SQLite。首先安装psycopg2我们的数据库绑定到PostgreSQL。

(mb) $ pipenv install psycopg2-binary

然后更新settings.py文件以指定我们将使用PostgreSQL而不是SQLite。

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db', # set in docker-compose.yml
        'PORT': 5432 # default postgres port
    }
}

我们应该migrate在Docker上使用我们的数据库。

(mb) $ docker-compose run web python /code/manage.py migrate --noinput

此外,由于留言板应用程序需要使用管理员,因此在Docker上创建超级用户。运行以下命令后填写提示。

(mb) $ docker-compose run web python /code/manage.py createsuperuser

运行Docker

我们终于准备好运行Docker了!第一次执行该命令可能需要一段时间,因为Docker必须下载所有必需的内容。但它会缓存这些信息,因此未来的加速会更快。

键入以下命令:

(mb) $ docker-compose up -d --build

我们可以通过导航到http://127.0.0.1:8000/来确认它的工作原理,您将看到与以前相同的主页。

现在转到http://127.0.0.1:8000/admin并登录。您可以添加新帖子,然后在主页上显示它们,就像Django for Beginners中所述

完成后,不要忘记关闭Docker容器。

(mb) $ docker-compose down

快速复审

以下是我们在本文中介绍的术语和概念的简短版本:

  • 图像:项目的“定义”
  • 容器:您的项目实际运行的内容(图像的一个实例)
  • Dockerfile:定义图像的外观
  • docker-compose.yml:一个YAML文件,它接受Dockerfile并添加有关Docker容器在生产中的行为方式的其他说明

我们使用Dockerfile告诉Docker如何构建我们的图像然后我们在容器中运行我们的实际项目泊坞窗,compose.yml文件为我们的码头工人容器应该如何表现在生产的附加信息。

推荐资源

有关Docker本身的更多解释,我写了一个单独的Docker初学者指南如果你想深入了解Docker我自己使用的一个很棒的资源,现在推荐给其他人,那就是潜入Docker视频课程。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多