【Docker】Django×MySQL×Nginxの selenium入りDockerfile構成

【Docker】Django×MySQL×Nginxの selenium入りDockerfile構成

【Docker】Django×MySQL×Nginxの selenium入りDockerfile構成

Docker構築で必要なファイルは6ファイルです。※構築は『さくらインターネットVPS』で行いました。

  1. pythonのドッカーファイル
  2. pythonの依存パッケージを記載したrequirements.txt
  3. MySQLのドッカーファイル
  4. MySQLの初期設定init
  5. Nginxのコンフィグ
  6. Nginxのuwsgi_params(いわゆるおまじない)
  7. docker-compose.yml

フォルダ構成はこんな感じにしました。

Django_Docker
├── python/
│  ├─── Dockerfile ※1
│  └─── requirements.txt ※2
├── mysql/
│  ├─── Dockerfile ※3
│  └─── init.d/
│    └─── init.sql ※4
├── nginx
│  ├─── uwsgi_params ※5
│  └─── conf/
│    └─── app_nginx.conf ※6
├── docker-compose.yml ※7
├── project/ # Djangoのプロジェクト
│  ├─── プロジェクト名/
│  └─── manage.py
├── static/ # Djangoで読み込ませる固定フォルダ
└── entrypoint
└─── db/ # Django_db他生成されるフォルダやファイル

『※1~7』がコンテナ構成ファイル。『#+メモ』がDjangoプロジェクトの構成ファイルです。

pythonのドッカーファイル

pythonの依存パッケージを記載したrequirements.txt

対応するパッケージについてはPythonとの依存関係を確認してバージョンを記載します。

MySQLのドッカーファイル

最終的に超シンプルになりました。わざわざDockerfileで構成しなくてもよかった感じですが、ここに至る過程があったのでとりあえずDockerfile で上げました。

MySQLの初期設定init

ここに記載するユーザー名は【MySQL】へのログイン用です。Django管理ツールへのログイユーザではありません。

Nginxのコンフィグ

Pythonコンテナから8001ポートで外に出すときの設定です。

吐き出すポートが違う場合は3行目【server python:8001;】を書き換えます。(例:8080の時は server python:8080;)

7行目はnginxが待ち受けるポート。8行目は基本このままでOK。VPSサーバーのIPに変更する必要はありません。

Nginxのuwsgi_params

代り映えのしない定型です。私の様に最後の〆(※;)を忘れるとnginxが起動してくれないので要注意です。

docker-compose.yml

数回ひかかったところを忘れないために【- “33306:3306″】とmysqlの外側ポートを33306に変更してみました。

Djangoのプロジェクトが存在する場合

既にプロジェクトがある場合は、プロジェクトを所定のディレクトリに配置します。

├── project/ # Djangoのプロジェクト
├── static/ # Djangoで読み込ませる固定フォルダ
└── entrypoint
└── db/ # Django_db他生成されるフォルダやファイル

配置が終わったらDockerプロジェクトを起動します。

Djangoのプロジェクトが存在しない場合

プロジェクトが無い場合は先に下記手順でプロジェクトの用意を行います。

  1. Djangoプロジェクトを作成する
  2. プロジェクト名\settings.pyを変更する
  3. Djangoの基本データベース構築(Django管理ツールに入る為の構成)
  4. Djangoの管理者ユーザー作成
  5. 静的ファイルをコピー

Djangoプロジェクトを作成する

『※1~7』の構成が終わるとDockerコンテナが作れる状態になっています。
このまま起動するとDjangoは存在しないので「指示したポートにデータが無い」としてnginxが落ちたり404エラーを吐いたりします。
その為、まず起動準備としてDjangoのデータを用意します。

  1. pythonコンテナを起動する
  2. pythonコンテナの中に入る
  3. pythonコンテナ内でstartprojectコマンドを実行
pythonコンテナを起動する

pythonコンテナの中に入る

コンテナが立ち上がると下のコマンドで中に入れます。

【 root@ec1f5466b768:/code# 】というように表示が変わったらコンテナに無事はいれてます。

pythonコンテナ内でstartprojectコマンドを実行

カレントフォルダが /code# となっていればそのままでOK。code以外のディレクトリに入るる場合は /codeに移動してからコマンドを実行します。

プロジェクト名は、docker-compose.yml 39行目のものと同じ名称にします。

プロジェクト名\settings.pyを変更する

ここまででプロジェクトの基礎データが【Django_Docker\project】内に自動生成されています。
具体的にはこんな感じで構成されている事でしょう。

Django_Docker

(中略)
├── project/
│   ├── プロジェクト名/
│   │    ├─── __pycache__/
│   │    │      ├─── __init__.cpython-38.pyc
│   │    │      ├─── settings.cpython-38.pyc
│   │    │      ├─── urls.cpython-38.pyc
│   │    │      └─── wsgi.cpython-38.pyc
│   │    ├─── __init__.py
│   │    ├─── settings.py
│   │    ├─── urls.py
│   │    └─── wsgi.py
│   └── manage.py
(中略)
└─── db/

これらは全て基礎設定ファイルです。
Djangoの初期画面を出力するにはまずsettings.pyを編集します。

【project\プロジェクト名\settings.py】がvimで開いたら、この中の項目【DATABASES】を修正します。具体的には初期値として登録されているを削除してmysqlの接続を登録します。

注意点はPORTの設定です。
docker-compose.ymlではSQLの出口を33306に変えましたが、ここでは【33306】ではなく【3306】の標準ポートを指定します。
理由は33306は外部との連携に利用されるポートであってDocker内部では3306が利用されているからです。これを33306とした場合、DjangoからMySQLが見えなくなりDBログインエラーが発生します。

最後の行に追加したのはstaticファイルのパスです。
Laravelでは固定ファイルはLaravelプロジェクト内に設置されますが、Djangoでは設置場所の初期値がありません。AWSなんかではこれが逆に使いやすくて良いのですが、今回は『さくらのVPS』で行っているのでDocker構成ファイル内に設置しておきます。

Djangoの基本データベース構築(Django管理ツールに入る為の構成)

この段階ではまだ【entrypoint\db】は空っぽの状態です。下のコマンドを打つとdbディレクトリ内にDjangoの基礎テーブルが生成されます。

成功すると『django_db、mysql、performance_schema、etc』など複数のディレクトリとファイルが生成されます。

Djangoの管理者ユーザー作成

Djangoの基礎構成はここまでで完了していますが、まだDjango管理ツールにログインする事は出来ません。
下のコマンドで管理者の登録を開始します。

実行すると『ユーザー名、メールアドレス、パスワード』の3点を訪ねてくるので解答します。

静的ファイルをコピー

このコマンドを実行すると、staticフォルダにadminというフォルダを含め下のような姿になります。

Django_Docker

(中略)
├── static/
│  └── admin/
│       ├─── css/
│       │      ├─── vendor/
│       │      ├─── autocomplete.css
│       │      ├─── base.css
│       │    (以下略)
│       ├─── fonts/
│       ├─── img/
│       └─── js/
(中略)
└─── db/

CSSやimageなどの固定ファイルはここに収めていく事になります。

下準備終わり、コンテナから抜けてDockerプロジェクトを起動する

これで無事にDjangoプロジェクトが起動したと思います。

まとめ

何とかDocker×Djangoが起動しました。書き方も大体覚えてきたし、あとは実践の積み重ねです。