質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Gunicorn

Gunicorn (Green Unicorn)は、Rubyのunicornをベースに開発されたUNIX向けのPython製HTTPサーバです。他のライブラリとの依存関係がないため、容易にインストールして使用できます。

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Q&A

解決済

1回答

810閲覧

docker-composeでDjango+Nginx+Gunicorn+PostgresSQLの環境を構築したい

agtrer

総合スコア28

Gunicorn

Gunicorn (Green Unicorn)は、Rubyのunicornをベースに開発されたUNIX向けのPython製HTTPサーバです。他のライブラリとの依存関係がないため、容易にインストールして使用できます。

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

0グッド

0クリップ

投稿2023/01/14 13:38

前提

docker-composeでDjango開発環境を構築しています。
開発環境としてDjango+PostgresSQLの環境は構築することが出来たので次のステップとして本番環境用のDjango+Nginx+Gunicorn+PostgresSQLの環境を構築しています。

実現したいこと

docker-composeでDjango+Nginx+Gunicorn+PostgresSQLの環境を構築したい

発生している問題・エラーメッセージ

docker-compose up -d コマンド実行時に下記2つのエラーが発生しています。

File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect gunicorn | conn = _connect(dsn, connection_factory=connection_factory, **kwasync) gunicorn | psycopg2.OperationalError: could not connect to server: Connection refused gunicorn | Is the server running on host "db" (192.168.96.2) and accepting gunicorn | TCP/IP connections on port 5432?
File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect gunicorn | conn = _connect(dsn, connection_factory=connection_factory, **kwasync) gunicorn | django.db.utils.OperationalError: could not connect to server: Connection refused gunicorn | Is the server running on host "db" (192.168.96.2) and accepting gunicorn | TCP/IP connections on port 5432?

dokcer-compose.yml、Dockerfile、gunicorn.conf、requirements.txtはそれぞれ下記のとおりです。

該当のソースコード

dockercompose.yml

1# バージョン 2version: '3' 3 4# サービス 5services: 6 7 # データベース 8 db: 9 image: postgres:13 10 container_name: postgres 11 ports: 12 - 5432:5432 13 volumes: 14 - postgres:/var/lib/postgresql/data 15 environment: 16 POSTGRES_USER: postgres 17 POSTGRES_PASSWORD: postgres 18 POSTGRES_INITDB_ARGS: "--encoding=UTF-8" 19 POSTGRES_DB: mydb 20 hostname: postgres 21 22 # アプリケーションサーバー 23 gunicorn: 24 build: . 25 command: > 26 sh -c "python3 manage.py makemigrations && 27 python3 manage.py migrate && 28 python3 manage.py runserver 0.0.0.0:8000" 29 container_name: gunicorn 30 ports: 31 - "8000:8000" 32 volumes: 33 - .:/code 34 - gunicorn:/var/run/gunicorn 35 depends_on: 36 - db 37 38 # WEBサーバー 39 nginx: 40 image: nginx:1.17.7 41 container_name: nginx 42 ports: 43 - "8080:8080" 44 volumes: 45 - ./gunicorn.conf:/etc/nginx/conf.d/default.conf 46 - gunicorn:/var/run/gunicorn 47 depends_on: 48 - gunicorn 49 50# データボリューム 51volumes: 52 postgres: 53 gunicorn: 54 driver: local

Dockerfile

1FROM python:3.8 2 3ENV PYTHONUNBUFFERED 1 4 5RUN mkdir /code 6WORKDIR /code 7COPY requirements.txt ./ 8 9RUN pip install --upgrade pip 10RUN pip install -r requirements.txt 11 12RUN mkdir -p /var/run/gunicorn 13CMD ["gunicorn", "config.wsgi", "--bind=unix:/var/run/gunicorn/gunicorn.sock"] 14 15ADD . /code 16 17EXPOSE 8000

gunicorn.conf

1upstream gunicorn-django { 2 server unix:///var/run/gunicorn/gunicorn.sock; 3} 4 5server { 6 listen 8080; 7 server_name localhost; 8 9 location / { 10 try_files $uri @gunicorn; 11 } 12 13 location @gunicorn { 14 proxy_pass http://gunicorn-django; 15 } 16}

requirements.txt

1Django>=3.1,<3.2 2psycopg2>=2.8,<2.9 3gunicorn==20.1.0

Djangoのsetting.pyはDATABASEの項目だけを下記のように変更しました。

setting.py

1DATABASES = { 2 'default': { 3 'ENGINE': 'django.db.backends.postgresql_psycopg2', 4 'NAME': 'postgres', 5 'USER': 'postgres', 6 'PASSWORD': 'postgres', 7 'HOST': 'db', 8 'PORT': 5432, 9 } 10}

試したこと

dbに関するエラーだと思い、データベース名、ユーザー名、ホスト、パスワード、およびポートを見直したり、gunicornの設定を変えたりしてみましたが、どこに問題があるのかいまいち分からない状況です。
Django+PostgresSQLの環境では上手くいっていたので、追加したNginx+Gunicorn、おそらくgunicorn.conf なのか、、、分かる方いましたらよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dameo

2023/01/14 15:37

Django+Nginx+Gunicorn+PostgresSQLではなくて Django, Nginx, Gunicorn, PostgresSQLのそれぞれを単品でdockerやdocker-composeなどで自由自在に使えるようになってからDjango+Nginx+Gunicorn+PostgresSQLを「開発環境で」いっぺんに使えるようになりましょう。 本番運用はさらに全く違います。
agtrer

2023/01/17 00:52

アドバイスありがとうございます。単品で一つずつ構成を理解した上で再度修正をおこない、無事に動作させることができました。 本番運用がさらに全く違うということがまだピンときてませんので、これからも勉強を継続して少しずつ理解を深めていこうと思います。
guest

回答1

0

自己解決

今回のエラーの原因はdbがアクセスできる状態になる前にgunicorn、nginxが起動してしまっていたことでした。下記URLを参考にしてhealthcheckを追加したところエラーは消えました。
https://qiita.com/shiena/items/47437f4f7874bf70d664

あとdocker-compose.ymlのアプリケーションサーバーgunicornのcommandの記載においてgunicornの起動ではなく、runserverでDjango内蔵サーバーを起動する記載になっていましたのでそちらも下記のように修正しました。

dockercompose.yml

1command: bash -c "python3 manage.py makemigrations && \ 2python3 manage.py migrate && \ 3gunicorn --workers 3 --bind 0.0.0.0:8080 config.wsgi:application"

投稿2023/01/17 01:01

agtrer

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問