Docker で Django 開発環境を構築したいと思います。
Docker を使うメリットは、いろいろあると思いますが、私の場合は、その立ち上がりスピードにとても魅力を感じています。
開発環境を作るとき、今までであれば、Mac に VirtualBox をインストールして、VM をVagrant で構築していました。VirtualBox がインストールされている状態から構築し始めたとしても、数十分から数時間かかっていたと思います。
それが、Docker を使うと、数分から数十分にと、Vagrant + VirtualBox に比べ、大幅に時間が短縮しました。
どちらも、目的は Django でコードを書くことなのですが、Vagrantfile と Dockerfile で環境構築時間を比較すると、立ち上がりスピードは全然違います。
Contents
Docker インストール
まずはじめに、Mac に Docker をインストールします。
Docker Desktop for Mac
https://hub.docker.com/editions/community/docker-ce-desktop-mac
上記より、インストーラーをダウンロードしてインストールします。
Django コンテナの作成
Docker Desktop for Mac のインストールが終わったら、次は Django コンテナを作成します。
requirements.txt
django
pip でインストールする Python パッケージのリストを作成し、requirements.txt という名前で保存します。
Dockerfile
FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code COPY requirements.txt /code/ RUN pip install -r requirements.txt COPY . /code
Dockerfile です。
Docker イメージの作成
docker build -t my-django-app .
Dockerfile から Django 環境の Docker イメージを作成します。
docker build で認証エラーが発生
$ docker build -t my-django-app . Sending build context to Docker daemon 3.072kB Step 1/7 : FROM python:3 Get https://registry-1.docker.io/v2/library/python/manifests/3: unauthorized: incorrect username or password $
docker build を実行すると、認証エラーが出ました。Docker Desktop for Mac では Docker Hub への認証してたのですが、docker コマンドは docker コマンドで、認証が必要のようです。
docker login で解決(Username 気をつけて)
$ docker login Authenticating with existing credentials... Stored credentials invalid or expired Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username (satoru.nakamatsu@gmail.com): Password: Error response from daemon: Get https://registry-1.docker.io/v2/: unauthorized: incorrect username or password $ docker login Authenticating with existing credentials... Stored credentials invalid or expired Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username (satoru.nakamatsu@gmail.com): satorunakamatsu Password: Login Succeeded $
ということで、docker コマンドの認証をしようとしたのですが、少しトラップがあって、Username にデフォルトでメールアドレスが入っているのですが、メールアドレスの方では、認証が通りません。上記の例でいうと、satoru.nakamatsu@gmail.com では認証は通りません。satorunakamatsu の方が正しいです。これは結構ハマりました。
Django の実装
Docker イメージの build が完了したら、Django の実装に入ります。
docker django startproject
docker run --rm -v "$PWD":/code/ my-django-app django-admin.py startproject mysite .
startproject でプロジェクトの雛形を生成します。
docker django startapp
docker run --rm -v "$PWD":/code/ my-django-app django-admin.py startapp app
startapp でアプリケーションの雛形を生成します。
ファイル構成
$ ls Dockerfile manage.py requirements.txt app mysite $
最終的には、このようなファイル構成になりました。
runserver の実行
docker run --rm -v "$PWD":/code/ -p 8000:8000 my-django-app python manage.py runserver 0.0.0.0:8000
それでは、Django のデバッグ用サーバーの runserver を実行し、ブラウザで http://127.0.0.1:8000 にアクセスして見たいと思います。
まとめ
Docker で Django 開発環境を構築しました。
一度このスピード感を味わってしまうと、病みつきになりますね。ただ、本番で本格的に運用するとなると、Kubernetes という高いハードルが出てきますが、Docker は今後ますます重要な技術になってくると思いますので、今のうちに押さえておきたいと思っています。