【M1 Mac】Djangoの開発環境をdocker-composeで作成する

【M1 Mac】Djangoの開発環境をdocker-composeで作成する

当ページのリンクには広告が含まれています。




M1 MacでもDockerでDjango開発環境作れるの?という疑問に答えていきます!



✓目次


この記事の対象者


・ M1 MacでDjango開発環境をDockerで構築したい方(Django 3.1.2 / PostgreSQL)

この記事でやること


  • Docker Desktop for Macのインストール
  • Dockerfileの作成
  • requirements.txtの作成
  • docker-compose.ymlの作成
  • Djangoプロジェクトの作成
  • DB(postgresql)の設定
  • 起動

Docker Desktop for Macのインストール


以下の記事にまとめられているインストール方法で問題なく導入できます。
Macbook Pro M1(Apple Silicon) で Dockerを動かす - Qiita


インストールが完了したらバージョンと動作確認。


terminal
1
2
3
4
5
$ docker --version
Docker version 20.10.1, build 831ebeae96

$ docker-compose --version
docker-compose version 1.27.4, build 40524192

Dockerfileの作成


まずは任意の空のディレクトリを用意して、Dockerfileを用意していきます。



この記事では``django``という名前の空ディレクトリを作ります。


terminal
1
2
3
$ mkdir ~/django
$ cd ~/django
$ vim Dockerfile


docker-composeを使う場合、docker-compose.ymlがおいてあるディレクトリ名が、コンテナ名やvolume名の接頭字として使用されます。

実際の開発においては、プロジェクトの名前など、意味のあるディレクトリ名にしておいたほうが望ましいです。


例えば、ToDoアプリを作るプロジェクトなら、Todoapppjという名前のフォルダを用意したほうが良いということだね。


また、作成したディレクトリをビルドコンテキストとするので、不要なファイルは含めないようにしましょう。

Dockerfileでは、pythonの実行環境のイメージを作成します。

Dockerfile
1
2
3
4
5
6
7
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
  • Dockerfileの中身を以下にまとめます。
    • FROM python:3: イメージ名にpython3の実行環境のイメージを指定
    • ENV PYTHONUNBUFFERED 1: PYTHONUNBUFFERED`という環境変数に1という値を設定している。環境変数の意味は、pythonの標準出力、標準エラー出力をバッファーにため込まないための設定。1という数字自体に意味はないがこの環境変数に何らかの値を設定するとバッファーを無効化できます。
    • RUN mkdir /codeWORKDIR /code: codeディレクトリを作成し、作業ディレクトリをcodeディレクトリに移動しています。
    • COPY requirements.txt /code/: ビルドコンテキスト上に存在するrequirements.txtをcodeディレクトリ内に置き、RUN pip install -r requirements.txtでpipインストールを実行しています。pipはpythonのパッケージ管理ツールで、pip installコマンドは、-rで指定した、requirements.txtに記載されているパッケージのインストールを実行します。rewuirements.txtは、この後ビルドコンテキスト内に作成しますが、このファイルにはDjangoとPosgreのドライバのパッケージ名を記載します。
    • COPY . /code/: ビルドコンテキストの内容をすべて/code内に置いています。

requirement.txtの作成



terminal
1
$ vim requirements.txt

requirements.txtは、pipインストールコマンドで、インストールするパッケージを定義したもの。

本記事作成時点で最新バージョンの、Djangoパッケージ3.1.2を指定します。

psycopg2は、pythonでPostgreSQLに接続するためにドライバです。こちらについてはバージョンの指定はしません。

requirements.txt
1
2
Django==3.1.2
psycopg


この時点でフォルダの中には、Dockerfileとrequirements.txtの2つのみが存在しているかな?この2つ以外のファイルがあったら別の場所に移すか削除しようね!


docker-compose,ymlの作成


docker-compose.ymlで最後だから頑張ろう!


terminal
1
$ vim docker-compose.yml
docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '3'
services:
db:
image: postgres
environment:
POSTGRES_PASSWORD: password
POSTGRES_USER: postgres
volumes:
- pgdatavol:/var/lib/postgresql/data # postgresqlのデータ領域である/var/lib/postgresql/dataのディレクトリにマウント

web:
build: .
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db

volumes:
pgdatavol: # データ永続化のため、pgdatavolというvolumeを作成



  • 各コードの意味を以下にまとめます。

    • services:: dbとwebの2つが定義されている。2つのコンテナが起動する想定。dbにはpostgresQLを使用。

    • buildには.が`定義されているので、先ほど定義したdockerfileからイメージをビルドして使用する

    • command:: コンテナ起動時に実行されるコマンドを意味している。ここでは、python3でmanage.pyを実行し、引数に開発用に軽量なサーバを立ち上げるrunサーバとlistenするIPアドレス、ポート番号を指定している。manage.pyはDjangoをインストールすると自動で生成されるファイル。ただし、ここに記載しているコマンドはコンテナ実行時にコマンドが渡された場合に上書きされる。そのため、引数にコマンドを渡さなかった場合にdocker-composeのコマンドが実行される

    • volumes:: カレントディレクトリを/codeにbindマウントしている。

    • ports:: 8000番で公開して、コンテナの8000番に転送されるように設定している。転送先のポートは先ほどのrunserverのlistenポートで指定した8000番と合わせる必要がある。

    • depends_on:: dbが指定されている。これはWebサービスを起動する前にdbサービスが起動するように依存関係を定義している。これによってWebサービスを起動する際は自動的にdbサービスが先に起動するようになる。

