Dockerを使ってDjango+PostgreSQLの開発環境作ってみた

Udemyのこちらの講座 でDockerについて学習したため、今回は復習も兼ねて自分でDjangoの開発環境を構築してみようと思います。

フォルダ構成

最終的なフォルダ構成はこんな感じになってます。余計なのは省きます。

django_docker
├── docker-compose.yml
├── python
│   ├── Dockerfile
│   └── requirements.txt
└── testDockerDjango
    ├── manage.py
    └── testDockerDjango
        ├── asgi.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py

準備

まずは準備。フォルダとかを作っていく。

mkdir django_docker && cd django_docker
touch docker-compose.yml
mkdir python && cd python

とりあえずこんな感じ。次はpythonフォルダの中で作業していきます。

Dockerfile

先ほど作ったpythonフォルダの中にDockerfileを作ります。内容はこんな感じ。

# image はpython3.6を使う。
FROM python:3.6

# この記述はよくわからん。バファを無効にするためらしい。
ENV PYTHONUNBUFFERED 1

# コンテナ内にcodeフォルダを作成
RUN mkdir /code

# これから先は/code内で作業を行うよー
WORKDIR /code

# この後作るrequirements.txtをcodeの下にコピー
COPY requirements.txt /code/

# pip で requirements.txt 内に記述してあるライブラリたちをインストール
RUN pip install -r requirements.txt

requirements.txt

ここに必要なライブラリを記述しておくことで一遍にインストールしてくれる。今回はDjangoとDjangoでPostgreSQLを使うために必要なライブラリを記述しておく。

Django>=2.2
psycopg2-binary>=2.8

docker-compose.yml

次にdocker-compose.ymlの記述をしていく。ファイルの作成場所はdjango_dockerの下。

version: '3'
    
services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: ./python
    command: python testDockerDjango/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

サービスはdbとwebの2つ。

まずdbの方はimageの指定と環境変数の設定を行なっている。

webの方は下記のことを記述している。これらのことはdocker run でコンテナを立ち上げるときにオプションでも指定できるのだが、いちいちコマンド書いてられないのでdocker-composeに一度まとめたらもう打たなくて良いよみたいなのり。

  • 先ほど作ったDockerfileからimageをbuildするように指定
  • run されたときに実行するコマンドの指定
  • docker-compose.ymlと同じところにあるファイルやフォルダたちを、コンテナ内の/code以下にうつす(厳密にいうと違う。うまく表現できない。すみません。)
  • ホスト(自分のPC)とコンテナを繋ぐポートを指定
  • dbが立ち上がってからwebを立ち上げるよ

Djangoプロジェクト作成

django_docker内でDjangoプロジェクトを作成します。

django-admin startproject testDockerDjango

settings.pyをposgres用に記述し直す。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

動作確認

docker-composeを起動してブラウザで動作確認をしてみます!

docker-compose up -d

これでlocalhost:8000にアクセスしてDjangoのスタートページが見れたら成功です!!ガンガン開発をしていきましょう!!

参考

Quickstart: Compose and Django
Getting started with Docker Compose and Django

おまけ:docker-compose downした後もデータを残しておく

docker-compose downコマンドを実行することで、docker-composeで動いていたコンテナを削除することができる。しかしこのコマンドを使ってコンテナを消してしまうと、もう一度upし直したときに前回作ったデータ等が消えてしまう。これをさせるためにはdocker-compose.ymlファイルに少しだけ記述しておく必要がある。

version: '3'

volumes:
  db-data: 

services:
  web:
    build: .
    ports:
      - '3000:3000'
    volumes:
      - '.:/product-register'
    environment:
      - 'DATABASE_PASSWORD=postgres'
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db

  db:
    image: postgres
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
      - 'POSTGRES_HOST_AUTH_METHOD=trust'

上から3行目のvolumeのところと、dbのvolumeのとことの2箇所を記述することでdocker-compose downをしてコンテナを一度消し、もう一度docker-compose upでコンテナを立ち上げた時でも前回のデータがそのまま残っている。「db-data」のところはそれぞれ一緒なら名前はなでも良い。

コメント

タイトルとURLをコピーしました