DockerでPython3(Django)の環境を作る(PostgreSQLの接続もする)

はじめに

以前までPython3のvenvを使って環境を作って進めていたんだけど、最近DBの勉強も始めて、DBの環境を作るのにDockerを使ってる。どうせならPython側もDockerにしちゃってよくない?と思ったのでまとめてDockerに載せてみた。

環境

  • Docker v17.09.0-ce
  • Python v3.6.3
  • PostgreSQL v10

環境を作っていく

実はこの方法は、Djangoのドキュメントに書いてあった。

流れとしては以下のようになる。

  1. DockerfileでPythonの環境を構築する設定を作る
  2. PostgreSQLのイメージを落とす
  3. docker-composeでまとめて起動できるようにする

1.DockerfileでPython3の環境を構築する設定を作る

Pythonの環境はDockerfileで作成する。というのも、イメージを落としてきた後で requirements.txt を読み込むなどの処理をしたいから。
ちなみにDockerイメージはDocker HubにあるOfficialイメージを使っている。
Dockerfileの書き方もそのままにしている。細かいバージョンの指定をした方がいいと思うけど、とりあえず放置されている。このファイルでは、PythonイメージのPullとディレクトリの作成とルートディレクトリ化、pipによるパッケージのインストールを行っている。

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

2. PostgreSQLのイメージを落とす

PostgreSQLのDockerイメージはDocker HubにあるOfficialイメージを使っている。

$ docker pull postgres

3. docker-composeでまとめて起動できるようにする

docker-compose の設定ファイルはほとんど掲載されているものと同じだけど、永続化の設定を入れている(多分これで出来てるんじゃないかなぁ)

version: '3.1'

services:
    web:
        build: .
        command: python3 manage.py runserver 0.0.0.0:8000
        volumes:
            - .:/code
        ports:
            - "8000:8000"
        depends_on:
            - db
    db:
        image: postgres:10
        environment:
            POSTGRES_DB: "database"
            POSTGRES_USER: "postgres"
            POSTGRES_PASSWORD: "postgres"
        volumes:
            - ~/docker/postgres:/var/lib/postgresql/data

Dockerの環境としてはこれで接続できているはずなので、Pythonで接続する設定なんかを書いていけばいい気がする。
dbの方で書いた情報をもとにDjangoの設定をして使っている。(USERなんかはあくまでローカル環境ということで設定している)

DjangoでPostgreSQLに接続するなら

個人的にDjangoを使っているので試しにDjangoに接続するなら。

DjangoでPostgreSQLに接続するときは、データベース名やUSER名なんかはdocker-composeで設定しているものを。Hostはdb、Portが5432を設定すると接続できるはず。

モジュールとしては psycopg2 が必要。インストールから設定なんかの詳しい部分は以下を参考にした。
DjangoにPostgreSQLを適用する - Qiita

使っていて困ったことと対処法

ログが確認できない

Docker無しでやっていた頃は、ターミナルでローカルサーバーを立ち上げてそこに表示されるエラーを見ていた。Docekrでやるようになって、docker-compose up/start で立ち上げると実行中のエラーログなんかがそのままでは表示されず確認ができない。

単純だった。Dockerコンテナ内ではログが出ているので、以下のコマンドを使うことでログを見ることができる。

$ docker logs -t コンテナ名

また -f をつけることで、tailコマンドのようにずっとログを表示してくれるようになる。

python manage.py migrate とかってどうやるのか

別のターミナルを開くなりして、以下のコマンドでコンテナに入り、任意のコマンドを打つことでmigrateなどのコマンドも使えた。

$ docker exec -it コンテナ名(ID) bash

入らなくても使う方法があった気がするけど、なんとなくこっちの方が安心なのでこっちを使っている。

最後に

今回のやり方ってPythonに限らず他の言語でも使える方法な気がするので構造は覚えておきたい。