使用PostgreSQL和Docker启动Django
我是正在未来电子技术做实习的箕牧和广。这次我打算写一下使用PostgreSQL和Docker启动Django的步骤。
由于我是一个编程初学者,所以内容可能存在错误。
如果有错误,请指出,我会尽快修改。
创建一个名为docker_django的文件夹。
在桌面上创建一个名为”docker_django”的文件夹。
$ cd desktop
$ mkdir docker_django
在docker_django文件夹中创建三个文件。
$ cd docker_django
$ touch requirements.txt
$ touch Dockerfile
$ touch docker-compose.yml
要求清单
记录要使用的包。这次只是Django。
django==2.2.2
Dockerfile的中文同义表达:
Docker文件
可以使用Dockerfile来描述从Docker Hub获取镜像并创建新镜像的流程。使用Dockerfile可以轻松创建复杂镜像,并在其他主机操作系统上快速准备相同的环境。
# 一番軽いpythonをインストール
FROM python:3.7-slim
# 環境変数の設定
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# ディレクトリー設定
WORKDIR /code
# Dependenciesをインストール
COPY Pipfile Pipfile.lock /code/
RUN pip install pipenv && pipenv install --system
# projectをコピー。「.」の後にspaceあるからね
COPY . /code/
docker-compose.yml 请将以下内容用中文进行重述,只需要一种选项:
Docker Compose是用于批量操作容器的功能。通过使用”docker run”命令逐个启动和构建容器很麻烦,因为需要考虑启动顺序,使用不同的选项。
Dockerfile只能为每个文件创建一个映像,然而Docker Compose可以同时从Docker Hub获取映像并同时生成和运行多个容器,全部写在一个文件中。
version: '3.7' #Docker Composeのバージョン
services:
web: #コンテナに名前をつける
build: . #Dockerfileがあるディレクトリへのパス
command: python /code/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code #ホストPCのカレントディレクトリとコンテナ内のcodeディレクトリを同期させる
ports:
- 8000:8000
depends_on:
- db
db:
image: postgres:11 #postgresを定義
启动容器,创建Django项目。
启动Docker容器,创建一个名为”site”的项目。
$ docker-compose run --rm web django-admin startproject site .
启动应用程序和迁移命令也是一样的。
$ docker-compose run --rm web django-admin startapp app
$ docker-compose run --rm web python3 manage.py migrate
在运行命令时加上”–rm”选项,这样命令执行后容器会立即被删除。如果忘记加上”–rm”选项,每次执行命令都会创建一个新的容器并累积下来。
编辑settings.py
我想将POSTGRESQL设置为数据库,所以需要编辑settings.py文件。
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': 5432
}
}
...
最后,使用”docker-compose up”命令启动本地服务器。
$ docker-compose up
...
web_1 | Django version 2.2.2, using settings 'blog.settings'
web_1 | Starting development server at http://0.0.0.0:8000/
web_1 | Quit the server with CONTROL-C.
当访问http://127.0.0.1:8000/时,会显示Django的页面。