Docker(compose)にDjango開発環境を移行する際の備忘録


Dockerfile


FROM python:3.7
ENV PYTHONUNBUFFERED 1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install --no-cache-dir -r requirements.txt
COPY ./code /code/.
RUN python manage.py migrate
  • FROMでpython3.7環境を使用
  • ENVでエラー出力抑制(らしい)
  • WORKDIRで一時作業フォルダを指定
  • WORKDIRにDockerfileと同じディレクトリに配置しているrequirements.txtをコピーする
  • RUNでrequirements.txtにしたがってインストールを行う
  • COPYでmanage.pyがあるディレクトリを丸ごとWORKDIR配下にコピー
  • RUNでmigrateしておく

ハマりポイントとしては、WORKDIRへのファイルコピー。
Dockerfileと同じディレクトリにあるcodeディレクトリ(Djangoプロジェクト)を指定できずFile Not Foundを連発。
前提条件として、Dockerfileとrequirements.txt、codeディレクトリはすべて同じ階層に配置している。

docker-compose.yml

docker-compose.yml
version: '3'
services:
        web:
                build: .
                ports:
                        - "8000:8000"
                volumes:
                        - ./code:/code
                command: python3 manage.py runserver 0.0.0.0:8000
  • versionは3を指定
  • web:は一時的な名称として指定。
  • build:でDockerfileの位置を指定。カレントディレクトリにあるので'.'を指定。
  • ports:でDjangoのポートを指定。
  • volumes:でカレントディレクトリにあるDjangoプロジェクトのディレクトリをコンテナ内の/codeにマウントする。マウントすることでvscodeなどから直接編集した内容がコンテナ上に反映される。
  • command:でDjangoのWebサーバーを起動させる。引数のIPアドレスとポート番号は必要ないかもしれない。

コマンド類

Dockerコマンドをsudoなしで実行させる場合

$ sudo usermod -aG docker ユーザー名
$ newgrp docker

newgrp dockerを.bashrcなどに書いておくと楽になるかもしれない。

イメージの削除

$ docker images
$ docker rmi イメージID先頭3桁

割り当てられているコンテナが存在する場合は-fをつけて強制的に削除する。

$ docker rmi -f イメージID先頭3桁

コンテナの削除

$ docker rm コンテナID

exited状態のコンテナ複数を一度に削除する

$ docker rm $(docker ps -a --filter 'status=exited' -q)

コンテナにログインしてコマンドを実行したい場合

$ docker exec -it コンテナ名 /bin/bash