DockerコンテナでDjango

2017/11/05

はじめに

Dockerコンテナ上にDjangoの開発、実行環境を作りたいなぁ、と思ったので構築メモです。 Dockerエンジン自体はGoogleComputeEngine上で動かしています。

今回は、GCPのプロジェクトが作られている前提で説明を進めていきます。
GCEの仮想マシン作成などはWebUIからも作成できるのですが、説明が面倒くさいので今回はCloudShellからGCE仮想マシンを作って行きます。
CloudShellは、GCPのリソースを管理できる仮想マシンで、GCPのプロジェクトを作成していれば無料で使用することが可能です。 CloudShellの詳細は以下公式ドキュメントを参照してください。
Google Cloud Shell ドキュメント

今回、3つの仮想マシンを操作するので、混乱しないようにプロンプトに仮想マシンを示すようにしています。 使用する仮想マシンは以下の通りです。

項目説明
CloudShellGCPで標準で提供されている仮想マシン。
HostMachineDockerEngineが稼働する仮想マシン。OSはCentOS7です。
Container実際にDjangoが動くDockerコンテナ。OSはCentOS7です。

全体的な流れ

  1. GCEでCentOS7を作成、SSHで接続
  2. docker導入
  3. Dockerfile作成
  4. Dockerイメージとコンテナを作って接続
  5. djangoプロジェクト作成、allowhost設定
  6. django開発用サーバ起動
  7. ブラウザからアクセス

GCEでCentOS7を作成、SSHで接続

以下コマンドで、GCEをのインスタンスを作成します。 後半で必要になるので、作成したインスタンスのEXTERNAL_IP(外部IP)を控えておいてください。 その後、インスタンスに対してSSHで接続します。

(CloudShell)$ gcloud compute instances create example-name --tags http-server --zone asia-east1-a --image centos-7
(CloudShell)$ gcloud compute ssh example-name

GCEインスタンス作成時に使用したオプションは以下の通りです。

オプション名記事内の値説明
INSTANCE_NAMESexample-nameGCEインスタンス名です。オプション名は指定する必要がありません。
zoneasia-east1-aGCEインスタンスを作成するゾーンを指定します。指定しないと、対話形式でゾーンを指定することになります。
tagshttp-serverGCEインスタンスに適用するファイアウォールを指定します。今回はHTTPでの接続を許可するファイアウォールを指定しています。
imagecentos-7GCEインスタンスの元イメージです。デフォルトではdebian-9が指定されています。

docker導入

以下コマンドでDcokerをインストールし、有効化します。

(HostMachine)$ sudo yum install -y docker
(HostMachine)$ sudo systemctl start docker
(HostMachine)$ sudo systemctl enable docker

Dockerfile作成

以下の通りDockerfileを作成します。

FROM centos:7

# Python3.6
RUN yum install -y https://centos7.iuscommunity.org/ius-release.rpm
RUN yum install -y python36u python36u-libs python36u-devel python36u-pip

# Django
RUN pip3.6 install django

Dockerイメージとコンテナを作って接続

カレントディレクトリにDockerfileが存在する状態sudo dockerコマンドを実施し、Dockerイメージを作成します。 ここでは、イメージ名がdjango、タグが1.0で作成しています。
docker runコマンドで、Dockerイメージからコンテナを作成し、接続します。

(HostMachine)$ sudo docker build -t django:1.0 .
(HostMachine)$ sudo docker run -it -p 80:8000 django:1.0

djangoプロジェクト作成、allowhost設定

接続したコンテナには、既にPython3.6やDjangoがインストールされているので、さっそく以下のコマンドでDjangoのプロジェクトを作成します。 今回の例ではmy_prjのという名前でプロジェクトを作成します。
作成したプロジェクトの設定ファイルsettings.pyの、ALLOWED_HOSTS = []ALLOWED_HOSTS = ["(EXTERNAL_IP)"]に書き換えます。 EXTERNAL_IPはGCEインスタンスを作成したときに控えたIPアドレスを記載してください。

(Container)# django-admin startproject my_prj
(Container)# vi my_prj/my_prj/settings.py

django開発用サーバ起動

Djangoの開発用サーバを起動します。

(Container)# python3.6 my_prj/manage.py runserver 0.0.0.0:8000

ブラウザからアクセス

ブラウザから、EXTERNAL_IP(外部IP)を指定してHTTPで接続します。
まだDjangoプロジェクトを作っただけなので、以下のデフォルト画面が表示されればOKです。

It worked!
Congratulations on your first Django-powered page.

Next, start your first app by running python manage.py startapp [app_label].
You're seeing this message because you have DEBUG = True in your Django settings file and you haven't configured any URLs. Get to work!

おわりに

今回はとりあえずの接続確認が目的なので、ソフトウェアの更新などのセキュリティ対策や、ロケール設定を入れていません。 また、コンテナ内にDjangoのプロジェクトフォルダを作っているので、コンテナを停止するとプロジェクトフォルダが消えてしまいます。
なので、実際に開発環境や実行環境を作成する際には、必要なソフトウェアを入れたり、プロジェクトフォルダ用に外部ストレージをマウントしたりしてください。

GCPDockerDjango

GoogleComputeEngineとのファイルやりとり

完全栄養食COMPを食べてます