【Docker入門】Docker Composeファイルの項目

 Docker Composeでコンテナを作るには「compose.yaml」というファイルが必要になります。そして、「compose.yaml」を保存したディレクトリがデフォルトでDocker Composeのプロジェクト名になります。

 Docker Composeのプロジェクト名は、Docker Composeを使用して複数のコンテナを管理する際に使用される識別子です。このプロジェクト名について以下で詳しく解説します。

Docker Composeのプロジェクト名とは

プロジェクトの識別子

 Docker Composeを使用する際には、プロジェクト名を指定する必要があります。このプロジェクト名は、コンテナやネットワーク、その他のリソースを識別するために使用されます。

デフォルトのプロジェクト名

 もしDocker Composeがプロジェクト名を指定されずに実行される場合、デフォルトのプロジェクト名が使用されます。デフォルトのプロジェクト名は、Docker Composeファイルを保存したディレクトリの名前になります。

指定されたプロジェクト名の利用

 プロジェクト名を明示的に指定する場合、「docker compose -p <project_name> up」のようにして指定します。この場合、指定されたプロジェクト名が使用されます。

docker compose -p <project_name> up

リソースの命名規則

 プロジェクト名は、Docker Composeで定義された各サービス、ネットワーク、ボリュームなどのリソースに対してプレフィックスとして使用されます。これにより、同じDockerホスト上で異なるプロジェクト間でリソースの名前が衝突することを防ぎます。

 Docker Composeのプロジェクト名は、複数のプロジェクトを区別し、リソースを適切に管理するために重要な役割を果たします。適切なプロジェクト名を選択し、各プロジェクトのリソースを明確に識別することで、管理作業を円滑に行うことができます。

Composeファイルの名前

 Docker Composeのバージョンによって、Composeファイルが読み込まれるデフォルトパスに違いがあります。これについて詳しく解説します。

V1の場合

 V1のDocker Composeでは、作業ディレクトリにある以下のファイルがComposeファイルとして読み込まれます。

  • docker-compose.yaml
  • docker-compose.yml

これらのファイルが存在する場合、それが読み込まれ、コンテナの定義などが実行されます。

V2の場合

 V2のDocker Composeでは、基本的に作業ディレクトリにある「compose.yaml」がComposeファイルとして読み込まれます。しかし、後方互換性のために、V1と同じく「docker-compose.yaml」もサポートされています。

具体的には、以下のファイルがComposeファイルとして認識されます:

  • compose.yaml
  • compose.yml
  • docker-compose.yaml(後方互換)
  • docker-compose.yml(後方互換)

 これらのファイルが存在する場合、優先されるのは「compose.yaml」です。ただし、両方のファイルが存在する場合には、「compose.yaml」が優先されます。

このように、Docker Composeのバージョンによってデフォルトで読み込まれるComposeファイルの名前が異なります。適切なバージョンに対応したファイル名を使用することで、Composeファイルの読み込みが正しく行われます。

YAML形式の書き方

YAML形式は、インデントを使って階層構造を表します。

 キーの後の「:」や「ー」の後に半角スペース「凵」が必要なので注意してください。「httpd:2.4」のようにイメージのバージョンを指定する場合は、逆に半角スペース「凵」を入れるとエラーになります。

階層構造には癖があるので、サンプルの記述を参考にするとよいです。

version:凵'3' ←省略が推奨されている

services:
凵凵apache:
凵凵凵凵image:凵httpd:2.4
凵凵凵凵ports:
凵凵凵凵凵凵-凵"80:80"

※Docker Composeのバージョンを指定する。「version '3'」を指定していますが、こちらは現在、公式ドキュメントでも記述しないことが推奨されています。

 YAML形式は、人間が読みやすく、プログラムによっても解析しやすい構造化データ形式です。以下にYAML形式の書き方について詳しく解説します。

YAML形式のルール

