カテゴリー
アーカイブ

03.28
2022

DockerでDjangoの環境構築をしてみた

  • LINE

初めまして!新入社員のKです!!

弊社では、VirtualBoxとVagrantを用いて環境構築することが多いですが、
今回は勉強も兼ねてDockerでDjangoの環境構築をしてみます!
※macにて環境構築を行います

目次

    1. Dockerとは
    2. Dockerをインストールする
    3. 下準備をする
    4. dockerfileを作成する
    5. docker-compose.ymlを作成する
    6. コンテナを立ち上げる
    7. dockerを学習した感想

     

    1. Dockerとは

    DockerとはVirtualBoxと同じように仮想環境を構築する技術ですが、
    VirtualBoxはホストマシン(自分が使っているパソコン)の中に他のOSを入れてその上でミドルウェアを動かすのに対し、
    Dockerはホストマシンのカーネルを利用して他のプロセスからは切り離した「コンテナ」というものを作成し、
    その「コンテナ」の中でアプリケーションを実行させる技術になります。
    なので、DockerはVirtualBoxと比較して軽いのが特徴で大きなメリットと言えるそうです。

    また、Dockerはdockerfileというコード化されたファイルを作成し、環境を構築するのですが、そのDockerfileを共有すれば
    誰でも同じ環境を作成することができるというのも大きなメリットだそうです。
    (この点はVirtualBoxとVagratntを用いて環境構築する際と同じですね)

    では、早速DockerでDjangoの開発環境を構築をしていきましょう!

    2. Dockerをインストールする

    Dockerを利用するためにはDockerをインストールしなければなりませんので、
    以下のサイトからDockerをインストールします。
    Docker Desktop for Mac

    ターミナルで以下コマンドを実行し、バージョンが返ってきたらインストール成功です。

    $docker —version
    Docker version 20.10.7, build f0df350
    $docker-compose —version
    docker-compose version 1.29.2, build 5becea4c

    3. 下準備をする

    ディレクトリを作成します。

    #docker-djangoディレクトリを作成します。
    $mkdir docker-django
    #docker-djangoディレクトリに移動します。
    $cd docker-django

    docker-djangoディレクトリ下でrequirements.txtを作成します。

    Django==3.1
    mysqlclient

    4. dockerfileを作成する

    dockerはコンテナというものを作成すると一つ目の項目で書きましたが、コンテナを作成するためにはdockerイメージが必要になり、
    dockerイメージを作成するものがdockerfileになります。
    dockerイメージとは、コンテナの実行に必要なファイルやメタ情報の集合体のようなものです。
    dockerイメージはDockerHubでたくさんのものが提供されており、今回はpython:3のイメージに追加で色々付け加えた新しいdockerイメージを作成します。

    docker-djangoディレクトリ下でdockerfileを作成します。
    まず初めに完成したdockerfileを見てもらいます。

    FROM python:3 
    ENV PYTHONUNBUFFERED 1 
    RUN mkdir /code
    WORKDIR /code
    COPY requirements.txt /code/
    RUN pip install --upgrade pip && pip install -r requirements.txt
    COPY . /code/

    内容について、順々に見ていきます。

    FROM python:3 

    DockerHubで提供されているpython3のdockerイメージを指定しています。

    ENV PYTHONUNBUFFERED

    python環境変数の一つで、空でない文字列をセットすると標準入出力及び標準エラー出力が全てバッファリングなしになります。

    RUN mkdir /code

    codeディレクトリをルート直下に作成します。

    WORKDIR /code

    作業ディレクトリを指定します。これ以降の処理は指定した/code下で実行されます。

    COPY requirements.txt /code/

    dockerfileと同階層にあるrequirements.txtを /code/にコピーします。

    RUN pip install --upgrade pip && pip install -r requirements.txt

    pip install --upgrade pip && pip install -r requirements.txtを実行します。
    pipをアップグレードして、requirements.txtに記載されているパッケージをインストールします。

    COPY . /code/

    ローカルに /code下をコピーします。
    以上でdockerfileは完成です。

    5. docker-compose.ymlを作成する

    次にdocker-compose.ymlを作成します。
    docker-compose.ymlとはdocker-composeに必要な設定ファイルで
    docker-composeとは複数のコンテナを実行するためのものです。

    docker-djangoディレクトリ下にdocker-compose.ymlを作成します。

    version: '3'
    services:
      db:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: django
          MYSQL_DATABASE: django
          MYSQL_USER: django
          MYSQL_PASSWORD: django
          TZ: 'Asia/Tokyo'
      volumes:
        - ./mysql:/var/lib/mysql
        command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
      web:
        build: .
        command: python3 manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db
    volumes:
      db-store:
    

    docker-compose.ymlの内容について見ていきましょう。

    version: '3'

    docker-compose.ymlのバージョンを記載します。

    services:

    docker-composeではアプリケーションを動かすための各要素をserviceと呼んでいます。
    今回はdbとwebをserviceとして定義します。

    db:
      image:mysql:5.7

    DockerHubで提供されているmysql:5.7のイメージを利用します。

    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: django-db
    MYSQL_USER: django
    MYSQL_PASSWORD: django
    TZ: 'Asia/Tokyo'

    mysqlのユーザーやパスワード、データベース名、タイムゾーンの設定をしています。

    volumes:
      - ./mysql:/var/lib/mysql

    ローカルにmysqlというフォルダを作成し、コンテナ内の/var/lib/mysqlとマウントします。
    これでdbの中身がdocker-compose downしてもデータが残ります。
    ※これがないとdocker-compose downした時にそれまでのdbが消えてしまいます。

    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci

    mysqlの文字コードを指定しています。

    web:
      build: .

    dockerfileを元にdockerイメージを作成します。
    dockerfileからdockerイメージを作成することをbuildと言います。

    command: python3 manage.py runserver 0.0.0.0:8000

    コンテナの起動時に実行されるコマンドです。

    volumes:
      - .:/code

    ローカルのカレントディレクトリに/code下をマウントします。

    ports:
      - "8000:8000" 

    左が公開用のポートで右が転送先コンテナのポートです。
    転送先ポートはrunserver時に指定したポートと合わせる必要があります。

    depends_on:
      - db

    先にdbサービスを起動してからwebサービスを起動するように設定します。

    以上でdocker-compose.ymlは完成です。

    6. コンテナを立ち上げる

    dockerfileとdocker-compose.ymlが作成できたのでそれを元にコンテナを作成します。

    $docker-compose run web django-admin.py startproject project .

    最後に”.”をつけることを忘れないでください。dockerfileで指定した/codeになります。
    このコマンドを実行するとdockerfileがあるディレクトリと同階層にファイルとディレクトリが作成されます。

    $ls
    docker-compose.yml dockerfile manage.py mysql project requirements.txt

    次に、project下にあるsettings.pyのDATABASESを書き換えます。

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'django',
            'USER': 'django',
            'PASSWORD': 'django',
            'HOST': 'db'
        }
    }

    これで環境が構築できているです。
    コンテナを立ち上げてみましょう。

    $docker-compose up

    localhost:8000にアクセスします。
    以下の画面が表示できたら正常にDjango環境が構築できています。

    7. dockerを学習した感想

    VirtualBoxとVagarntで環境構築を行うよりも、比較的に短い時間で環境構築を行うことができました。
    調べてみるとdockerでCI/CDの立ち上げを行ったり、AWSでコンテナを立ち上げたりと、
    様々なことが実現できそうだと感じました。

    Dockerに関する新しいことを学習したらブログを更新したいと思います!
    ありがとうございました!