📌

Dockerfile docker-compose.yml

2024/09/17に公開

はじめに

このページではDockerfileとdocker-compose.ymlについて記述します。

Dockerfileとは

Dockerfileは、単一のDockerコンテナイメージを構築するための一連の命令を記述するテキストファイルです。これにより、アプリケーションの実行環境を一貫して定義し、簡単に再現可能な形で環境を共有できます。

Dockerfileの基本構成と各コマンドの詳細

1. FROM コマンド

FROMはDockerfileの最初に記述されるコマンドで、ベースイメージを指定します。このイメージを元に新しいDockerイメージが構築されます。すべてのDockerfileは1つ以上のFROMコマンドを必要とします。

FROM ubuntu:20.04

この例では、Ubuntu 20.04の公式イメージをベースとして使用しています。

2. RUN コマンド

RUN コマンドは、イメージをビルドする際に実行するコマンドを指定します。主にパッケージのインストールやファイルのダウンロードなどに使用されます。

RUN apt-get update && apt-get install -y python3

この例では、ベースイメージのUbuntu上でパッケージリストを更新し、Python3をインストールしています。RUNコマンドは実行結果を新しいイメージレイヤーとしてキャッシュします。

3. COPY コマンド

COPY コマンドは、ホスト側のファイルやディレクトリをDockerイメージ内の指定したパスにコピーします。

COPY . /app

この例では、ホスト側の現在のディレクトリ(.)の内容をコンテナ内部の/appディレクトリにコピーしています。

4. WORKDIR コマンド

WORKDIR コマンドは、指定したディレクトリを作成し、そのディレクトリを以降のコマンドの作業ディレクトリとして設定します。

WORKDIR /app

この例では、コンテナ内部の/appディレクトリを作業ディレクトリに設定しています。このディレクトリが存在しない場合は、自動的に作成されます。

5. CMD コマンド

CMD コマンドは、コンテナが起動したときに実行するデフォルトのコマンドを指定します。CMDはDockerfileで1回だけ指定でき、複数指定された場合、最後のものが有効になります。

CMD ["python3", "app.py"]

この例では、コンテナが起動するとPython3でapp.pyを実行します。

6. ENTRYPOINT コマンド

ENTRYPOINT コマンドは、コンテナの実行エントリーポイントを設定します。ENTRYPOINTは通常、実行するコマンドを不変のものとして指定し、CMDで引数を指定する形で使われます。

ENTRYPOINT ["python3"]
CMD ["app.py"]

この例では、ENTRYPOINTpython3を指定し、CMDapp.pyという引数を渡す形で実行されます。

7. EXPOSE コマンド

EXPOSE コマンドは、コンテナがリッスンするポートを指定します。これは、実行時にネットワーク設定を調整するためのヒントとして機能しますが、実際にポートを公開するためにはdocker runコマンドで-pオプションを使用する必要があります。

EXPOSE 80

この例では、コンテナがポート80を使用することを示しています。

8. ENV コマンド

ENV コマンドは、コンテナ内部で使用される環境変数を設定します。

ENV APP_ENV=production

この例では、APP_ENVという環境変数をproductionに設定しています。

9. VOLUME コマンド

VOLUME コマンドは、コンテナ内部のディレクトリをホスト側にマウントし、データを永続化するために使用します。

VOLUME ["/data"]

この例では、コンテナ内部の/dataディレクトリがホスト側にマウントされ、データの永続化が可能になります。

docker-compose.ymlとは

docker-compose.ymlは、複数のDockerコンテナを定義し、それらを一括で管理・実行するための設定ファイルです。docker-compose.ymlを使用することで、アプリケーションの複数のサービス(例えば、Webサーバー、データベース、キャッシュなど)を簡単に定義し、セットアップできます。

docker-compose.ymlの基本構成と各項目の詳細

docker-compose.ymlファイルは、YAML形式で記述され、複数のサービスを定義できます。以下に、その各項目について詳しく説明します。

1. version

versionは、docker-composeファイルのバージョンを指定します。通常は最新のバージョンを使用することを推奨します。

version: '3'

この例では、Composeファイルのバージョンとして3を指定しています。

2. services

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サービスが起動するよう指定しています。

3. environment

environmentは、コンテナ内部で設定される環境変数を指定します。

environment:
  POSTGRES_DB: mydb
  POSTGRES_USER: user
  POSTGRES_PASSWORD: password

この例では、POSTGRES_DBPOSTGRES_USERPOSTGRES_PASSWORDという3つの環境変数を設定しています。

4. networks

networksは、サービス間で使用されるカスタムネットワークを定義します。これにより、同じネットワーク上のサービスが通信できるようになります。

networks:
  default:
    driver: bridge

この例では、デフォルトのブリッジネットワークを使用するように設定しています。

まとめ

Dockerfileは単一のDockerコンテナイメージを構築するための設定を記述し、docker-compose.ymlは複数のコンテナサービスを一括管理するための設定を記述します。それぞれのファ

イルで使用されるコマンドや項目を理解し、正しく使い分けることで、より効率的なコンテナ化やサービスの管理が可能になります。

Discussion