見出し画像

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ブラウザでアクセスしてとりあえず起動することを確認する。

画像1


起動しているコンテナにアクセス

[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で動かすことは出来るはず。

画像2


この記事が参加している募集

最近の学び

この記事が気に入ったらサポートをしてみませんか?