Dockerfile docker-compose.yml
はじめに
このページではDockerfileとdocker-compose.ymlについて記述します。
Dockerfileとは
Dockerfileは、単一のDockerコンテナイメージを構築するための一連の命令を記述するテキストファイルです。これにより、アプリケーションの実行環境を一貫して定義し、簡単に再現可能な形で環境を共有できます。
Dockerfileの基本構成と各コマンドの詳細
FROM
コマンド
1. FROM
はDockerfileの最初に記述されるコマンドで、ベースイメージを指定します。このイメージを元に新しいDockerイメージが構築されます。すべてのDockerfileは1つ以上のFROM
コマンドを必要とします。
FROM ubuntu:20.04
この例では、Ubuntu 20.04の公式イメージをベースとして使用しています。
RUN
コマンド
2. RUN
コマンドは、イメージをビルドする際に実行するコマンドを指定します。主にパッケージのインストールやファイルのダウンロードなどに使用されます。
RUN apt-get update && apt-get install -y python3
この例では、ベースイメージのUbuntu上でパッケージリストを更新し、Python3をインストールしています。RUN
コマンドは実行結果を新しいイメージレイヤーとしてキャッシュします。
COPY
コマンド
3. COPY
コマンドは、ホスト側のファイルやディレクトリをDockerイメージ内の指定したパスにコピーします。
COPY . /app
この例では、ホスト側の現在のディレクトリ(.
)の内容をコンテナ内部の/app
ディレクトリにコピーしています。
WORKDIR
コマンド
4. WORKDIR
コマンドは、指定したディレクトリを作成し、そのディレクトリを以降のコマンドの作業ディレクトリとして設定します。
WORKDIR /app
この例では、コンテナ内部の/app
ディレクトリを作業ディレクトリに設定しています。このディレクトリが存在しない場合は、自動的に作成されます。
CMD
コマンド
5. CMD
コマンドは、コンテナが起動したときに実行するデフォルトのコマンドを指定します。CMD
はDockerfileで1回だけ指定でき、複数指定された場合、最後のものが有効になります。
CMD ["python3", "app.py"]
この例では、コンテナが起動するとPython3でapp.py
を実行します。
ENTRYPOINT
コマンド
6. ENTRYPOINT
コマンドは、コンテナの実行エントリーポイントを設定します。ENTRYPOINT
は通常、実行するコマンドを不変のものとして指定し、CMD
で引数を指定する形で使われます。
ENTRYPOINT ["python3"]
CMD ["app.py"]
この例では、ENTRYPOINT
でpython3
を指定し、CMD
でapp.py
という引数を渡す形で実行されます。
EXPOSE
コマンド
7. EXPOSE
コマンドは、コンテナがリッスンするポートを指定します。これは、実行時にネットワーク設定を調整するためのヒントとして機能しますが、実際にポートを公開するためにはdocker run
コマンドで-p
オプションを使用する必要があります。
EXPOSE 80
この例では、コンテナがポート80を使用することを示しています。
ENV
コマンド
8. ENV
コマンドは、コンテナ内部で使用される環境変数を設定します。
ENV APP_ENV=production
この例では、APP_ENV
という環境変数をproduction
に設定しています。
VOLUME
コマンド
9. VOLUME
コマンドは、コンテナ内部のディレクトリをホスト側にマウントし、データを永続化するために使用します。
VOLUME ["/data"]
この例では、コンテナ内部の/data
ディレクトリがホスト側にマウントされ、データの永続化が可能になります。
docker-compose.ymlとは
docker-compose.yml
は、複数のDockerコンテナを定義し、それらを一括で管理・実行するための設定ファイルです。docker-compose.yml
を使用することで、アプリケーションの複数のサービス(例えば、Webサーバー、データベース、キャッシュなど)を簡単に定義し、セットアップできます。
docker-compose.ymlの基本構成と各項目の詳細
docker-compose.yml
ファイルは、YAML形式で記述され、複数のサービスを定義できます。以下に、その各項目について詳しく説明します。
version
1. version
は、docker-compose
ファイルのバージョンを指定します。通常は最新のバージョンを使用することを推奨します。
version: '3'
この例では、Composeファイルのバージョンとして3を指定しています。
services
2. services
は、コンテナとして起動する各サービスを定義するセクションです。各サービスごとに一つのコンテナが起動されます。
services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "5000:5000"
volumes:
- .:/app
depends_on:
- db
この例では、web
というサービスを定義しています。
build
build
は、Dockerイメージをビルドするためのコンテキストを指定します。context
はホスト側のディレクトリで、dockerfile
は使用するDockerfileのパスを指定します。
build:
context: .
dockerfile: Dockerfile
この例では、ホスト側のカレントディレクトリをビルドコンテキストとし、同ディレクトリ内のDockerfile
を使用してイメージをビルドします。
ports
ports
は、ホスト側とコンテナ内部のポートをマッピングします。
ports:
- "5000:5000"
この例では、ホスト側のポート5000をコンテナ内部のポート5000にマッピングしています。
volumes
volumes
は、ホスト側のディレクトリをコンテナ内部のディレクトリにマウントします。これにより、ホスト側でのファイルの変更がコンテナ内部にも反映されます。
volumes:
- .:/app
この例では、ホスト側のカレントディレクトリ(.
)をコンテナ内部の/app
ディレクトリにマウントしています。
depends_on
depends_on
は、サービス間の依存関係を定義します。指定したサービスが開始される前に他のサービスを起動します。
depends_on:
- db
この例では、web
サービスが起動する前にdb
サービスが起動するよう指定しています。
environment
3. environment
は、コンテナ内部で設定される環境変数を指定します。
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
この例では、POSTGRES_DB
、POSTGRES_USER
、POSTGRES_PASSWORD
という3つの環境変数を設定しています。
networks
4. networks
は、サービス間で使用されるカスタムネットワークを定義します。これにより、同じネットワーク上のサービスが通信できるようになります。
networks:
default:
driver: bridge
この例では、デフォルトのブリッジネットワークを使用するように設定しています。
まとめ
Dockerfileは単一のDockerコンテナイメージを構築するための設定を記述し、docker-compose.yml
は複数のコンテナサービスを一括管理するための設定を記述します。それぞれのファ
イルで使用されるコマンドや項目を理解し、正しく使い分けることで、より効率的なコンテナ化やサービスの管理が可能になります。
Discussion