[Django] Dockerファイルとdocker-compose.ymlの違い
Dockerファイルとdocker-compose.ymlの違い
Dockerfileは、Dockerイメージを構築するために使用される設定ファイルです。Dockerfileには、イメージに含まれるファイルやアプリケーションの設定などが記述されます。
Docker Composeは、複数のDockerコンテナを組み合わせてアプリケーションを実行するためのツールです。docker-compose.ymlは、Docker Composeを使用するための設定ファイルで、複数のコンテナ間の関係や環境変数などが記述されます。
つまり、Dockerfileは単独のDockerイメージを作るための設定ファイルであり、docker-compose.ymlは複数のDockerイメージを組み合わせてアプリケーションを実行するための設定ファイルです。
DjangoにおけるDockerファイルとdocker-compose.yml
DjangoアプリケーションをDockerで実行する場合、Dockerfileとdocker-compose.ymlの両方が必要になることがあります。
Dockerfileは、Djangoアプリケーションを実行するために必要なPythonやDjangoなどの依存関係をインストールしたDockerイメージを構築するために使用します。
docker-compose.ymlは、Djangoアプリケーションを実行するために必要な複数のDockerコンテナを組み合わせるために使用します。Djangoアプリケーションは、Webサーバーとデータベースなどの複数のコンポーネントを必要とするため、docker-compose.ymlを使用してそれらを組み合わせることで、アプリケーションを実行することができます。
ただし、Djangoアプリケーションを単一のコンテナで実行する場合は、docker-compose.ymlは不要です。
Docker ファイル例
FROM python:3.9
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install --upgrade pip && pip install -r requirements.txt
COPY . /code/
このDockerfileは、Python3.9イメージをベースにしています。そして、必要なPythonのパッケージをインストールし、アプリケーションのコードをコピーしています。
docker-compose.yml 例
version: '3'
services:
db:
image: postgres
environment:
- POSTGRES_DB=mydb
- POSTGRES_USER=myuser
- POSTGRES_PASSWORD=mypassword
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
このdocker-compose.ymlは、PostgresデータベースとDjangoアプリケーションのWebサーバーを組み合わせています。そして、webサービスはdbサービスに依存しています。
これらのサンプルは、Djangoアプリケーションを実行するための基本的な設定であり、実際のアプリケーションに応じて設定を変更する必要があります
ファイルの実行方法
Dockerfileとdocker-compose.ymlを使用してDjangoアプリケーションを実行するには、以下のようにします。
- Dockerfileが存在するフォルダに移動します。
- 次のコマンドを実行して、Dockerイメージをビルドします。
docker build -t myimage .
- docker-compose.ymlが存在するフォルダに移動します。
- 次のコマンドを実行して、Docker Composeを使用してアプリケーションを起動します。
docker-compose up
- アプリケーションが起動したら、ブラウザでhttp://localhost:8000にアクセスして、アプリケーションが正常に動作していることを確認します。
- アプリケーションを停止するには、次のコマンドを実行します。
docker-compose down
注意: 上記の例は、Dockerfileとdocker-compose.ymlが同じフォルダにあると仮定しています。そうでない場合は、適切なパスを指定する必要があります。
Discussion