非エンジニアのスタートアップ 0 年生 ( 5. Django で開発 - その 1 )

こんにちは、株式会社ピケでサーバサイドエンジニアをしている古内です。

こちらの記事は【 5. Django で開発 - その 1 】になります。

1. サービス開発に必要なこと
2. HTML、CSS、JavaScript の基本
3. Python の基本
4. Docker の基本
5. Django で開発 ( 本記事 )
6. GCP にデプロイ

目次

1. この記事について
2. Django の準備
3. Dockerfile の準備
4. docker-compose.yml の準備
5. まとめ


1. この記事について

今回の記事から開発が始まります。

ただし、1 記事に開発のすべてを詰め込むととてつもない量になってしまうため「 5. Django で開発 」を適度に分けて行きます。

分けるにあたって「 5. Django で開発 」に「 その 1 」、「その 2」を付けて進めていきます。

今まではサービスを作らず、「必要な技術」「技術の役割」を解説してきました。

これからは「1. サービス開発に必要なこと」の最後の方に書いた簡易版 Facebook を作っていきます

ここからサクサクコマンドとソースコードを書いていきますので、わからないところは今までの概念や用語を駆使して調べましょう!

2. Django の準備

まずはプロジェクトのディレクトリ等を用意します。

以下の画像のようにディレクトリを作ります。
( コマンドでディレクトリを準備できる方はチャレンジしててください! )

myfacebook がプロジェクトディレクトリで、このディレクトリ内の db ディレクトリがデータベース、web ディレクトリが Django のアプリケーションになります。

web ディレクトリ内で以下のコマンドを実行してください。

docker run --rm -it -v "$(pwd):/tmp" python:3.6 bash

このコマンドの「 -v "$(pwd):/tmp" 」部分は web ディレクトリと Docker 上の /tmp ディレクトリを接続する意味です。

コマンドを実行したら Docker 上のコマンドが実行できるようになりました。

Docker 上の /tmp ディレクトリに移動します。

移動したら以下のコマンドを実行します。

pip install django mysqlclient

このコマンドは django と mysqlclient の2つのライブラリをインストールしています。

インストールしたら以下のコマンドを実行します。

pip freeze > requirements.txt

このコマンドはインストールしたライブラリの管理をするファイルを作成しています。

続いて以下のコマンドで Django プロジェクトを作ります。

django-admin startproject myfacebook

ここまでの作業をすると以下の画像のディレクトリ構造になります。
( Explore や Finder で確認してみてください )

ここまでできたら以下コマンドで Docker を一旦終了します。

exit

これで Django の下準備だけできました。


3. Dockerfile の準備

今度はデータベースと Django アプリケーションの Docker 環境の準備をします。

まずは Django アプリケーションの Dockerfile を作って Docker 環境を準備します。

web ディレクトリ内に Dockerfile を作ります。

ファイル名は Dockerfile です。
そのまんまですね。

以下が Dockerfile の内容です。

FROM python:3.6

RUN mkdir -p /usr/src/app
ENV HOME=/usr/src/app
WORKDIR $HOME

ADD requirements.txt $HOME
RUN pip install -r requirements.txt
ADD . $HOME

一つずつ解説していきます。

FROM python:3.6 は Python のバージョン 3.6 の環境を用意しています。

RUN mkdir -p /usr/src/app は Docker 内でディレクトリを作成しています。

ENV HOME=/usr/src/app は Docker 内でホームディレクトリの設定です。

WORKDIR $HOME は Docker 内でホームディレクトリに移動しています。

ADD requirements.txt $HOME は requirements.txt ファイルを Docker 内のホームディレクトリにコピーしています。

RUN pip install -r requirements.txt は Docker 内でライブラリをインストールしています。

ADD . $HOME は web ディレクトリ内のすべてを Docker 内のホームディレクトリにコピーしています。


続いてデータベースの Dockerfile を準備します。

Dockerfile を準備する前に db ディレクトリ内に custom.cnf ファイルを準備します。

custom.cnf はデータベースの設定です。

以下が custom.cnf の内容です。

[mysqld]
character-set-server=utf8mb4

この設定は文字化けを防いだり絵文字を使えるようにしています。

custom.cnf を作成したら同じディレクトリに Dockerfile を作ります。
( こちらも同様にファイル名は Dockerfile です )

以下が Dockerfile の内容です。

FROM mysql:5.7.19
ADD custom.cnf /etc/mysql/conf.d

Django の Dockerfile と比べたらめちゃくちゃ短いですが解説します。

FROM mysql:5.7.19 は MySQL のバージョン 5.7.19 の環境を用意しています。

ADD custom.cnf /etc/mysql/conf.d は custom.cnf ファイルを Docker内にコピーしています。


ここまで作業すると以下の画像のディレクトリ構造になります。

以上で Dockerfile の準備が終わりました。


4. docker-compose.yml の準備

docker-compose.yml の準備は Django を動かす準備の作業になります。

myfacebook ディレクトリ内に docker-compose.yml を作ります。

