既に作成されたプロジェクトの場合でも対応可能な形のdocker-composeを作成しましたので、仕様を記事にまとめます。
GitHub上にHowtoUseを書いておりますのでどうぞ→GitHub
(DBをデフォルトのsqliteから変更してる場合はまた別の設定が必要になると思います・・・ごめんなさい)
デプロイ環境はDjango+Nginx+Gunicornとなります。
概要
使い方は上記にリンクを用意しておりますGitHubのREADMEを参照ください。
簡単なデプロイを実現させるために、次のようなディレクトリ構成で動作するDjangoデプロイ用のdocker-composeを作りました。
django-nginx-gunicorn-docker/
├ nginx/
│ └ project.conf
├ django/
│ ├ Dockerfile
│ ├ requirements.txt
│ └ [DJANGOPROJECT]
│ ├ manage.py
│ ├ …
│ └ [PROJECTNAME]
└ docker-compose.yml
コンテナでプロジェクトを丸ごとマウントして動作させます。
では設定ファイルをみていきます。
docker-compose
利用するコンテナはDjangoアプリケーション用のもの(Gunicornもこの中で動作)と、リバースプロキシの役割を果たすNginxのコンテナです。
version: '3'
services:
django:
build: ./django
expose:
- "8000"
networks:
- nginx_network
volumes:
- ./django:/code
hostname: django-server
restart: always
nginx:
image: nginx
ports:
- "80:80"
networks:
- nginx_network
depends_on:
- django
volumes:
- ./nginx/project.conf:/etc/nginx/conf.d/default.conf
restart: always
networks:
nginx_network:
driver: bridge
djangoのvolumesのところで、プロジェクト環境をマウントしています。もしコンテナ起動後に編集を行なっても、コンテナをrestartさせることで反映されます。
また、nginxコンテナの方では80:80でポートフォワーディングをしているので、ローカルホストの80番ポートにアクセスが来た際はnginxコンテナの方に受け渡されます。
特段トリッキーなことはしていませんので、composeの説明は終わりです。
Dockerfile
djangoディレクトリにあるDockerfileの説明です。
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
WORKDIR /code/MYPROJECT
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "MYPROJECT.wsgi:application"]
python3系のイメージを利用します。6行目のRUNでDjangoとGunicornをダウンロードしています。(あとついでにPostgres用のライブラリもダウンロードしていますが使っていません。ごめんなさい)
Django==2.2.7
gunicorn==19.9.0
psycopg2
ちなみにDjangoのバージョンですが、当初2.0を指定してGithubにあげた所くっそ怒られました。(セキュリティ警告がいっぱい来た。GitHubのBotから怒りのプルリクもきた。)
project.conf
nginxの設定ファイルです。
upstream django {
server django:8000;
}
server {
listen 80;
server_name :localhost;
location / {
proxy_pass http://django;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
upstreamでリクエストの送信先を指定します。送信先はコンテナのlocalhostとなっています。また、ここで命名したものをプロキシパスの設定で用います。
serverのほうではlistenするポートとプロキシの設定を行なっています。
さいごに
ポートの設定でどはまりしました。。。
みなさんも気をつけましょう;;