docker-composeを用いたDjango+PostgreSQL環境セットアップのメモ
最初に
こんにちは。しょうです。
最近DockerをベースとしたDjango+PostgreSQL環境での
開発にハマっています。
今回は以前AWS EC2で作成したRHEL8仮想サーバ上に構築した
docker+docker-compose環境上にDjango+PostgreSQLをセットアップする
手順を記載していこうと思います。
※他にも色々手順があると思いますが、色々ネットを漁ってこれが
自分の中だとしっくりくるな、と思ったものをベースにしています。
また、Djangoは以下の書籍に合うようにイメージして作成しています。
環境構築メモ
まず、Djangoの起点となるディレクトリを作成する。
[root@ip-10-0-1-4 test_work]# mkdir blogproject
[root@ip-10-0-1-4 test_work]# ls
blogproject
作成したディレクトリに移動して次の3つのデータを用意する。
・Dockerfile:
DockerHubからDockerImageを取得してそれを元に新たなImageを
作るまでの一連の流れをまとめたファイル。
・docker-compose.yml:
このファイルをベースにDocker環境が構築される。
・requirements.txt:
Dockerfile上でpip installをする代わりにインストールを指示するためのもの
内容をそれぞれ以下のログのようにした。
[root@ip-10-0-1-4 test_work]# cd blogproject/
[root@ip-10-0-1-4 blogproject]# vi Dockerfile
[root@ip-10-0-1-4 blogproject]# vi requirements.txt
[root@ip-10-0-1-4 blogproject]# vi docker-compose.yml
root@ip-10-0-1-4 blogproject]# cat requirements.txt
django==2.2.2
psycopg2>=2.7,<3.0
[root@ip-10-0-1-4 blogproject]# cat Dockerfile
# Docker Hubにあるpythonイメージをベースにする
FROM python:3.8
# 環境変数を設定する
ENV PYTHONUNBUFFERED 1
# コンテナ内にcodeディレクトリを作り、そこをワークディレクトリとする
RUN mkdir /code
WORKDIR /code
# ホストPCにあるrequirements.txtをコンテナ内のcodeディレクトリにコピーする
# コピーしたrequirements.txtを使ってパッケージをインストールする
ADD requirements.txt /code
RUN pip install -r requirements.txt
[root@ip-10-0-1-4 blogproject]# cat docker-compose.yml
version: '3'
services:
db:
image: postgres
environment:
- 'POSTGRES_USER=postgres'
- 'POSTGRES_PASSWORD=postgres'
web:
build: .
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
docker-composeコマンドを使用して間接的にdjangoのコマンドを使用する(的なイメージだと思う)
--rmはコンテナを起動するが要が済んだら削除するような動作をする。
[root@ip-10-0-1-4 blogproject]# docker-compose run --rm web django-admin startproject blogproject .
treeコマンドでディレクトリを確認してみると以下のような構造になっているはず。
[root@ip-10-0-1-4 blogproject]# tree /test_work/blogproject/
/test_work/blogproject/
├── blogproject
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── docker-compose.yml
├── Dockerfile
├── manage.py
└── requirements.txt
作成したプロジェクトに存在するsettings.pyを修正する
ALLOWED_HOSTS = ['*']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
Dockerfileとかがあるディレクトリと同じ場所でdocker-composeを実行する
[root@ip-10-0-1-4 blogproject]# docker-compose up
blogproject_db_1 is up-to-date
Creating blogproject_web_1 ... done
Attaching to blogproject_db_1, blogproject_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".
db_1 |
db_1 | Data page checksums are disabled.
db_1 |
db_1 | fixing permissions on existing directory /var/lib/postgresql/data ... ok
db_1 | creating subdirectories ... ok
db_1 | selecting dynamic shared memory implementation ... posix
db_1 | selecting default max_connections ... 100
db_1 | selecting default shared_buffers ... 128MB
db_1 | selecting default time zone ... Etc/UTC
db_1 | creating configuration files ... ok
db_1 | running bootstrap script ... ok
db_1 | performing post-bootstrap initialization ... ok
db_1 | syncing data to disk ... ok
db_1 |
db_1 | initdb: warning: enabling "trust" authentication for local connections
db_1 | You can change this by editing pg_hba.conf or using the option -A, or
db_1 | --auth-local and --auth-host, the next time you run initdb.
db_1 |
db_1 | Success. You can now start the database server using:
db_1 |
db_1 | pg_ctl -D /var/lib/postgresql/data -l logfile start
db_1 |
db_1 | waiting for server to start....2021-06-05 05:57:19.171 UTC [45] LOG: starting PostgreSQL 13.3 (Debian 13.3-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
db_1 | 2021-06-05 05:57:19.172 UTC [45] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1 | 2021-06-05 05:57:19.180 UTC [46] LOG: database system was shut down at 2021-06-05 05:57:19 UTC
db_1 | 2021-06-05 05:57:19.185 UTC [45] LOG: database system is ready to accept connections
db_1 | done
db_1 | server started
db_1 |
db_1 | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
db_1 |
db_1 | waiting for server to shut down....2021-06-05 05:57:19.324 UTC [45] LOG: received fast shutdown request
db_1 | 2021-06-05 05:57:19.326 UTC [45] LOG: aborting any active transactions
db_1 | 2021-06-05 05:57:19.330 UTC [45] LOG: background worker "logical replication launcher" (PID 52) exited with exit code 1
db_1 | 2021-06-05 05:57:19.330 UTC [47] LOG: shutting down
db_1 | 2021-06-05 05:57:19.344 UTC [45] LOG: database system is shut down
db_1 | done
db_1 | server stopped
db_1 |
db_1 | PostgreSQL init process complete; ready for start up.
db_1 |
db_1 | 2021-06-05 05:57:19.448 UTC [1] LOG: starting PostgreSQL 13.3 (Debian 13.3-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
db_1 | 2021-06-05 05:57:19.448 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
db_1 | 2021-06-05 05:57:19.448 UTC [1] LOG: listening on IPv6 address "::", port 5432
db_1 | 2021-06-05 05:57:19.451 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1 | 2021-06-05 05:57:19.456 UTC [64] LOG: database system was shut down at 2021-06-05 05:57:19 UTC
db_1 | 2021-06-05 05:57:19.461 UTC [1] LOG: database system is ready to accept connections
web_1 | Watching for file changes with StatReloader
web_1 | Performing system checks...
web_1 |
web_1 | System check identified no issues (0 silenced).
web_1 |
web_1 | You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
web_1 | Run 'python manage.py migrate' to apply them.
web_1 | June 05, 2021 - 06:09:37
web_1 | Django version 2.2.2, using settings 'blogproject.settings'
web_1 | Starting development server at http://0.0.0.0:8000/
web_1 | Quit the server with CONTROL-C.
djangoが稼働しているサーバのIPアドレスとポート番号を指定してWebブラウザでアクセスしてとりあえず起動することを確認する。
起動しているコンテナにアクセス
[root@ip-10-0-1-4 blogproject]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a622e1f1d80d blogproject_web "python3 manage.py r…" 3 minutes ago Up 55 seconds 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp blogproject_web_1
6810e575e3e8 postgres "docker-entrypoint.s…" 15 minutes ago Up 56 seconds 5432/tcp blogproject_db_1
[root@ip-10-0-1-4 blogproject]# docker exec -it blogproject_web_1 bash
root@a622e1f1d80d:/code#
root@a622e1f1d80d:/code# ls
Dockerfile blogproject docker-compose.yml manage.py requirements.txt
blogpostアプリを作成し、treeでディレクトリを確認
root@a622e1f1d80d:/code# django-admin startapp blogpost
root@a622e1f1d80d:/code# ls
Dockerfile blogpost blogproject docker-compose.yml manage.py requirements.txt
[root@ip-10-0-1-4 blogproject]# tree /test_work/blogproject/
/test_work/blogproject/
├── blogpost
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── blogproject
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-38.pyc
│ │ ├── settings.cpython-38.pyc
│ │ ├── urls.cpython-38.pyc
│ │ └── wsgi.cpython-38.pyc
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── docker-compose.yml
├── Dockerfile
├── manage.py
└── requirements.txt
プロジェクト側のurls.pyを以下の様に変更
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blogpost.urls'))
]
同ディレクトリのsettings.pyを以下の様に修正。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blogpost.apps.BlogpostConfig',
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
アプリ側のurls.pyを以下のようにする。
from django.contrib import admin
from django.urls import path
from .views import helloworldfunc
urlpatterns = [
path('admin/', admin.site.urls),
path('', helloworldfunc)
]
同ディレクトリのviews.pyを以下の様にする
from django.shortcuts import render
from django.http import HttpResponse
def helloworldfunc(request):
return HttpResponse("Hello AWS-Docker-Django-PostgreSQL World!!")
docker-composeを実行してWebブラウザからアクセスするとこんな感じになるはず。
これでおそらくDjango-PostgreSQL環境をDockerで動かすことは出来るはず。
この記事が気に入ったらサポートをしてみませんか?