猫でもわかるWebプログラミング

試行錯誤しながらエンジニア(プログラマー)として働く猫のブログ。技術的な話や、働き方の話、読書録とか、試行錯誤している日常の話。

Python と Django で Web アプリを作って Docker で動かす: その1

はじめに

最近 Dajngo の使い方を覚えてきたこともあって、Python と Django を使ってアプリを作りたいと思いました。どうせだったら開発の進め方をまとめながら作っていこうと思い、この記事を書いています。

Python 初心者の方などにわかるように書いていきますが、もしわからないところがありましたら、コメントだったり twitter でご質問ください。コマンドを叩いたり、Pythonをインストールしたりできる能力があることを想定しています。*1

なぜPythonを使うのか

高機能だからです。

  • 便利な Model と Migration
  • 管理ツール
  • REST framework

環境

私は Mac を利用していますが、 Docker を使っていくので、Windwos でも問題ないはずです。

Django を入れる

Python はインストール済みだとします。Python は 2 と 3 があるのですが、普通はPython 3 を利用すると思います。

Mac の場合は python3 というコマンドで使えると思います。

$ python3 --version
Python 3.7.6

Mac の場合は pip3 で django をインストールできます。

pip3 install django

Django アプリケーションの作成

django をインストールすると、 django-admin コマンドが使えるようになります。

今回は InvoiceCruiser という名前のアプリを作成します。ディレクトリ構成は以下の通りです。

  • InvoiceCruiser (アプリのルートディレクトリ)
    • app
    • Dockerfile
    • ...
mkdir InvoiceCruiser
cd InvoiceCruiser
django-admin startproject app

startproject で色々ディレクトリが作成されますが、後ほどコードを書く時に説明するので、ここでは気にしないことにします。

DockerでPythonの開発環境を作成する

requirements.txt の用意

Dockerをインストールするのに必要なパッケージを書いた requirements.txt を用意します。

Django==3.0.3

Dockerfile の作成

続いて、 Dockerfile を作成します。 この Dockerfile はまだ動作確認用です。

FROM python:3

RUN mkdir -p /opt
COPY requirements.txt /opt/requirements.txt
COPY app /opt/app

WORKDIR /opt
RUN pip install -r requirements.txt

WORKDIR app
CMD python manage.py runserver

Docker のビルド

このDockerのビルドスプリクトを書きます。 bin/build-docker.sh とします。

#!/bin/sh

docker build --tag="invoice-cruiser-app"

このスクリプトを早速実行します。dockerはインストール済みであるとします。*2必ず Dockerfile と同じディレクトリで実行してください。

sh bin/build-docker.sh

docker-compose

docker-compose.yml も用意します。

version: "3"
services:
  app:
    image: invoice-cruiser-app
    container_name: invoice-cruiser-app
    ports:
      - 8000:8000
    command: python manage.py runserver 0.0.0.0:8000

docker を立ち上げます。

docker-compose up -d

localhost:8000 に接続するとDjangoの画面が見られるはずです。

f:id:yoshiki_utakata:20200211004115p:plain

ディレクトリが同期されるように

現状だと、アプリケーションがリアルタイムに更新されないので、 更新が同期されるようにします。*3

docker-compose.yml を書き換える前に、 必ず docker-compose を終了させておきます。 終了する前に yml を書き換えてしまうと面倒なことになります。

docker-compose down

docker-compose.yml を書き換えます。

  • ./app のように ./ を書かないとうまく動かないようです。
version: "3"
services:
  app:
    image: invoice-cruiser-app
    container_name: invoice-cruiser-app
    ports:
      - 8000:8000
    # volumes を追記
    volumes:
      - ,.app:/opt/app
    command: python manage.py runserver 0.0.0.0:8000

再び docker-compose を起動します。

docker-compose up -d

何も変わってないですが、 localhost:8000 で接続できます。

続きは次回

これで開発の準備は完了です。

何かわからないことがありましたら、コメントやtwitterなどで気軽に質問してください。 忙しくなければ答えます。

参考

*1:Pythonがわからない人は想定していません

*2:簡単にインストールできるので、インストールしてない人はググってインストールしてください。

*3:今の状態だと、docker-build.sh した時にdockerにコードが同期され、それ以降はdocker上にコードがコピーされたり同期されることはないからです。