はじめに
こんにちは、SHOJIです。
今回は、前回Hyper-Vに追加したCentOS7にDockerをインストールしてDjangoのイメージを動かします。
Dockerは公式ドキュメントがしっかりしているので、手順にしたがって順番に進めれば難しくありません。
セキュリティを考慮してベストプラクティスを追及すると難易度が上がりますが、今回はシンプルに動く環境を作ることを目指します。
前回の記事はこちら。
deadline-driven-developer.hatenablog.com
CentOS7にDockerをインストールする
Docker ドキュメントを参照するのが早いです。
docs.docker.com
# 古いDocker関連ソフトウェアの削除
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
# sudoなしでdockerコマンドを使えるようにする
sudo usermod -aG docker ${USER}
CentOS7にDocker Composeをインストールする
docs.docker.com
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docs.docker.com
空のディレクトリを作成する。
Dockerfileを作成する。
このDockerfileをビルドすると、①Pythonコンテナに/codeディレクトリを作成、②ローカル環境のrequirements.txtを/codeディレクトリにコピー、③requirements.txtに定義されたPython Packageのインストール、が行われる。
# syntax=docker/dockerfile:1
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
requirements.txtを作成する。
「2」で作成したDockerfileでインストールするPython Packageを定義する。
Django>=3.0,<4.0
psycopg2>=2.8
docker-compose.ymlを作成する。
このdocker-composeをアップすると
version: "3.9"
services:
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
environment:
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
depends_on:
- db
「4」で定義したwebサービス(Pythonコンテナ)上でDjangoのコマンドを実行する。これにより、PythonコンテナのcodeディレクトリにDjangoプロジェクト用のディレクトリとファイルが生成される。
Pythonコンテナのcodeディレクトリはローカルの作業ディレクトリをバインドしているため、ローカルにもDjangoプロジェクト用のディレクトリとファイルが生成されるが、生成はあくまでPythonコンテナ側で行われる。
docker-compose run web django-admin startproject composeexample .
生成したファイルの所有者を変更する。
sudo chown -R $USER:$USER composeexample
composeexample/settings.pyを編集する。
settings.pyはDjangoの設定ファイル。Djangoで使用するデータベースをデフォルトのSqlite3からPostgreSQLに変更する。
# settings.py
import os
[...]
ALLOWED_HOSTS = ['*'] # アクセス可能なipアドレスを指定する。アスタリスクはセキュリティの面で非推奨。
[...]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('POSTGRES_NAME'),
'USER': os.environ.get('POSTGRES_USER'),
'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
'HOST': 'db',
'PORT': 5432,
}
}
サービスを起動する。webのdepends_onにdbを指定しているため、起動はdb→webの順序になる。
docker-compose up
ブラウザでhttp://[CentOS IP address]:8000にアクセスできれば完了。
おわりに
今回はDjangoとPostgreSQLのDockerイメージからコンテナを作成し、DjangoからPostgreSQLに接続するよう設定を追加しました。
次回はApacheコンテナを追加して、ApacheからDjangoアプリケーションを動かすようにしたいと思います。