LoginSignup
1
0

More than 3 years have passed since last update.

設定ファイルを編集し docker-compose up を実行する(Django + MySQL④)

Last updated at Posted at 2020-08-26

この記事について

この記事は、Django + MySQLの環境構築を通じてDockerの使い方を学ぶに関連する記事群の Part.4 にあたります。

  1. venvを利用してPythonの仮想環境を構築する
  2. Dockerfileの記述を考える
  3. docker-compose.ymlの記述を考える
  4. 設定ファイルを編集し docker-compose up を実行する ( 当記事 )
  5. 依存関係にあるサービス間のコンテナ起動タイミングを調整する

はじめに

この記事では、djangoプロジェクトの初期設定を行い、前回作成したdocker-compose.ymlを利用して開発サーバの実行を試みます。

djangoの初期設定を行う

ローカル用設定ファイルの作成

settings.pyを編集する前に、settings.pyと同じディレクトリにlocal_settings.pyを作成します。
GitHubなどに公開する場合は、このファイルを管理対象から外しておきます。

config/local_settings.py
SECRET_KEY_LS = '**************************************************'
DB_NAME = "************"
DB_USER = "************"
DB_PASSWORD = "************"

$ django-admin startproject実行時に生成されたconfig/settings.pySECRET KEYSECRET_KEY_LSとして、こちらに記述を移します。
DB_NAMEDB_USERDB_PASSWORDに関しては、前回作成した.envファイルと同じ内容を記述して、MySQLコンテナのDBへDjangoを接続する際、以下ようにsettings.pyからimportして利用します。

設定ファイルの編集

settings.pyを編集します。

config/settings.py
import os
import from .local_settings import SECRET_KEY_LS, DB_NAME, DB_USER, DB_PASSWORD

# (中略)

SECRET_KEY = SECRET_KEY_LS

まずは必要な変数等をimportして、SECRET_KEYに先ほどのSECRET_KEY_LSを代入します。

次に、同ファイルALLOWED_HOSTS127.0.0.1localhostを追加します。

config/settings.py
ALLOWED_HOSTS = ["127.0.0.1", "localhost"]

"localhost"はコンテナ内~/etc/hosts内の記述によって"127.0.0.1"に名前解決されるため内容としては同じものですが、使用感のためにここでは一応両方登録しておきます。

アプリケーションのサーバー自体はdocker-compose.ymlcommandで指定した通り0.0.0.0で走らせますが、ここの記述をlocalhostに限定することによって、ホストマシン以外からの接続を弾くようになっているはずです。(同じWiFi環境下の別端末から接続を試みる限りは、意図通りに設定できているようでした。)

最後に、DBの接続設定に関する項目を編集します。先ほどlocal_settings.pyから必要なものは既にimportしてあるので、それぞれ当てはめていくだけです。

config/settings.py
# Database

DATABASES = {
    'default': {
        'ENGINE': "django.db.backends.mysql",
        'NAME': DB_NAME,
        'USER': DB_USER,
        "PASSWORD": DB_PASSWORD,
        'HOST': "db",
        "PORT": "3306"
    }
}

HOSTの部分は、docker-compose.ymlで命名したMySQL側のサービス名を記入すればOKなので、ここでは"db"、ということになります。PORTは前回までの通りMySQLデフォルトの3306で指定しました。

これで基本的な設定は完了です。

サーバーの実行

ここまでの設定で、イメージとコンテナの立ち上げ、Djangoサーバーの実行までが全て

$ docker-compose up

コマンド一発で行うことができるようになっているはずです。

しかし、実際に実行してみると、特定の条件下である問題が発生します。
これについては、次の記事
5. 依存関係にあるサービス間のコンテナ起動タイミングを調整する
をご参照ください。

動作確認について

サーバー実行時のログとしては、

djst_django | Starting development server at http://0.0.0.0:8000/
djst_django | Quit the server with CONTROL-C.

となりますが、設定の都合上、実際の動作確認は表示されているhttp://0.0.0.0:8000/ではなく、http://127.0.0.1:8000/http://localhost:8000/から行うことになります。

ディレクトリ構成

django_starter
    ├── .venv
    │   └── ()
    ├── config
    │     ├── __init__.py
    │     ├── asgi.py
    │     ├── local_settings.py    <- New!
    │     ├── settings.py
    │     ├── urls.py
    │     ├── wait_for_db.py       <- 別記事参照
    │     └── wsgi.py
    ├── mysql
    │     ├── data                 <- 自動生成
    │     │   └── ()
    │     └── my.cnf
    ├── .env
    ├── docker-compose.yml
    ├── Dockerfile
    ├── manage.py
    └── requirements.txt

コマンド各種

最後に、よく使うコマンドをこちらに書き留めておきます。

# $ pwd
# (略)/django_starter/

# django関連のコマンド ( shell, migrateなど )
$ docker-compose run web python manage.py [command]

# 開発サーバの実行
$ docker-compose up

# パッケージ更新
(.venv) $ pip install [ パッケージ名 ]
(.venv) $ pip freeze > requirements.txt

# コンテナに入る
$ docker-compose run --rm web /bin/bash # bashで入る
# もしくは...
$ docker-compose up -d # バックグラウンドで実行してから...
$ docker exec -it [ コンテナ名 ] /bin/bash # bashで入る

# コンテナの停止
$ docker-compose down

終わりに

以上で、この記事群での目的、docker-composeを利用したDjango + MySQL環境の構築は完了です。
この後自分好みにフロントエンド周りの設定を行なったものを、Djangoのテンプレートリポジトリとして管理し利用していこうと思っています。

取り組んでみた感想として、初学者の自分にとってはDockerだけでなくターミナル周りやネットワークについての基礎的な学習にもきっかけにもなり、やってみて学びが多いものになったと感じています。
とはいえ、依然ターミナルに流れるログを見ていると ( 特にMySQL関連については ) 改善しなければならなさそうな点が山ほど・・・。今後も学習を継続し、本番環境、例えばAmazon ECSでの利用など、より実戦に適した形で使いこなせる状態を目指していきたいと思っています。

ここまでご覧いただき、ありがとうございました。

.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0