アーカイブ
初めまして!新入社員のKです!!
弊社では、VirtualBoxとVagrantを用いて環境構築することが多いですが、
今回は勉強も兼ねてDockerでDjangoの環境構築をしてみます!
※macにて環境構築を行います
目次
- Dockerとは
- Dockerをインストールする
- 下準備をする
- dockerfileを作成する
- docker-compose.ymlを作成する
- コンテナを立ち上げる
- 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に関する新しいことを学習したらブログを更新したいと思います!
ありがとうございました!