Dockerを用いてDjangoの開発環境を構築してみる
カテゴリ:Pythonの話
はじめに
こんにちは!
インターン生として新しく開発チームに入りました戸川です。
最近はインフラにとても興味があって、現場でよく使われていると聞くDockerについて学んでいこうと思います。
また、株式会社inglowではWebプロモーション成功事例集をまとめた限定資料を無料で配布しています。
Webマーケティングに興味がある方は、下記ページより目を通してみてください。
Dockerとはコンテナ型の仮想環境を作成・配布・実行できるプラットフォームとのことです。Dockerを使えばWebアプリケーションだけでなくサーバーの設定などのインフラもまとめて管理できて、かつバージョンやOSの差を気にすること無く環境の構築ができるというメリットがあります。
ちなみにPythonの仮想環境としばしば比較されることがありますが、Pythonの仮想環境はあくまでPythonの依存関係のみをカプセル化し、DockerはOS全体をカプセル化するという違いがあります。
今回のような小さいアプリだとPythonの仮想環境を使ったほうがむしろ楽かもしれませんが、Dockerに慣れるためにあえてこちらを選択してDjango + PostgreSQLなアプリケーションを作っていきます。
Docker for Mac/Windowsをインストール
公式サイトからDockerアカウントを登録し、Docker desktop for Mac/Windowsをインストールします。
インストールできたら次のコマンドで動作するか確認します。
1 2 3 4 5 |
$ docker --version Docker version 19.03.8, build afacb8b $ docker-compose —version docker-compose version 1.25.5, build 8a1c60f6 |
ここで確認したdocker-composeは、いくつかのコンテナをまとめて構築・実行できるものです。
適当なディレクトリに移ります。
1 2 |
$ mkdir docker-blog $ cd docker-blog |
ディレクトリ直下に次の3つのファイルを作成します。
- Dockerfile
- docker-compose.yml
- requirements.txt
Dockerfileの中身を次のように書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[Dockerfile] # Python3のイメージを基にする FROM python:3 ENV PYTHONUNBUFFERED 1 # ビルド時に/codeというディレクトリを作成する RUN mkdir /code # ワークディレクトリの設定 WORKDIR /code # requirements.txtを/code/にコピーする ADD requirements.txt /code/ # requirements.txtを基にpip installする RUN pip install -r requirements.txt ADD . /code/ |
requirements.txtに必要なソフトウェアを記述します。
1 2 3 4 5 6 |
[requirements.txt] Django # PostgreSQLへ接続するためのドライバ psycopg2 |
docker-compose.ymlには各サービスの構成定義を書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
[docker-compose.yml] version: '3' services: # データベース db: image: postgres environment: - POSTGRES_DB=postgres - POSTGRES_USER=root - POSTGRES_PASSWORD=password volumes: - postgres_data:/var/lib/postgresql/data # Djangoアプリ web: build: . command: python3 manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - db volumes: postgres_data: |
volumes
の記述をしてあげることでデータベースの中身を永続化しています。
プロジェクトの作成
$ docker-compose run web django-admin.py startproject dockerblog .
とコマンドを打ちDjangoプロジェクトを開始します。
成功したら各ファイルが生成されます。
1 2 3 4 5 6 7 8 9 10 11 |
docker-blog ├── Dockerfile ├── docker-compose.yml ├── dockerblog │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py └── requirements.txt |
データベースに接続するためにdockerblog/settings.py
のDAEABASESについて次のように書き換えます。
1 2 3 4 5 6 7 8 9 10 11 12 |
[settings.py] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'root', 'PASSWORD': 'password', 'HOST': 'db', 'PORT': 5432, } } |
$ docker-compose up -d
でコンテナの構築・起動しましょう!-d
オプションでデタッチモードで起動してくれます。
できました!$ docker ps
コマンドで起動しているコンテナを確認できます。
1 2 3 4 |
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 45c2a45e5535 docker-blog_web "python3 manage.py r…" 18 minutes ago Up 4 minutes 0.0.0.0:8000->8000/tcp docker-blog_web_1 914ab5ce54c9 postgres "docker-entrypoint.s…" 18 minutes ago Up 4 minutes 5432/tcp docker-blog_db_1 |
$ docker-compose exec <service> <command>
で起動中のコンテナに対してコマンドを打てます。
blogアプリケーションを作成する場合は次の通り
1 |
$ docker-compose exec web python manage.py startapp blog |
作業を中断する場合には
$ docker-compose stop
再開する場合には
$ docker-compose restart
で再びコンテナを起動できます。
おわりに
以上がDjangoの開発環境をDockerに乗せる方法でした!
今回はアプリケーションとデータベースを簡単に扱っただけなのでDockerの便利さをそこまで感じることが出来なかったかもしれません。
実際には求める環境に近いDockerイメージをDocker Hubからダウンロードして自分好みの環境を作れたり、コンテナをそのまま本番サーバーにデプロイすることが出来たりと多くのメリットを持っています!
これからもインフラについて色々勉強していきますが、最近よく扱うAWSについてもっと体系的に学んでみようと思っています。
SAAというAWSについての資格取得を一つの目標に頑張っていきます!
またwebで集客する方法を別の記事にまとめております。
詳しく解説しているので、web集客について深く知りたい方は、ぜひこちらもご覧ください。
弊社inglowでは、これから広告の運用を考えられている方、あるいはこれから広告代理店に運用をお願いされる方向けに、「業界別Web広告の成功事例」をまとめた資料を無料配布しております。
下記のフォームに入力いただくだけで、無料で資料をダウンロードしていただけます。ぜひご利用下さい。