【CentOS】CentOSでDockerを使用しDjango環境を構築する

はじめに

こんにちは、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

Django & PostgreSQLのDockerイメージを動かす

docs.docker.com

  1. 空のディレクトリを作成する。

  2. 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/
    
  3. requirements.txtを作成する。

    「2」で作成したDockerfileでインストールするPython Packageを定義する。

    Django>=3.0,<4.0
    psycopg2>=2.8
    
  4. 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
    
  5. 「4」で定義したwebサービスPythonコンテナ)上でDjangoのコマンドを実行する。これにより、PythonコンテナのcodeディレクトリにDjangoプロジェクト用のディレクトリとファイルが生成される。

    Pythonコンテナのcodeディレクトリはローカルの作業ディレクトリをバインドしているため、ローカルにもDjangoプロジェクト用のディレクトリとファイルが生成されるが、生成はあくまでPythonコンテナ側で行われる。

    docker-compose run web django-admin startproject composeexample .
    
  6. 生成したファイルの所有者を変更する。

    sudo chown -R $USER:$USER composeexample
    
  7. 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,
        }
    }
    
  8. サービスを起動する。webのdepends_onにdbを指定しているため、起動はdb→webの順序になる。

    docker-compose up
    
  9. ブラウザでhttp://[CentOS IP address]:8000にアクセスできれば完了。

おわりに

今回はDjangoPostgreSQLのDockerイメージからコンテナを作成し、DjangoからPostgreSQLに接続するよう設定を追加しました。 次回はApacheコンテナを追加して、ApacheからDjangoアプリケーションを動かすようにしたいと思います。