🍏

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

に公開

はじめに

最近、転職サイトで 「データサイエンティスト募集」 をよく見かけます。回帰分析や統計モデルは難しそうに感じるかもしれませんが、まずは データ分析ができる開発環境 を用意するところから始めましょう。

このガイドでは、Docker を使って Python(Django)+ MySQL + Nginx の環境を最短で構築します。コピペで動くので、初心者の方も安心してください。

開発環境の概要

項目 内容
ホスト OS Windows + Docker Desktop(WSL2 推奨)
FW Django 3.2 以上
DB MySQL 8.0
Web サーバー Nginx 1.21 + uWSGI

Tip: Mac や Linux でも同じ docker compose コマンドで動きます。


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

ツリー表示例(tree コマンド)

django-app/
│  .env
│  docker-compose.yml
│  README.md
│
├─mysql/
│    Dockerfile
│    my.cnf
│
├─nginx/
│    default.conf
│    uwsgi_params
│
└─python/
    Dockerfile
    requirements.txt

.idea/.vscode/ は IDE 用フォルダなので .gitignore で除外しましょう。


環境構築ステップ

Python コンテナ用 Dockerfile

python/Dockerfile

# バージョンを固定したい場合は python:3.12 など指定
FROM python:3

ENV PYTHONUNBUFFERED=1

# ----- ロケール設定(日本語環境用) -----
RUN apt-get update && \
    apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8 \
    LANGUAGE ja_JP:ja \
    LC_ALL ja_JP.UTF-8 \
    TERM xterm

# ----- 作業ディレクトリ -----
RUN mkdir /workspace
WORKDIR /workspace

# ----- Python ライブラリ -----
ADD requirements.txt /workspace/
RUN pip install --upgrade pip setuptools && \
    pip install -r requirements.txt

# ----- プロジェクトソース -----
ADD .. /workspace/

python/requirements.txt

Django>=3.2.7
uwsgi==2.0.20
mysqlclient
pandas         # ★ データ分析に必須
autopep8

pip とは?
Python パッケージ管理ツールです。requirements.txt に必要ライブラリを書いておけば、一括インストールできます。


Nginx で Web サーバーを立てる

Nginx フォルダには 2 つの設定ファイルを置きます。

nginx/uwsgi_params

Nginx から 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;

nginx/default.conf

Django アプリ(app サービス)に 8001 番ポートでプロキシします。

upstream django {
    server app:8001;   # docker-compose 内のサービス名
}

server {
    listen 8000;
    server_name 127.0.0.1;
    charset utf-8;

    location / {
        uwsgi_pass  django;
        include     /etc/nginx/uwsgi_params;
    }
}

uWSGI とは?
WSGI(Python Web サーバー標準)に準拠した アプリケーションサーバー です。Flask や FastAPI にも利用できます。


MySQL コンテナ用 Dockerfile

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 my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 /etc/mysql/conf.d/my.cnf

mysql/my.cnf(抜粋)

[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

# logs
slow_query_log      = 1
slow_query_log_file = mysql-slow.log
long_query_time     = 1

docker-compose.yml を作成

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
    depends_on:
      - app

  app:
    build:
      context: .
      dockerfile: ./python/Dockerfile
    command: >
      uwsgi --socket :8001 \
            --module app.wsgi \
            --py-autoreload 1 \
            --logto /tmp/uwsgi.log
    volumes:
      - ./src:/workspace
    expose:
      - "8001"
    depends_on:
      - db

volumes:
  db-store:

ポイント: depends_on で起動順序を制御し、volumes: で DB データを永続化します。


起動手順

  1. イメージをビルド & 起動

    docker compose up -d --build
    
  2. ブラウザで http://localhost:8000 にアクセス → Django が表示されれば成功

  3. 停止する場合

    docker compose down         # コンテナ停止
    # データも初期化する場合
    docker compose down -v      # ボリューム削除
    

まとめ

  • Docker により PC の環境差分を気にせず再現可能。
  • Django + pandas で Web 開発とデータ分析を同一環境で実施。
  • Nginx / uWSGI によって本番想定の構成をローカルで体験。

リポジトリはこちら。役立ったら Star をお願いします!

Discussion