こんにちは、MSKです。
出退勤を記録するアプリの続きです。
Dockerを使って開発環境と本番環境を用意しようと思っていますが、Dockerを使ったことがないので勉強しながら作っていきます。
関連する記事は以下になります。
出退勤の時間を記録するWebアプリの作り始め!
出退勤時間を記録するアプリのAPIを作る!
出退勤時間を記録するアプリのユーザー登録と認証を実装する!
Djangoの開発環境をDockerで構成してみる!<- この記事はここ!
DjangoのトップページをDocker-Composeで表示する
「django-docker」というディレクトリを作成して、その中に「web」と「app」というディレクトリ、docker-compose.ymlファイルを作成します。
.
├── app
├── docker-compose.yml
└── web
Djangoアプリを作成する
まずDjangoのプロジェクトを準備します。
仮想環境を用意して、Djangoをインストールしてプロジェクトを作成します。
appフォルダに移って次のコマンドを打ちます。
python3 -m venv venv
source venv/bin/activate
pip install Django
django-admin startproject app .
プロジェクトができたので、一度動作を見ておきます。
python manage.py runserver
初期画面が出たらOKです。
pythonコンテナで必要なパッケージをインストールするためにrequirements.txtを作成して次のように記入します。
Django==3.1.4
gunicorn==19.9.0
gunicornはNginxとDjangoの間の通信を高速にやり取りするための「アプリケーションサーバー」です。
本番環境ではrunserverではなく、gunicornなどのアプリケーションサーバーを使うことを推奨されています。
Dockerfileを用意します。
python3.8.3-alpineを使いたかったのですが、うまく行かなかったので今はpython3を使っています。
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/
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app.wsgi:application"]
Nginxのconfファイルを作成する
webサーバーとしてNginxを使います。
Nginxの設定をproject.confファイルとして記述します。
upstream app {
server app:8000;
}
server {
listen 80;
server_name :localhost;
location / {
proxy_pass http://app;
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;
}
}
docker-compose.ymlを作成する
docker-composeを使うためにdocker-compose.ymlファイルを作成します。
version: "3"
services:
app:
build: ./app
expose:
- "8000"
networks:
- app_network
volumes:
- ./app:/code
hostname: app-server
restart: always
web:
image: nginx
ports:
- "80:80"
networks:
- app_network
depends_on:
- app
volumes:
- ./web/project.conf:/etc/nginx/conf.d/default.conf
restart: always
networks:
app_network:
driver: bridge
serviceにフォルダと同じようにappとwebとしています。
appの方がDjangoアプリ、webの方がNginxの構成を記述しています。
appの方では、Dockerfileをbuildしています。
webの方では、nginxのimageを使っています。
また、webではappと連携するためdepends_onにappを指定しています。
ローカルで動作確認
最終的な構成は次のようになりました。
.
├── app
│ ├── Dockerfile
│ ├── app
│ │ ├── __init__.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── manage.py
│ └── requirements.txt
├── docker-compose.yml
└── web
└── project.conf
docker-compose.ymlファイルがある場所で次のコマンドを入力します。
docker-compose up -d --build
buildが行われて、すべてのコンテナが立ち上がったら次のコマンドでコンテナの状況を見てみます。
docker-compose ps
コンテナの状態が見れると思いますので、停止していたりしない場合はブラウザでhttp://127.0.0.1にアクセスします。
Djangoのスタートのページが表示されればOKです。
最後に
とりあえず、dockerでDjangoを起動することはできました。
この次は前回までで作ったアプリをdockerで起動したいと思っています。
必要なことはdatabaseを別コンテナで起動して繋ぎ込みをしてあげることだと思っています。
最後までご覧いただき、ありがとうございます。
「Djangoの開発環境をDockerで構成してみる!」でした。