『Django + Docker 』でデータ分析の環境構築をしてみた!
はじめに
最近エンジニア向けの転職サイトを見ていると『データサイエンティスト募集』の文言をよく見かけるようになりました。データサイエンティストというと回帰分析や分類問題・統計学などいろいろと難しいそうな業務に取り組んでるイメージがあるかと思います。今回はそんな難しそうな業務は一旦置いといて、その前段階としてとりあえずデータ分析をできる環境を作ってみよう!ってことでやっていきましょう。
開発環境
- docker for windows
- FW : Django
- DB : MySQL
ディレクトリ・ファイル構成
PS C:\MyLocalRepository\django-app> tree . /f
C:\MYLOCALREPOSITORY\DJANGO-APP
│ .env
│ docker-compose.yml
│ README.md
│
├─.idea
│ .gitignore
│ django-app.iml
│ modules.xml
│ vcs.xml
│ workspace.xml
│
├─mysql
│ Dockerfile
│ my.cnf
│
├─nginx
│ default.conf
│ uwsgi_params
│
└─python
Dockerfile
requirements.txt
環境構築
ステップ1:Pythonコンテナ用Dockerfileの作成
まずはpythonのDockerfileから見ていきましょう。
# マイナーバージョン以下を指定をしないと、
# コンテナ image を build した時点での最新の python stable version が installされる
FROM python:3
ENV PYTHONBURRERED=1
RUN apt-get update
RUN apt-get -y install locales && \
localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TERM xterm
RUN mkdir /workspace
WORKDIR /workspace
ADD ./python/requirements.txt /workspace/
RUN pip install --upgrade pip
RUN pip install -U setuptools
RUN pip install -r requirements.txt
ADD . /workspace/
今回はpython3系をインストールしていきます。ここではpipを用いてパッケージをインストールしていきます。
pipはPythonのパッケージを管理するためのツールになります。
https://www.sejuku.net/blog/50417
また、pipでpythonのパッケージを管理しているとrequirements.txtを使って指定のパッケージをインストールすることができます。データ分析を行う場合は下記以外にpandasなどデータ分析に必要なパッケージを追加する必要があります。
Django>=3.2.7
uwsgi==2.0.20
mysqlclient
autopep8
これでpythonディレクトリの中身の作成が完了しました。次のステップではnginxディレクトリの中身を作成していきましょう。
ステップ2:nginxでwebサーバーをたてる
nginxディレクトリには設定ファイルdefault.confとuwsgi_paramsを配置しています。
uWSGIとはPythonでWebサービスを動かすためのアプリケーションサーバ(以降、APサーバーと略することがあります。)の一種です。上記のWSGIに則ったアプリケーションを動作させるアプリケーションサーバをWSGIアプリケーションコンテナやWSGIサーバなどと呼びます。uWSGIは、このWSGIアプリケーションコンテナの一種です。つまり、WSGIに準拠したアプリケーションであれば、上で挙げたDjangoやFlask以外でも動かすことが可能です。補足ですが、WSGIサーバーにはuWSGI以外にGunicornというものもあります。
https://www.python.ambitious-engineer.com/archives/1959
では、uwsgi_paramsから見ていきましょう。uwsgi_paramsはuWSGI用のパラメータ定義ファイルです。
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
次に、default.confを見ていきましょう。ここでは、後述するdocker-compose.ymlで起動するサービス名appの8001ポートに接続するという設定をしています。
upstream django {
server app:8001;
}
server {
listen 8000;
server_name 127.0.0.1;
charset utf-8;
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params;
}
}
ステップ3:MySQL用のDockerfile作成
今回はDBにMySQLを使用します。my.confはMySQLの設定ファイルになります。では、Dockerfileを見てみましょう。
FROM mysql:8.0
ENV MYSQL_DATABASE=django_local \
MYSQL_USER=django_user \
MYSQL_PASSWORD=secret \
MYSQL_ROOT_PASSWORD=secret \
TZ=Asia/Tokyo
COPY ./mysql/my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 /etc/mysql/conf.d/my.cnf
Dockerfileでは既存のmy.confを作成したmy.confに置き換えています。参考に今回作成したmy.confは以下のようになっています。
[mysqld]
default-authentication-plugin = mysql_native_password
character_set_server = utf8mb4
collation_server = utf8mb4_0900_ai_ci
# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM
# Error Log
log-error = mysql-error.log
# Slow Query Log
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = 0
# General Log
general_log = 1
general_log_file = mysql-general.log
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
ここまで各ディレクトリの中身をみてきました。ではこれらをまとめて起動するdocker-compose.ymlについてみていきましょう。
ステップ4:docker-compose.ymlの作成
docker-compose.ymlではdb, web, appという3つのサービスを作成しており、その中で上記で作成したDockerfileをビルドしています。
version: "3.8"
services:
db:
build:
context: .
dockerfile: ./mysql/Dockerfile
command: --default-authentication-plugin=mysql_native_password
volumes:
- db-store:/var/lib/mysql
web:
image: nginx:1.21.3-alpine
ports:
- 8000:8000
volumes:
- ./src:/workspace
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
working_dir: /workspace
depends_on:
- app
app:
build:
context: .
dockerfile: ./python/Dockerfile
command: uwsgi --socket :8001 --module app.wsgi --py-autoreload 1 --logto /tmp/tmp.log
volumes:
- ./src:/workspace
expose:
- 8001
depends_on:
- db
volumes:
db-store:
ステップ5:起動手順
起動手順については こちら に記載しましたので、参考にしてください。また、上記で書いたコードも掲載しています。
スター★頂けると嬉しいです!
まとめ
今回は『Django + Docker』でデータ分析用の環境を構築してみました。『Django』と『Docker』については、それぞれ別の記事で投稿予定です。
Discussion