やる気がストロングZERO

やる気のストロングスタイル

djangoテスト環境をdockerで構築した

「Dockerでなんかいろいろ便利になる」ってイメージだったので自分の開発にDockerを導入た。
やっとDockerの便利になるポイントが見えてきたのでまとめる。

※追記
開発環境の構築というよりもテスト環境の構築というほうが正しかったのでタイトルも訂正した。
django開発環境をdockerで構築した」=>「djangoテスト環境をdockerで構築した」

最初目指していたのは
pythonインタプリタもライブラリもhostには置かず、
dockerコンテナのものを使って開発をする」
というものだったがPyCharmがライブラリをスムーズに認識してくれず、開発をスムーズに進められなかった。
(※一応設定したら認識してくれたが、なんかのタイミングでコンテナが置き換わったときに見失ったり)

開発はhost側にpythonや必要なライブラリをインストールして行い、(pyenvやpipenvもあるし)
Dockerコンテンタのテスト環境で問題がないか確認する、
という流れがいい感じなのかも。

今自分が行っている開発を、すぐに他のマシンで行う必要があるときに便利

現在djangoのwebアプリの開発を行っているのだが、
普段開発しているマシンとは別のマシンで開発を行う必要ができた場合、
そのマシンに以下のような環境構築を行う必要がある。

・python3のインストール
djangoなど、必要なライブラリのインストール
postgresqlのインストール
・必要に応じて設定の調整など。

これらは知識のある人ならぱぱっと出来るのかもしれないが、
それでもバージョンとか細かい部分の違いが問題になって動かないというような状況におちいったりもする。

問題が起きたときに、そのマシンの状態もマチマチなので
アドホックに対応する必要がある。
このあたりがめんどくさい。

これがDockerを使った開発を行っていた場合、
ソースコードと共にDockerfileとdocker-compose.ymlを書いておけば、
docker-compose up一発で環境構築を行うことができるようになる。

開発マシンの既存の状態に影響されないので、特定のマシンでインストールがコケるということもない。

別の開発を同時進行する場合に便利

同じマシンで同時に別のプロジェクトの開発を並行して行おうとした時に
依存する言語やミドルウェアのバージョンがそれぞれ異なると、両方をインストールできないために困る場合がある。

Dockerを使っている場合
コンテナによって環境が独立するので他の開発環境の影響を考慮する必要がないので楽。

上記のことをする必要がない場合には不便かも

一人で一つのプロジェクトを開発している場合には、上記の問題は発生しないので
dockerコマンドやコンテナを意識しないと行けない分dockerは不便に感じるかもしれない。

・開発するにはコンテナを起動しないといけない。
インタプリタはコンテナ内のものを使う必要があるなど。

Docker設定周り

(追記ここから)
これを書いた後、もう少し理解が進んで再度構築した。
Nginx -> uWSGI -> Djangoで動作するDocker Imageを作った - やる気がストロングZERO
(追記ここまで)

[ディレクトリ構造]
./Dockerfile
./docker-compose.yml
./Pipfile
./Pipfile.lock
./(その他djangoプロジェクトファイルなど)

[Dockerfile]
appコンテナ用の設定ファイル

FROM python:3.6.6 (もとにするイメージを指定)

WORKDIR /docker_build (作業ディレクトリを指定)
ADD ./Pipfile /docker_build (必要なファイルをhostからコピー配置)
ADD ./Pipfile.lock /docker_build (同上)

RUN pip install pipenv (pipenvのインストール)
RUN pipenv install --system --deploy (Pipfile Pipfile.lockに記載されたライブラリをインストール)

WORKDIR /app (作業ディレクトリを指定)
EXPOSE 80 (80版ポートを開ける)

CMD [ "python", "manage.py", "runserver", "0.0.0.0:80" ] (コンテナ起動時に実行するコマンド(djangoのプロジェクトがあれば起動時に開発用webサーバーを起動できる。))


[docker-compose.yml]

version: '3'

services:
    db: #db用コンテナの設定
        image: postgres #元にするイメージを指定
        volumes:
            - db-data:/var/lib/postgresql/data #データを保持させるdocker volumeを指定
    app: #app用コンテナの設定
        build: . #カレントディレクトリにあるDockerfileからbuldする
        command: ./manage.py runserver 0.0.0.0:80 #コンテナ起動時コマンドを指定
        volumes:
            - .:/app #コンテナの/appディレクトリに、hostの./ディレクトリをマウント
        ports:
            - "8000:80" #localhost:8000への通信をコンテナの0.0.0.0:80へ通す
        depends_on:
            - db #dbコンテナの起動が終わってからappコンテナを起動させる
volumes:
    db-data: #使用するvolumeを明示的に記述

[Pipfile]
pipenv install用

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages]
django = "==2.*"

[dev-packages]

[requires]
python_version = "3.6"

[Pipfile.lock]
pipenv lockで生成。記載省略


この状態で

docker-compose up

で環境が構築される。
以降は、appコンテナ内でdjango-adminコマンドでプロジェクトを生成したり
./manage.pyでコマンドを実行したりして開発をすすめる。