今回初めてWebサービス作成にDockerを使ったので、自分用のメモとして記事に残そうと思います。 また、プロジェクトはフロントエンドとバックエンドが分かれていることを前提とし、この記事ではバックエンド部分をDocker化していきます。
以下のようなプロジェクト構成とします。 これにDockerfileとdocker-compose.ymlを加えていきます。
.
├── Pipfile
├── Pipfile.lock
├── backend
│ ├── config
│ │ ├── __init__.py
│ │ ├── asgi.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── db.sqlite3
│ ├── manage.py
│ └── myapp
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── serializer.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
└── frontend
└── src
frontendやDB部分は別記事にします。
では始めにDockerfileを作っていきます。
以下のファイルをbackend/Dockerfileに記載していきます。
FROM python:3.8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /server
COPY Pipfile Pipfile.lock /server/
RUN pip install pipenv && pipenv install --system
COPY ./backend/ /server
FROM
DockerHubなどのリポジトリに存在するイメージを取得ENV PYTHONDONTWRITEBYTECODE 1
.pycファイルの生成を無効する環境変数の設定ENV PYTHONUNBUFFERED 1
stdout/stderrのバッファリングを無効化する環境変数の設定WORKDIR
コンテナ内の作業場所を指定COPY
ホスト上のソースをコンテナ内にコピーRUN
コンテナ内で実行するコマンドを設定続いてdocker-composeを作成します。
docker-composeはホストOS上で複数のコンテナを同時に管理します。
version: '3.7'
services:
api:
build:
context: ./
dockerfile: ./backend/Dockerfile
command: python /server/manage.py runserver 0.0.0.0:8000
volumes:
- ./backend:/server
ports:
- 8000:8000
version
docker-composeの使用するバージョンを指定しますbuild
ビルドコンテキストへのパスを含む文字列として指定できます。context
上記のbuildではパスのみでしたが、パス以外を指定する場合に今回のようにbuildの下に記載します。contextはパスの指定。dockerfile
dockerfileの指定します。。command
実行するコマンドを指定します。volumes
ホスト上のリソースをコンテナ内にマウントします。ports
ポート番号を指定します。DockerfileのCOPYにファイルパスを指定しますが、 backendディレクトリ内には無いためエラーとなってしまいます。
これを防ぐためにdocker-compose.ymlのcontextでbuildパスを指定する必要があります。
起動
docker-compose up -d
-dオプションはコンテナをバックグラウンドで起動します。
停止
docker-compose stop
コンテナを停止します。
コンテナの破棄
docker-compose down
以上で、dockerでの開発環境(とりあえずbackendのみ)が整いました。