🐑

『Django + Docker 』でデータ分析の環境構築をしてみた!

2024/01/22に公開

はじめに

最近エンジニア向けの転職サイトを見ていると『データサイエンティスト募集』の文言をよく見かけるようになりました。データサイエンティストというと回帰分析や分類問題・統計学などいろいろと難しいそうな業務に取り組んでるイメージがあるかと思います。今回はそんな難しそうな業務は一旦置いといて、その前段階としてとりあえずデータ分析をできる環境を作ってみよう!ってことでやっていきましょう。

開発環境

  • docker for windows
  • FW : Django
  • DB : MySQL

ディレクトリ・ファイル構成

bash
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から見ていきましょう。

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などデータ分析に必要なパッケージを追加する必要があります。

requirements.txt
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_params
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ポートに接続するという設定をしています。

default.conf
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を見てみましょう。

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は以下のようになっています。

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をビルドしています。

docker-compose.yml
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