##はじめに
未来電子テクノロジー(https://www.miraidenshi-tech.jp/intern-content/program/)
でインターンをしているrayaと申します。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
##今回の内容
DjangoにDocker-composeをセットアップします。
失敗談も載せています。
mac上でPostgreSQL11.5を使っています。
##Dockerとは
誰もが、どこでもスムーズにアプリケーションを開発、共有、動作できるようにするためのプラットフォームを提供しているサービスです。
1つのパソコンの中で、いくつものサーバーを動かせるようにする仮想化技術を用いることで、WindowsでもLinuxでも使いたい環境で作業ができます。
動作が軽いことと仮想環境の共有がしやすいという特徴があります。
参考:公式サイト(https://www.docker.com/why-docker)
##コンテナとイメージ
Dockerでは、コンテナという形で仮想環境などを共有します。
コンテナに付随してイメージという概念も押さえておきます。
イメージ:アプリケーションの基盤。アプリケーションのために必要な物を備えている
コンテナ:イメージの中でアプリケーションの実行機能を果たす
参考:公式サイト(https://docs.docker.com/get-started/)
##Quickstart
まずDjangoのプロジェクト内にファイルを作ります。
注意:プロジェクトと言ってもDjangoのインストールされた仮想環境ディレクトリが入っているだけのディレクトリです。$django-admin startproject project_name .
で実際にプロジェクトは作らないでください。既にstartprojectコマンドで作成されたプロジェクト内で操作すると後々エラーします。(後述)
プロジェクトディレクトリ直下にDockerfile、requirements.txtファイル、docker-compose.ymlファイルを作成し、Docker-composeを導入します。
最後にデータベースに接続すれば終了です。
参考:公式サイト(https://docs.docker.com/compose/django/)
##Dockerfile
Dockerfileはイメージの中身を定めています。
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
このDockerfileは親となるPython3のイメージによって動きます。
そのイメージを適切な形に定めているのが、requirements.txtファイルです。
ここに記述のあるRUN pip install -r requirements.txt
によって、requirements.txtファイルが動きます。
##requirements.txt
Django>=2.0,<3.0
psycopg2>=2.7,<3.0
##docker-compose.yml
docker-compose.ymlファイルは、このアプリケーションを作る際に利用するサービスを定めます。
今回は、db
とweb
サービスを使用します。
どんなDockerイメージを使うのか、volume、ポート番号が定められています。
version: '3'
services:
db:
image: postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
上記の過程でDjangoにDocker-composeを導入する準備が整いました。
##プロジェクト作成(失敗談込み)
プロジェクトディレクトリで以下のコマンドを実行します。
このコマンドはDocker-composeにcomposeexample
というプロジェクトをコンテナ上で動かすように指示しています。
このコマンドを実行する際には、docker-compose.ymlファイルで定めたweb
サービスイメージが作られます。
Docker-composeはそのイメージを使ってプロジェクトディレクトリやその他のファイルを作ります。
$ sudo docker-compose run web django-admin startproject composeexample .
私は、最初にDocker-composeをセットアップする際に、既存のDjangoプロジェクトディレクトリ(startprojectコマンドでプロジェクトを作成済みのディレクトリ)でここまでの操作を実行しました。
すると、以下のエラーが出ました。
CommandError: /code/manage.py already exists, overlaying a project or app into an existing directory won't replace conflicting files
既にmanage.pyファイルがあるからプロジェクトを作れないよというエラーと思われます。
このエラーが出たので、先ほどの注意点を挙げています。
ということで、新規に仮想環境ディレクトリのみが入ったディレクトリを作成し、そのディレクトリ上で再び、Dockerfile、requirements.txtファイル、docker-compose.ymlファイルを作成した後に、docker-composeコマンドを実行しました。
無事エラーは発生せずに次のステップに進めました。
##データベース接続
Djangoは、デフォルトではsqliteを使用しているので、PostgreSQLに設定します。
プロジェクト直下のsettings.pyファイルの内容を書き換えます。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
あとは、プロジェクトディレクトリの一番上の階層で、以下のコマンドを実行し、ブラウザでhttp://localhost:8000
にアクセスします。
Welcomeページが表示されていれば成功です。
$ docker-compose up