1.データの階層構造:インデントを使う

 YAMLでは、階層構造を表現するためにインデントが使用されます。子要素は親要素の右側にインデントされます。

2.設定値は「キー: 値」で書く

マッピング(キーと値のペア)を表現する場合は、キーと値の間に「:」を使用します。

3.キーと後の「:」の後ろは、半角スペース1つ以上、もしくは改行が必要

キーと値の間には、半角スペース1つ以上、もしくは改行を入れる必要があります。

4.文字列は「'」「"」で囲む

 文字列を表現する際には、「'」または「"」で囲みます。ただし、ダブルクォート内ではエスケープ文字を使用することができます。

5.複数の値を記述する場合:先頭に「-」をつける

リスト(配列)を表現する場合は、先頭に「-」をつけます。

6.「-」の後ろには、半角スペース1つ以上、もしくは改行が必要

 リストの要素を記述する場合は、「-」の後ろには半角スペース1つ以上、もしくは改行を入れる必要があります。

7.コメント

 「#」を使用してコメントを記述することができます。コメントは行末までが有効で、行頭から「#」までがコメントとして解釈されます。

 YAML形式は、これらのルールに従って記述され、階層構造やリストなどを適切に表現することで、データの構造を明確に表現できます。

services以外の重要な項目

 Docker Composeファイルには、services以外にも重要な項目があります。以下に、services以外の主な項目を解説します。

項目説明
buildDockerイメージをビルドするためのDockerfileの場所を指定します。
commandコンテナが起動時に実行するコマンドを指定します。
container_nameコンテナに与える名前を指定します。
depends_on依存関係を指定し、サービスの起動順序を制御します。
endpointサービスのエンドポイントを指定します。
env_file環境変数を設定するためのファイルを指定します。
environmentコンテナに渡す環境変数を指定します。
image使用するDockerイメージを指定します。
labelsコンテナに付与するラベルを指定します。
networksコンテナが接続するネットワークを指定します。
portsホストとコンテナのポートをマッピングします。
restartコンテナの再起動ポリシーを指定します。
volumesホストとコンテナのディレクトリやファイルをマウントします。
ttyコンテナが端末を持つかどうかを指定します。
working_dirコンテナが起動した際の作業ディレクトリを指定します。
services以外の重要な項目

これらの項目は、Docker Composeファイル内で各サービスの構成を定義するために使用されます。各項目は、コンテナの動作や構成を制御するための重要なパラメータを提供します。

例)YAMLの書き方

YAML形式の書き方の例を以下に示します。「凵」は半角スペースを表しています。

services:
凵凵apache:
凵凵凵凵image:凵httpd:2.4
凵凵凵凵ports:
凵凵凵凵凵凵-凵"80:80"
networks:
凵凵network01
volumuse:
凵凵volume01

services:
  apache:
    image: httpd:2.4
    ports:
      - "80:80"
    networks:
      - network01
    volumes:
      - volume01

 このYAMLファイルは、Apacheのコンテナを定義し、そのコンテナが使用するイメージ、ポートのマッピング、接続するネットワーク、マウントするボリュームを設定しています。

親要素子要素説明
servicesDocker Composeファイルの中で、コンテナの定義が記述されるセクションです。servicesの下に、各サービスの定義が記述されます。
apacheここでは、Apacheのサービスを定義しています。apacheはサービスの名前で、この名前でサービスが参照されます。
image: httpd:2.4ApacheのDockerイメージを指定しています。httpd:2.4は、Apacheのバージョン2.4のDockerイメージを使用することを示しています。
portsホストとコンテナのポートのマッピングを定義しています。この例では、ホストのポート80がコンテナのポート80にマッピングされています。
networksコンテナが接続するネットワークを指定します。この例では、network01という名前のネットワークにコンテナが接続されます。
volumesホストとコンテナのディレクトリやファイルのマウントを定義します。この例では、volume01という名前のボリュームがコンテナにマウントされます。
例)YAMLの書き方