使用Docker-compose搭建Django的开发环境(个人备忘录)
首先
由于数据库服务器专注于搭建“postgres”环境,因此不需要对Python或Django精通。在开始项目之前,请在任意位置创建工作目录。如果使用docker-compose,将使用docker-compose.yml文件所在的目录名称作为容器名称和卷名称的前缀,因此请创建具有意义的目录名称,例如项目名称。
创建目录
-# djangoというディレクトリの作成
% mkdir django
-# djangoディレクトリに移動
% cd django
为了将Django目录作为构建上下文,在其中不包含不必要的文件。
创建一个Dockerfile来构建Python的执行环境镜像。
% vim Dockerfile
# python3の実行環境のイメージを指定
FROM python:3
# PYTHONUNBUFFEREDという環境変数に1を指定。この環境変数に何かしら設定しておくとバッファーを無効化できる。
ENV PYTHONUNBUFFERED 1
# codeディレクトリを作成
RUN mkdir /code
# 作業ディレクトリをcodeディレクトリに移動
WORKDIR /code
# ビルドコンテキスト上にあるrequirements.txtをcodeディレクトリ内に置く
COPY requirements.txt /code/
# pipインストールを実行している。pipはpythonのパッケージツールで、
# -rで指定したrequirements.txtに記載されているパッケージのインストールを実行する。
# requirements.txtは、ビルドコンテキスト内に作成するがdjangoとPostgresのドライバーのパッケージ名を記述する。
RUN pip install -r requirements.txt
# ビルドコンテキストの内容を全て/code内に置いている。
COPY . /code/
创建requirements.txt
% vim requirements.txt
-# version2.0のDjangoのインストール
Django==2.0
-#pythonでpostgresに接続するためのドライバー
psycopg2
创建docker-compose.yml文件
version: '3'
services:
db:
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
web:
build: .
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
假设服务中有两个容器: “db” 和 “web”。”web” 定义了一个构建命令,所以会使用之前定义的Dockerfile来构建镜像。”db” 使用 “postgres” 的SQL镜像。
命令代表了容器启动时要执行的命令。这里使用 “python3” 来执行 “manage.py”,并指定了参数来启动一个开发用的轻量级服务器 “runserver”,以及要监听的IP地址和端口号。”manage.py” 是在安装Django时自动生成的文件。然而,这里的命令会在容器执行时被传递的命令覆盖。因此,如果没有传递命令参数,将会执行docker-compose的命令。
volumes 将当前目录绑定到 “/code” 目录。
ports 使用8000端口进行公开,并将其转发到容器的8000端口。转发的目标端口号必须与 “runserver” 的端口号相匹配。
depends_on 定义了一个依赖关系,在启动 “web” 服务之前先启动 “db” 服务。
创建Django项目
% docker -compose run web django-admin.py startproject examplepj .
在docker-compose run命令的参数中,指定了定义在yml文件中的”web”服务。接下来,在web服务的容器启动时会执行以下命令。django-admin.py也是通过Django安装创建的。在这里,我们执行django-admin.py来使用”startproject”创建一个django项目。项目名称为examplepj,并将其保存在当前目录。当前目录是在Dockerfile中指定的/code目录。
% ls -l
可以确认当前目录和容器的/code目录已经绑定挂载。
写下数据库的设置并启动用于开发的Web服务器。
% vim examplepj/settings.py
ALLOWED_HOSTS = ['*']
----省略----
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql', #ENGINEにpostgresqlを指定
'NAME': 'postgres', #postgresの指定
'USER': 'postgres', #postgresの指定
'PASSWORD': 'password',
'HOST': 'db', #docker-composeで立ち上げたコンテナはサービス名で名前解決を行うことができるのでHOSTの指定はdbとすることができる。
'PORT': 5432, #postgresqlのデフォルトの5432番ポートを指定
}
}
启动各项服务
% docker-compose up -d
Starting django_db_1 ... done
Creating django_web_1 ... done
可以确保已连接到8000端口。请注意,如果要运行管理用脚本(如manage.py),必须在容器中进行操作,否则可能会失败。因为Python的执行环境是在容器中准备的,所以脚本的执行也要在容器内进行。
在使用Django的教程中,创建一个名为polls的应用程序。
-# pollsアプリケーションのファイルをプロジェクト内に作成
% docker-compose run web python3 manage.py startapp polls
-# views.pyページの変更
% vim polls/views.py
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
当有来自“polls”URL的访问时,定义所显示的消息。
调查索引的根设置
% vim polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
定义了显示创建的index方法结果的内容。
将已创建的urls.py文件从主urls.py文件中导入并进行设置。
% vim examplepj/urls.py
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
通过在容器中添加这段代码可以使Django在ip:8000/polls/上显示index页面,从而能够在开发过程中运行Django。
停止容器
% docker-compose stop