#はじめに
今回Dockerを使ってDjangoの環境構築をしたのでまとめてみたいと思います。
また、DjangoではデフォルトでSQLiteが入っているのですが、PostgreSQLで実装したので、その設定もdockerでやりました。何かの参考になれば嬉しいです。
#dockerfile
FROM ubuntu:latest
RUN apt-get -y update \
&& apt-get -y upgrade \
&& apt-get install -y locales curl python3-distutils \
&& curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \
&& python3 get-pip.py \
&& pip install -U pip \
&& pip install psycopg2-binary \
&& mkdir /code \
&& rm -rf /var/lib/apt/lists/* \
&& localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
WORKDIR /req
ADD requirements.txt /req
RUN pip install -r requirements.txt
# サーバーを立てる場所に移動(djangoのprojectを作成して以降)
WORKDIR /web-version/app
# これでbashとか使わずにrunするだけでサーバーが立つ
CMD python3 manage.py runserver 0:8001
FROM ubuntu:latest
: ubuntuの環境を持ってきています
RUN
: 主な環境構築をします。ubuntu環境ではapt-getを使うことでいろんなものをインストールしたりアップデートしたりできます。
WORKDIR
: フォルダを作成してそのフォルダに移動します。
ADD requirements.txt /req
: requirements.txtをコンテナに持ってきます。保管する場所はreqフォルダの中です。
WORKDIR /web-version/app
CMD python3 manage.py runserver 0:8001
: この2行は、コンテナを立ち上げた時に、すぐにサーバが起動してほしくて書きました。manage.pyのあるフォルダに移動してサーバを立ち上げているだけです。
ただ、まだプロジェクトを作成していない段階で実行してもmanage.pyがないのでエラーが起きます。
なので、はじめはCMD ["bash"]
として、シェルに入ってプロジェクトを作ると良いです。
また、runserverの後にポートを指定することで、全てのIPからのリクエストを受け付けることができて、コンテナからサーバを立ち上げても、localhostで開くことができました。
詳しくは、djangoの公式サイトをみてください。
django
#docker-compose.yml
version: "3"
volumes:
db-data:
services:
web:
build: .
container_name: "web-django"
ports:
- "8001:8001"
volumes:
- ".:/web-version/"
# 下二行は-itと同じ役割
tty: true
stdin_open: true
depends_on:
- db
db:
image: postgres
volumes:
- 'db-data:/var/lib/postgresql/data'
今回サービス名はweb
としました。
10行目のvolumes:
でカレントディレクトリを作成したweb-versionというフォルダにマウントしています。
tty: true
stdin_open: true
: これを指定してあげることで、dockerfileで実行する場合のオプション-it
と同じ役割をしてくれます。
depends_on
: これはコンテナを立ち上げる順番を決めています。今回は- db
としているので、db,webの順番でコンテナが起動します。今回はwebというサービスがdbというサービスを参照する形になっているので、このようにしています。
volumes: - 'db-data:/var/lib/postgresql/data'
: postgresqlではデータが/var/lib/postgresql/data
に保管されます。そのデータをホスト側に保持しておくためにこれを書いています。なぜホスト側でデータを保持しておくのかというと、もしコンテナを消してしまうと、データも全て失ってしまうからです。失っても良い場合は書かなくても大丈夫です。
ホスト側のdb-data
に保持するのですが、そのフォルダを2,3行目のvolumes: db-data:
で作成しています。
これでdockerは終わりですが、djangoでpostgresqlを使うためにはdjangoのsetting.pyを変更する必要があります。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': '5432',
}
}
#終わりに
今回dockerを使ってdjangoの環境構築をしてみたのですが、やはりdockerは便利だなと感じました。(テスト環境とかデプロイ環境とかいろんなところでコンテナ使えばもっと便利に感じるはず)
ただこうやってアウトプットしてみてもまだ自分の知識が曖昧な部分があるので(runserverのポートの指定のところとか)、それをこれからもっと深堀りしてみたいです。
まだまだ初心者なので、間違っている点などありましたら、教えていただけると嬉しいです。