EC2とdocker composeでDjango環境と簡単なページを構築しよう!

目次

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-sample-top

    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に設定を書いたりすることになりますが、まずは本記事の内容を押さえて環境構築の基礎を理解してみてくださいね!

    よかったらシェアしてね!
    • URLをコピーしました!
    • URLをコピーしました!

    この記事を書いた人

    Hack Luck Labの管理人hakula(ハクラ)です。2012年にSIerに新卒入社し、SE、新規事業、情シスを担当。その後、ITコンサルを経て、現在はバックエンドエンジニア。過去にはC#、SQL Server、JavaScriptで開発を行い、現在はPython、Rest Framework、Postgresql、Linux、AWSなどを使用しています。ノーコードツールやDX関連も興味あり。「技術は価値を生むために使う」ことが信条で、顧客や組織への貢献を重視しています。

    目次