Djangoの開発環境構築
Django開発環境をDockerで構築するメリット
個人開発を進める場合、個人PCのローカル環境に直接Django環境を構築しすることがあります。しかし個人PCの環境に依存した開発環境を構築してしまうと、その開発環境と他のチームメンバーの開発環境やサーバーの実行環境と差異が生まれてしまい、予期せぬエラーが出てしまう可能性があります。特にDjangoでは開発中にさまざまなpythonパッケージをインストールする必要が出てくるため、開発環境の管理は特に重要となります。
そこで開発環境や実行環境を統一するためにDockerを利用することが推奨されています。Dockerを利用した開発環境整備のメリットとしては下記が挙げられます。
- 環境の再現性
Dockerを使用することで、どのマシンでも同じ環境でDjangoプロジェクトを実行できるため、環境依存の問題が解消されます。これは特にチーム開発やCI/CD(継続的インテグレーション/デリバリー)で重要です - 依存関係の分離
Dockerコンテナ内でDjangoやPythonの依存ライブラリを管理するため、ホストマシンには影響を与えません。これにより、他のプロジェクトとの依存関係の競合が防げます。 - 簡単なセットアップとデプロイ
一度Dockerfileやdocker-compose.ymlを設定してしまえば、プロジェクトのセットアップが簡単になります。新しいメンバーも簡単に開発環境を構築できますし、デプロイにも同じDockerイメージを使えるため、デプロイ作業もシームレスです。 - 複数サービスの統合が容易
Djangoだけでなく、データベース(PostgreSQLやMySQL)、Redis、メッセージブローカーなど、複数のサービスをdocker-compose
を使って簡単に統合し、起動・停止ができます。 - ホスト環境に依存しない
Dockerコンテナはホストマシンの環境に影響されず、異なるOSや設定でも同じ挙動を保証できます。これにより、Mac、Windows、Linuxのユーザー間での環境差異が減ります。
docker compose
Dockerで開発環境を構築する際に便利なツールがdocker composeになります。docker composeは複数のコンテナを作成・管理することができる機能です。例えばバックエンド用にDjangoコンテナを、フロントエンド用にnginxコンテナを、RDBようにpostgresqlコンテナを起動しそれらを一元管理することができます。詳細は下記の記事で解説していますでご参考ください!
Django環境構築
前提
EC2(Amazon Linux 2023, t2.micro)
※クライアントツールからEC2にSSH接続
※EC2にはvenv、djangoがインストール済み
本記事ではEC2にSSH接続後、任意のディレクトリにてvenvの有効化(5行目)、Djangoプロジェクトであるsampleプロジェクトを生成した(7行目)前提で解説を進めていきます。。
# 前提となるディレクトリ構造
# sampleはDjangoプロジェクト
ls
bin db.sqlite3 include lib lib64 manage.py pyvenv.cfg sample
source bin/activate
(myenv) [ec2-user@ip-xxx-xxx-xxx-xxx myenv]$
pip install django==4.2
もし本記事の前提となる環境構築を詳しく知りたい方は、下記の記事の「venvを利用したDjango環境構築」を参考にしてvenvとDjangoの環境を構築してみてください
docker composeによるDjango環境構築
初期の環境構築が完了しましたら、sampleプロジェクトと同階層に3つの設定ファイルであるdocker-compose.yml、Dockerfile(Dockerfileは拡張子なし)、requirements.txtを作成します。1-2行目で現在のディレクトリにあるファイル・ディレクトリを確認した後、vi
でファイルを作成していきます。
続いて29行目のdocker compose up -d
を実行しDockerコンテナ起動とDjangoの開発用サーバー起動を実施します。もう少し詳細に解説します。29行目のdocker compose up -d
を実行すると、7行目のbuild: .
によりカレントディレクトリにあるDockerfileを読み取りに行きます。Dockerfileでは、requirements.txtに記載されているパッケージのインストールやrunserverの実行が行われます。
ls
bin db.sqlite3 include lib lib64 manage.py pyvenv.cfg sample
vi docker-compose.yml
services:
django:
build: .
ports:
- "8000:8000"
volumes:
- .:/code
vi Dockerfile
FROM python:3.10
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
vi requirements.txt
Django==4.2
ls
Dockerfile bin db.sqlite3 docker-compose.yml include lib lib64 manage.py myapp pyvenv.cfg requirements.txt sample
docker comopose up -d
ではDjangoの動作確認をします。EC2にアタッチされているパブリックIPを用いてxxx.xxx.xxx.xxx:8000
のようにブラウザのアドレスバーに入力します。そうすると下図のようなDjangoの初期表示画面を確認することができます。
Djangoで簡単なページを作成し表示を確認
ここまででDjangoプロジェクトの生成からdocker composeによる起動までが終わりました。続いてDjangoでhello worldを表示する簡単なページを構築しアクセスをしてみます。
まずは忘れずにvenvを有効化し、pythonの仮想環境を有効化してください。
# venvの有効化(実施済みなら不要)
ls
bin db.sqlite3 include lib lib64 manage.py pyvenv.cfg sample
source bin/activate
(myenv) [ec2-user@ip-xxx-xxx-xxx-xxx myenv]$
続いてDjangoアプリケーションを追加します。このアプリケーションとはDjangoのwebアプリ全体をさすものではかく、機能群を意味しているととらえてください。例えば、2行目のmyappの部分がarticle(記事機能)、ec(いーっコーマース機能)、search(検索機能)などと名付けます。これにより機能単位で開発ディレクトリを分けて開発することが可能となります。
# Djangoアプリケーションの追加、myappがあることを確認
python manage.py startapp myapp
ls
bin db.sqlite3 include lib lib64 manage.py myapp pyvenv.cfg sample
アプリケーションが追加できたらmyappディレクトリとsampleディレクトの各種ファイルを編集していくことになります。まずはmyappディレクトリのファイルから編集していきましょう。
# myapp/views.pyに追記
from django.http import HttpResponse
def hello_world(request):
return HttpResponse("Hello World")
# myapp/urls.pyを作成
from django.urls import path
from . import views
urlpatterns = [
path('hello/', views.hello_world, name='hello_world'),
]
続いてsampleディレクトリのファイルを編集していきましょう。
# sample/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')), # myappのURLをプロジェクトに追加
]
# sample/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp', # myappを追加
]
お疲れ様でした!あとはmanage.pyのある階層で3行目のpython manage.py runserver 0.0.0.0:8000
を実行しブラウザからhttp://xxx.xxx.xxx.xxx:8000/hello/
と入力してhelloページにアクセスしてみましょう!下図のような画面が表示されたら成功です。
# runserverの実行
ls
bin db.sqlite3 include lib lib64 manage.py myapp pyvenv.cfg sample
python manage.py runserver 0.0.0.0:8000
# ブラウザで下記のアドレスにアクセス(xxx.xxx.xxx.xxxはEC2のパブリックIP)
http://xxx.xxx.xxx.xxx:8000/hello/
まとめ
本記事ではdocker-composeを利用したDjangoの開発環境構築と簡単なページ作成を解説し、シンプルな画面の開発の流れを説明しました。実際にはdocker-compose.ymlファイルやDjangoのsettings.pyに設定を書いたりすることになりますが、まずは本記事の内容を押さえて環境構築の基礎を理解してみてくださいね!