ホストマシンを汚したくない人にオススメ!Docker + Djangoで開発環境作成する方法をまとめた

開発をしているといろんなモジュール、言語のバージョンなどなどが混合し自分のPCの状態がどうなってるか把握しづらくなってきますよね。そんな時は仮想環境を使いましょう。今回はDjangoでWebアプリケーションを作りたいという方向けにDockerで開発環境を作成する方法をまとめました!

(2019-10-13追記)nginxを入れて環境構築する方法を知りたい方はこちらの記事を参照してください。

前提

  • ホスト環境はMac
  • Dockerはすでにインストールされている

Dockerイメージ作成

ではまずPython + Djangoを使うためのDockerのイメージを作成していきましょう。

requirements.txt

django

Dockerfile

FROM python:3.7.4-alpine3.10
RUN mkdir -p /my_project
ENV APP_PATH /my_project
COPY requirements.txt $APP_PATH/
RUN pip install --no-cache-dir -r $APP_PATH/requirements.txt
WORKDIR $APP_PATH

やってること

  • 容量が少ない `alpine`を使用
  • requirementsに書いてあるモジュール群をインストール

イメージ作成実行

$ docker build -t my_app_django ./
Sending build context to Docker daemon  3.072kB
Step 1/6 : FROM python:3.7.4-alpine3.10
 ---> 930a7e894675
Step 2/6 : RUN mkdir -p /my_project
 ---> Running in f8217642fe43
Removing intermediate container f8217642fe43
 ---> 1c6b25ab7d4f
Step 3/6 : ENV APP_PATH /my_project
 ---> Running in 7bb92b8b8af3
Removing intermediate container 7bb92b8b8af3
 ---> 53a2ccacc2b8
Step 4/6 : COPY requirements.txt $APP_PATH/
 ---> ff35cbd63cc1
Step 5/6 : RUN pip install --no-cache-dir -r $APP_PATH/requirements.txt
 ---> Running in 21426a8d8c92
Collecting django (from -r /my_project/requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/d6/57/66997ca6ef17d2d0f0ebcd860bc6778095ffee04077ca8985928175da358/Django-2.2.4-py3-none-any.whl (7.5MB)
Collecting sqlparse (from django->-r /my_project/requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl
Collecting pytz (from django->-r /my_project/requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/87/76/46d697698a143e05f77bec5a526bf4e56a0be61d63425b68f4ba553b51f2/pytz-2019.2-py2.py3-none-any.whl (508kB)
Installing collected packages: sqlparse, pytz, django
Successfully installed django-2.2.4 pytz-2019.2 sqlparse-0.3.0
Removing intermediate container 21426a8d8c92
 ---> f2729b15bccd

これでイメージが作成されました。確認してみましょう。

$ docker images
REPOSITORY             TAG                       IMAGE ID            CREATED              SIZE
my_app_django          latest                    06ba9479513d        About a minute ago   129MB

my_app_djangoというイメージの作成が完了です。では次にコンテナ立ち上げ + Djangoプロジェクトの作成を行なっていきます。

$ docker run --rm --mount type=bind,src=$(pwd),dst=/my_project my_app_django:latest django-admin startproject this_is_my_app_name .

lsしてみてください。新しくファイルが自動生成されていますよね。

$ ls
Dockerfile		manage.py		requirements.txt	this_is_my_app_name

これでdjangoプロジェクトらしくなってきましたね。では次にサーバをdockerで立ち上げて、ブラウザからアクセスできるようにします。後々のことを考えてここでは docker-composeを使ってやってみたいと思います。

docker-compose

version: '3.7'
services:
  django:
    restart: always
    build: .
    volumes:
      - ./:/projects
    command: /bin/sh -c "cd /projects; python manage.py migrate; python manage.py runserver 0:8000"
    ports:
      - 8000:8000

次のコマンドを実行してください。初回なので –buildを付与しています。

$ docker-compose up --build
Creating network "django_docker_default" with the default driver
Building django
Step 1/6 : FROM python:3.7.4-alpine3.10
 ---> 930a7e894675
Step 2/6 : RUN mkdir -p /my_project
 ---> Using cache
 ---> 1c6b25ab7d4f
Step 3/6 : ENV APP_PATH /my_project
 ---> Using cache
 ---> 53a2ccacc2b8
Step 4/6 : COPY requirements.txt $APP_PATH/
 ---> dc03e341253c
Step 5/6 : RUN pip install --no-cache-dir -r $APP_PATH/requirements.txt
 ---> Running in dabcff60e15a
Collecting django (from -r /my_project/requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/d6/57/66997ca6ef17d2d0f0ebcd860bc6778095ffee04077ca8985928175da358/Django-2.2.4-py3-none-any.whl (7.5MB)
Collecting sqlparse (from django->-r /my_project/requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl
Collecting pytz (from django->-r /my_project/requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/87/76/46d697698a143e05f77bec5a526bf4e56a0be61d63425b68f4ba553b51f2/pytz-2019.2-py2.py3-none-any.whl (508kB)
Installing collected packages: sqlparse, pytz, django
Successfully installed django-2.2.4 pytz-2019.2 sqlparse-0.3.0
Removing intermediate container dabcff60e15a
 ---> 27d017bbd646
Step 6/6 : WORKDIR $APP_PATH
 ---> Running in 4d94101e1637
Removing intermediate container 4d94101e1637
 ---> 24508d432658
Successfully built 24508d432658
Successfully tagged django_docker_django:latest
Creating django_docker_django_1 ... done
Attaching to django_docker_django_1
django_1  | Operations to perform:
django_1  |   Apply all migrations: admin, auth, contenttypes, sessions
django_1  | Running migrations:
django_1  |   Applying contenttypes.0001_initial... OK
django_1  |   Applying auth.0001_initial... OK
django_1  |   Applying admin.0001_initial... OK
django_1  |   Applying admin.0002_logentry_remove_auto_add... OK
django_1  |   Applying admin.0003_logentry_add_action_flag_choices... OK
django_1  |   Applying contenttypes.0002_remove_content_type_name... OK
django_1  |   Applying auth.0002_alter_permission_name_max_length... OK
django_1  |   Applying auth.0003_alter_user_email_max_length... OK
django_1  |   Applying auth.0004_alter_user_username_opts... OK
django_1  |   Applying auth.0005_alter_user_last_login_null... OK
django_1  |   Applying auth.0006_require_contenttypes_0002... OK
django_1  |   Applying auth.0007_alter_validators_add_error_messages... OK
django_1  |   Applying auth.0008_alter_user_username_max_length... OK
django_1  |   Applying auth.0009_alter_user_last_name_max_length... OK
django_1  |   Applying auth.0010_alter_group_name_max_length... OK
django_1  |   Applying auth.0011_update_proxy_permissions... OK
django_1  |   Applying sessions.0001_initial... OK
django_1  | Watching for file changes with StatReloader

ここまで来たらOKです。では実際にアクセスできるかブラウザで localhost:8000を開いてみてください。下のような画面が出て来たら成功です!

最後まで読んでいただきありがとうございました!

Related Posts