以下は docker-compose.yml の内容です。

version: "3"
services:
  web:
    build: ./web
    volumes:
      - ./web:/usr/src/app
    ports:
      - "8000:8000"
    command: python myfacebook/manage.py runserver 0.0.0.0:8000
    links:
      - db:db
    tty: true
    stdin_open: true
  db:
    build: ./db
    volumes:
      - ./db/datadir:/var/lib/mysql
    expose:
      - "3306"
    environment:
      - MYSQL_ROOT_PASSWORD=dev_myfacebook_pw
      - MYSQL_DATABASE=dev_myfacebook_db

version: "3" は docker-compose のバージョンです。

services: は この中にアプリケーションやデータベースなどの設定を書く宣言です。

今回の services の設定は web と db の 2 つの設定からできています。

まずは web から解説します。

web:
  build: ./web
  volumes:
    - ./web:/usr/src/app
  ports:
    - "8000:8000"
  command: python myfacebook/manage.py runserver 0.0.0.0:8000
  links:
    - db:db
  tty: true
  stdin_open: true

build: ./web は Dockerfile があるディレクトリを指定します。

volumes:
  - ./web:/usr/src/app

この設定は、手元のパソコンの web ディレクトリと Docker 上の /usr/src/app を接続しています。

ports:
  - "8000:8000"

この設定は外部に 8000 番のポートで公開しています。

command: python myfacebook/manage.py runserver 0.0.0.0:8000 は Django の起動コマンドです。

links:
  - db:db

この設定は db の名前の Docker を db で接続できるようにしています。

tty: true  stdin_open: true はおまじないだと思ってください。
詳しく知らなくても「これがあると便利」程度の認識で大丈夫です。

続いて db の設定の解説です。

db:
  build: ./db
  volumes:
    - ./db/datadir:/var/lib/mysql
  expose:
    - "3306"
  environment:
    - MYSQL_ROOT_PASSWORD=dev_myfacebook_pw
    - MYSQL_DATABASE=dev_myfacebook_db

build: ./db 等の web とかぶる設定項目は省略します。

expose:
  - "3306"

この設定は内部だけに 3306 番のポートで公開しています。

environment:
  - MYSQL_ROOT_PASSWORD=dev_myfacebook_pw
  - MYSQL_DATABASE=dev_myfacebook_db

はデータベースの設定をしています。

以上が docker-compose.yml の解説です。

ここまで作業をすると以下の画像のディレクトリ構造になります。

ここまで出来ていたら myfacebook ディレクトリで以下コマンドを実行します。

docker-compose build

このコマンドは 今までの設定で Docker 環境を構築しています。

コマンドが完了したら続いて以下のコマンドも実行します。

docker-compose up

このコマンドは myfacebook サービスの起動になります。

このような文字列が出てきたら起動成功です。

Django version 2.0.7, using settings 'myfacebook.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

ブラウザで動いていることを確認します。

確認には http://localhost:8000 で確認できます。

以下の画像の画面が表示されるはずです。

この画面が確認できたら動いています。

おめでとうございます!

以上が docker-compose.yml の準備です。

5. まとめ

今回の記事はインフラ部分がほとんどでした。

そのため今後、設定内容等の変更はほとんどありません。

次は Django で myfacebook の機能を実装していこうと思います。

どんどん楽しい内容になっていくのでがんばりましょう!


=======================================
PR
古内開発教室始めてみました!
この記事読んだけどもうちょっと知りたい!
自分ひとりだと心細い!
そういった方がいましたらぜひこちらを見てください!
古内開発教室
=======================================


次の記事 5. Django で開発 - その 2
前の記事 4. Docker の基本

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

4

furuuchi

株式会社ピケ サーバサイドエンジニア Frasco - https://frasco.io/ Matey - https://matey.jp/ Dish - https://apple.co/2uNBV4Q

Python

1つ のマガジンに含まれています

コメント3件

大変参考になる記事を書いていただきありがとうございます。

2. Django の準備

においてmyfacebookをどのディレクトリに作成したか教えていただくことは可能でしょうか?

/c/Program Files/Docker Toolbox
$mkdir myfacebook

を実行するのかと思いましたがpermission deniedされてしまいました。

補足をしていただれば嬉しい限りです(__)
mozi さん

コメントありがとうございます!

> においてmyfacebookをどのディレクトリに作成したか教えていただくことは可能でしょうか?

私の環境は Mac でホームディレクトリに作っております。
おそらく Windows をお使いですよね?
/Program Files/Docker Toolbox ディレクトリは基本的にシステムが使う場所だと思います。( http://docs.docker.jp/engine/installation/windows.html )

解決方法としては
ユーザーが普段使うディレクトリ ( デスクトップなど ) でおそらくmkdir できると思います!

Windows が手元にないのでちゃんとした確認はできませんがよろしくおねがいします。
ありがとうございます!
Docker Toolbox以下に作成するのかと勘違いしておりました。
ディレクトリを作成できたので、引き続き参考にさせていただきます!
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。