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镜像和容器,我们使用两个文件:Dockerfile 和docker-compose.yml 。
它Dockerfile 包含图像的说明列表,也就是说,在容器的环境中实际发生了什么。
创建一个新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-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视频课程。
|