Django+Apache環境をDocker Composeで作る

ここではDocker(compose)でDjango+Apache環境を構築してみます。
作成した環境はGitHubで公開しています。
こちら

環境

テスト環境

2環境で実施。

  1. Ubuntu 18.04 LTS
    1.1. Docker、docker-composeインストール済み
    1.2. アーキテクチャ : x86_64
  2. Raspbian(Raspberry Pi3+B)
    2.1. Docker、docker-composeインストール済み
    2.2. アーキテクチャ : armv7l

Dockerで作成する環境

2コンテナで構成します。

  1. DBコンテナ
    1.1. DB:MariaDB
  2. Apache+Djangoコンテナ
    2.1. OS:CentOS7
    2.1. Web:Apache

Ubuntuでの環境構築

ファイル構造

以下のようなファイルを用意します。

  • /
    — docker-compose.yml // DBとWebの2コンテナを管理
    — Dockerfile // Web+Djangoコンテナ用
    — requirements.txt // pipでインストールするライブラリをまとめたファイル
    — wsgi.conf // Apache+Django連携のためにApache側に必要な設定ファイル

docker-compose.yml

全体コード

コンテナ作成時のイメージ

  • DBコンテナは公開されたmariadbのイメージを使用
  • Web+Djangoコンテナは後ほどのDockerfileでイメージ作成

DB各種設定部分

  • dbコンテナ部分のenvironment欄には
    — [mariadb_root_password] : DBの管理者パスワード
    — [mariadb_db_name] : 作成するデータベース名
    — [mariadb_user_name] : 作成するユーザー名
    — [mariadb_user_password] : 作成するユーザーのパスワード
    を設定。

Webコンテナへのコンテナ外容量のマウント

  • 構築環境とコンテナでDjangoプロジェクトを共有したいため、本ファイル構造のルートをコンテナの作業ディレクトリ/codeにマウント
  • webコンテナのvolumes部分に

と記述することで構築対象環境の/mnt/nas_fromをコンテナの/mnt/nas_toとしてマウントすることができます。

コンテナとのポートフォワーディング

  • 起動ホストのポート80に来たリクエストをコンテナのポート80にフォワードする必要があるため

を記述

コンテナにprivileged権限付加

  • コンテナ内でサービスを起動したいが、systemctlを行うにはprivileged権限付加しなければいけない

Dockerfile

全体コード

作業ディレクトリは/code

  • 後ほどターミナルからコンテナに入る際のホームディレクトリ、また構築環境とDjangoプロジェクトを共有するためのディレクトリとして作業ディレクトリ/codeを作成、設定。

pythonライブラリのインストール

  • 別ファイル(requirements.txt)に記載しているpythonライブラリをインストール

Apache側の設定ファイルwsgi.confをインストール

  • ApacheとDjangoを連携させるためにApache側に必要な設定ファイルwsgi.confをコンテナ内Apacheに配備

requirements.txt

全体コード

requirements.txtファイルです。 ここにはpipでインストールするライブラリをいれます。

Djangoのバージョン指定

  • まずDjangoのバージョンによって使えるDBクライアントなども異なってくるため、 バージョンを指定します。

ApacheとDjango連携のためのPythonライブラリ

  • ApacheとDjangoを連携させるために必要なmod_wsgiをインストールします。

DBにpythonから接続するためのドライバ

  • Django2.2にはpymysqlやMySQLdbはまだ対応していなようなので、mysql-connector-pythonを選択

Djangoプロジェクトで使用したいライブラリ

  • Djangoプロジェクトで使用したいライブラリがあればこのファイルに追記します。

wsgi.conf

  • 以下の部分は使用Djangoプロジェクトの名称に置換
    — [django-project] : 使用するDjangoプロジェクトのプロジェクト名

RaspberryPiで使用する際の編集点

docker-compose.yml内、DBコンテナのイメージ変更

  • docker-compose.ymlファイル内dbのimageでmariadbをコメントアウトしてjsurf/rpi-mariadbのコメントを外す

RaspberryPiのアーキテクチャarmv7l(PCはx86_64)ではmariadbの公開イメージが使用できないため、大体のイメージを使用

wsgi.conf内、LoadModule参照先変更

  • wsgi.confファイル内、x86_64用のLoadModule行(2行目)をコメントアウトして、armv7l用のLoadModule行(4行目)のコメントを外す

Djangoプロジェクト側の設定

Djangoプロジェクト側の設定ファイル(setting.py)も編集する必要があります。

[django-project]/[django-project]/setting.pyの編集

受付ホスト名の設定

  • 構築環境にリモートからアクセスする場合、Listenホストを設定します。

DB設定

  • engineのmariadbへの設定、docker-compose.ymlで定義したDB側設定、HOST名、PORT番号の指定。
  • このWeb+Djangoコンテナ側からはホスト名’db’としてアクセスする必要がある。

  • ちなみにコンテナ外からは’db’というホスト名でDBコンテナにアクセスすることはできません。

コメント