VPS+CentOS8環境下で、docker-composeを利用し、Djangoの環境構築をしましたのでまとめます。
今回の構築では「docker-compose」でDjango+PostgreSQL+Nginxを連携した設計となっています。
構築に時間がかからず簡単にできるので参考にしてください。
前回、docker-composeの記事はこちらを参照
今回の環境はConoHaVPSを使用しています。
「docker-compose」Django+PostgreSQL+Nginxを連携(CentOS8)
CentOS8環境下で「dockcer-compose」を作成する前に事前に「firewalld」で「IPマスカレード(NAPT)」の許可が必要となります。
この設定をしていないと、「dockcer-compose」実行時に、ビルド中にyum、dnf、pipインストールの名前解決ができずエラーになったり、データベースへの内部アクセスができなくなります。
Docker環境では、NAPTを利用した通信が必要となるため、ここは許可設定をしておくことが重要となります。
※もう一つの解決方法として、「–network host」オプションを指定することで解消します。
こちらで実施したことはないのでメモ程度で。
「Firewalld」CentIPマスカレード(NAPT)の許可設定
Docker構築前にまずはfirewalldの設定を実施します。
Dockerが起動している場合は事前に停止します。
Dockkerが起動している状態で、firewalldの変更をするとDockerが正常に動かない不具合あがあります。
Docker停止
systemctl stop docker
IPマスカレード(NAPT)をfirewalldで許可
$ firewall-cmd --add-masquerade --permanent success $ firewall-cmd --reload success
Docker起動
systemctl start docker
「docker-compose」構築
今回作成した「docker-compose」ですが「django」フォルダ配下で以下の構成とし、Nginxを連携するので「Nginx」フォルダを追加しています。
また、PostgreSQLのデータベースは同フォルダ内に「db-data」フォルダを作成し、ボリュームを共有します
$ tree . |-- Dockerfile |-- db-data |-- docker-compose.yml |-- manage.py |-- mysite | |-- __init__.py | |-- __pycache__ | | |-- __init__.cpython-38.pyc | | |-- settings.cpython-38.pyc | | |-- urls.cpython-38.pyc | | `-- wsgi.cpython-38.pyc | |-- asgi.py | |-- settings.py | |-- urls.py | `-- wsgi.py |-- nginx | |-- Dockerfile | |-- nginx.conf `-- requirements.txt
作成する必要なファイルは以下となります。
- Dockerfile
- docker-compose.yml
- requirements.txt
- Nginxフォルダ配下(Dockerfile、nginx.conf)
それぞれのファイルの設定は以下の通りとなります。
Dockerfile
FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir ./code WORKDIR /code COPY requirements.txt /code/ RUN pip install -r requirements.txt COPY . /code/
docker-compose
$ cat docker-compose.yml version: '3' services: db: image: postgres ports: - 5432:5432 environment: - POSTGRES_PASSWORD=postgres volumes: - ./db-data:/var/lib/postgresql/data container_name: postgres web: restart: always build: . command: bash -c "python manage.py runserver 0.0.0.0:8000 && python manage.py migrate" volumes: - .:/code ports: - 8000:8000 depends_on: - db container_name: django nginx: build: ./nginx ports: - 80:80 depends_on: - web container_name: nginx volumes: db-data: $
requirements.txt
Django psycopg2 gunicorn
Nginx(Dockerfile、nginx.conf)
Nginxを連携する場合は別途、「nginx」フォルダを作成し、配下で「Dockerfile」と「nginx.conf」を作成します。
$ cd nginx/ $ touch Dockerfile $ touch nginx.conf
作成した、各ファイルの内容は以下となります。
Dockerfile
FROM nginx:latest # デフォルトのconfを消して、別の設定を追加 RUN rm /etc/nginx/conf.d/default.conf COPY nginx.conf /etc/nginx/conf.d
nginx.conf
upstream django { # コンテナのサービス名を指定し、名前解決 server web:8000; } server { # 80ポートで待ち受け listen 80; location / { proxy_pass http://django; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; # gzip圧縮 gzip on; gzip_min_length 1k; gzip_types text/css text/javascript application/x-javascript application/javascript application/json image/svg+xml; gzip_disable "msie6"; } } $
「docker-compose」でDjangoプロジェクト作成
上記ファイルの作成が完了したら、次に対象のフォルダ直下で以下コマンドでDjangoプロジェクトを作成します。
$ docker-compose run web django-admin startproject mysite .
プロジェクト実行後、以下のようにプロジェクトのファイル・フォルダが作成されたことを確認できます。
$ ll total 40 -rw-r--r-- 1 root root 147 Apr 28 16:17 Dockerfile drwx------ 19 systemd-coredump root 4096 May 2 15:12 db-data -rw-r--r-- 1 root root 641 Apr 28 15:05 docker-compose.yml -rwxr-xr-x 1 root root 626 Apr 28 16:22 manage.py drwxr-xr-x 3 root root 4096 Apr 28 16:25 mysite drwxr-xr-x 2 root root 4096 Apr 30 10:55 nginx -rw-r--r-- 1 root root 25 Apr 12 16:59 requirements.txt
DjangoをPostgreSQLデータベースに接続
Djangoのデータベース接続をPostgreSQLに設定します。
プロジェクトディレクトリで、「mysite/settings.py」ファイルを編集します。
vi mysite/settings.py
#ALLOWED_HOSTS = [] ALLOWED_HOSTS = ["*"] #DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } #} DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'postgres', 'USER': 'postgres', 'PASSWORD' : 'postgres', 'HOST' : 'db', 'PORT' : 5432, } }
データベースの「HOST」には、「docker-compose」のサービスであるdbを指定することで、コンテナ上で名前解決しアクセスします。
「docker-compose」でDjango+PostgreSQL+Nginx起動
Djangoプロジェクトが正常に作成された後、「docker-compose」で起動します。
$ docker-compose up
ブラウザを起動し、Nginxで設定したポート番号(80)へアクセスするとDjangoのポート(8000)へ転送され、以下のページが表示されると成功となります。
docker-composeを利用した連携の構築は以上となります。
Dockerを構築するならVPSがおすすめです。
エンジニアのオンライン学習
ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。
おすすめオンライン教材 | |
自宅で学習ができるオンラインスクール | |
ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。
コメントを残す