これで、コンテナを立ち上げる設定ファイルの準備が完了しました。

Djangoプロジェクトの作成



ここまで作成した、Dockerfile, requirements.txt, docker-compose.ymlの3ファイルのみが配置されているフォルダで、以下のコマンドを実行しましょう。

ここでは、プロジェクト名をexamplepjとしていますが、任意のプロジェクト名でOKです。

1
$ docker-compose run web django-admin.py startproject examplepj .


このコマンドは、今いるディレクトリに配置されたdocker-compose.ymlファイルで定義している「web」というコンテナに対して、"django-admin.py startproject examplepj ."というコマンドを実施してね、という命令を出しているんだね。


すると、examplepjフォルダとmanage.pyファイルがカレントディレクトリに自動生成されます。この時点で以下のようなディレクトリ構成になっていると思います。

tree
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.
├── Dockerfile
├── docker-compose.yml
├── examplepj
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-39.pyc
│ │ ├── settings.cpython-39.pyc
│ │ ├── urls.cpython-39.pyc
│ │ ├── views.cpython-39.pyc
│ │ └── wsgi.cpython-39.pyc
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ ├── views.py
│ └── wsgi.py
├── manage.py
├── requirements.txt

DBの設定



作成されたexamplepjのsettings.pyファイルに、DBの設定を記述していきます。

/examplepj/settings.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'password',
'HOST': 'db',
'PORT': 5432
}
}


PASSWORDは簡単なものにしているけど、ちゃんとした開発のときは注意しようね!


起動

デタッチドモードで各サービスを起動します。

terminal
1
$ docker-compose up -d

localhost:8000にブラウザでアクセスすると、以下のようにDjangoの画面が表示されます。

localhost:8000にアクセスした様子


おめでとう!これで開発できるね!


これから本格的にプログラミングを学んでいく方向けに、おすすめのプログラミングスクール・教材を記事にまとめてますので、よろしければ以下の記事も見ていってください。

>> 【厳選4つ】未経験におすすめのプログラミングスクール・教材! - omathin blog


Djangoでアプリ開発する際の初期設定は以下の記事を参照してください。

>> Djangoでアプリ開発する際の初期設定方法を確認する

あわせて読みたい記事





コメント