docker-compose.yml の内容を理解しよう

この記事では docker-compose.yml の最も基本的な内容について解説します。
この記事の内容を理解すると、
従来、アプリケーション開発のための環境構築に必要だった時間と労力を
大幅に削減することができるようになります。

サンプルとして、
前回の Docker Desktop のトレーニング記事でコンテナーを実行するのに使った
docker-compose.yml を取り上げます。
前回のトレーニングは 10 分程度なので、より効率よく理解するために
先に前回の記事の内容を体験してみることをお奨めします。

Docker Desktop で 開発用 Web アプリを起動してみよう

docker-compose.yml は YAML 形式で記述されています。
ここでは Docker に関する解説を行っていきますので、
YAML の文法自体の解説については、次の記事を参照してください。

最低限押さえておきたい YAML の読みかた・書きかた

実用から入る Docker 講座 目次に戻る

docker-compose.yml のサンプル

まず、前回の Docker Desktop のトレーニング記事で使った docker-compose.yml
コメントで注釈を追加したものをお見せします:

version: "3.8"  # この「Compose ファイルの書式のバージョン」
services:       # 「サービス」を定義する項目
  web:            # "web" という名前で「サービス」を定義
    image: adminer  # "adminer" の「イメージ」を使用
    ports:          # ホストの「ポート番号」とコンテナーの「ポート番号」を対応付けを定義します
      - 8080:8080     # ホストの「ポート番号」 8080 とコンテナーの「ポート番号」 8080 を対応付けます
  db:             # "db" という名前で「サービス」を定義
    image: mysql    # "mysql" の「イメージ」を使用
    environment:    # コンテナーに「環境変数」を設定します
      # ↓ "MYSQL_ROOT_PASSWORD" という「環境変数」に "example" という値を設定します
      MYSQL_ROOT_PASSWORD: example

ここで、次の用語が出てきました:

  • サービス
  • イメージ
  • ポート番号
  • 環境変数
  • Compose ファイルの書式のバージョン

これらを順に解説していきます。

サービスとは

「サービス」は、起動するコンテナーの設定の定義です。

先ほどの docker-compose.yml では
serviceswebdb が定義されています:

version: "3.8"
services:       # 「サービス」を定義する項目
  web:            # "web" という名前で「サービス」を定義
    image: adminer
    ports:
      - 8080:8080
  db:             # "db" という名前で「サービス」を定義
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example

docker-compose up コマンドでは、特に指定しなければ
各サービスからコンテナーを 1 つずつ起動しますが、
複数のコンテナーを起動することもできます。

例えば、
次のコマンドを実行すると、db サービスのコンテナーを 2 つ起動することができます:

docker-compose up -d --scale db=2

実行結果は次のようになります:

db サービスのコンテナーが 2 つ起動します
db サービスのコンテナーが 2 つ起動します

イメージとは

イメージは Docker のコンテナーのもととなるものです。
この例では web のサービスでは adminer というイメージを、
db のサービスでは mysql というイメージを指定しています。

version: "3.8"
services:
  web:
    image: adminer  # "adminer" の「イメージ」を使用
    ports:
      - 8080:8080
  db:
    image: mysql    # "mysql" の「イメージ」を使用
    environment:
      MYSQL_ROOT_PASSWORD: example

これらのイメージの情報や使い方は
Docker Hub という Web サイトで確認することができます。

adminer: adminer – Docker Hub
mysql: mysql – Docker Hub

他にも、様々なイメージが公開されており、
このような公開されているイメージを組み合わせて
従来、アプリケーション開発のための環境構築に必要だった時間と労力を
大幅に削減することができるようになります。

公開されているイメージは次のページで検索することができます:

Explore – Docker Hub

ポート番号とは

ポート番号の意味については、次のページの解説を確認してください:

ポート番号ってなに?

docker-compose.ymlports では、
ホストのポート番号とコンテナーのポート番号を対応付けることができます。
例では、ホストのポート番号 8080 とコンテナーのポート番号 8080 を対応付けています:

version: "3.8"
services:
  web:
    image: adminer
    ports:          # ホストの「ポート番号」とコンテナーの「ポート番号」を対応付けを定義します
      - 8080:8080     # ホストの「ポート番号」 8080 とコンテナーの「ポート番号」 8080 を対応付けます
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example

このようにすることで、ホスト、つまり PC 自身のポート番号 8080 に通信を行うと
対応付けたコンテナーのポート番号 8080 に通信を行うことができるようになります。

ブラウザーからコンピューター自身の特定のポート番号にリクエストする方法

前回の Docker Desktop のトレーニング記事
Dashboard の [CONTAINERS] の [OPEN IN BROWSER] からブラウザーを開いたとき
URL は次のようになっていました:

localhost:8080

“localhost” はコンピューター自身と通信したい場合に利用する特別なアドレスです。

HTTP 通信で 80 以外のポート番号に通信するときは
ドメインの後にコロン (:) を置き、その後に使用するポート番号を続けます。

http://localhost:8080

上記のURLを使用すると、ブラウザはポート番号 80 ではなく、
ポート番号 8080 で接続を待ち受けている Web サービスに接続しようとします。

なぜポート番号 8080 を使うの?

“localhost” を利用した場合、通信内容はネットワークには流れません。
暗号化された https 通信を可能にするためには準備の手順が難解になるので
PC の中で開発を行うときは
暗号化されない代わりに準備が簡単な http 通信で行われることが多いようです。

一般的に http 通信はポート番号 80 が使われますが、
アプリケーション開発などで特定のポート番号を待ち受けるときは
ポート番号 1~1023 の利用を避けてポート番号を選択することが多いです。
(理由は後で解説します。)

8080 がよく利用される理由は、
「8080 は「2 つの 80」であることであるため」(わかりやすさ、憶えやすさ)
とされています。

参考: GRC | Port Authority, for Internet Port 8080

ポート番号 1~1023 の利用を避けてポート番号を選択する理由

これは、インターネットが生まれたときのシステムとサーバーの多くが
主に「UNIX」という OS を基にしていたことに起因しています。

UNIX は、1 ~ 1023 のポート番号については、
管理者権限で実行されているサービスだけが開くことができます。

つまり、 UNIX では管理者権限を持ったユーザーだけが
ポート番号 80 で Web サービスを提供できることになります。

そのため、ポート番号 1024 未満でサービスを実行する権限がない場合、
Web サービスを提供するのに便利なポート番号として 8080 が選択されるようになりました。

参考: GRC | Port Authority, for Internet Port 8080

環境変数とは

環境変数とは、
コンピュータ上で実行される処理がどのように振る舞うかに
影響をあたえることができる変数で、名前と値で定義されます。

service のキーとして設定する場合は、
ホストに対してではなく、起動するコンテナーに対して設定されます:

version: "3.8"
services:
  web:
    image: adminer
    ports:
      - 8080:8080
  db:
    image: mysql
    environment:    # コンテナーに「環境変数」を設定します
      # ↓ "MYSQL_ROOT_PASSWORD" という「環境変数」に "example" という値を設定します
      MYSQL_ROOT_PASSWORD: example

この場合は “MYSQL_ROOT_PASSWORD” という名前で “example” という値を設定しています。

環境変数がどのような影響を与えるかは、イメージ次第ですが、
主要なイメージはドキュメントを確認すると環境変数について解説されています。

前回の Docker Desktop のトレーニング記事
Adminer からパスワード: “example” でログインしたので
大体想像がついていると思いますが、
MySQL のイメージのドキュメントを確認してみましょう。

mysql – Docker Hub

[How to use this image] の [Environment Variables] を参照すると
次のような記述があります。

MYSQL_ROOT_PASSWORD
This variable is mandatory and specifies the password
that will be set for the MySQL root superuser account.

mysql – Docker Hub

これは、日本語訳で、大体次のような意味です。

この変数は必須であり、
MySQL root 特権ユーザーアカウントに設定されるパスワードを指定します。

Compose ファイルの書式のバージョンとは

「Compose ファイル」ってなに?

docker-compose.yml のように、
サービスなど定義する YAML ファイルのことを「Compose ファイル」と呼びます。

Compose ファイルは、
Docker Desktop に含まれる Docker Compose というアプリケーションによって解釈され、
Docker Compose が、複数のコンテナーの Docker アプリケーションを実行する仕組みになっています。

Compose ファイルのバージョンってなに?

Compose ファイルの中で
最新の記法でサポートされなくなった記法を引き続き使うための機能です。

Compose ファイルでは、Docker Compose の開発が進むにつれて
新しい定義の記法が行えるようになったり、
古い定義の記法がサポートされなくなったりしています。

先ほどの docker-compose.yml では、
2020-07-30 時点で最新の書式バージョンである 3.8 を指定しています:

version: "3.8"  # この「Compose ファイルの書式のバージョン」
services:
  web:
    image: adminer
    ports:
      - 8080:8080
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example

Compose ファイルのバージョンはどうして必要なの?

Docker Desktop のバージョンアップを行ったときに
古い記法がサポートされなくなったことが原因で
今まで使えていた Compose ファイルが突然使えなくなると困ります。

そのようなことにならないよう、
Docker Compose では過去の Compose ファイルの書式がサポートされ続けています。

version で過去のバージョンを指定することで、
その Compose ファイルは最新バージョンではサポートされなくなった記法を
引き続き使うことができます。

マイナーバージョンを省略しちゃダメ!

よく Docker を利用した解説記事で次のような定義を目にします:

"version": "3"

この定義はバージョン 3 の最新ではなく、 "3.0" として扱われます
その結果、3.1 以降のバージョンで追加された機能はサポートされなくなります。

参考:
v2 and v3 Declaration | Compose file versions and upgrading | Docker Documentation
Version 3 | Compose file versions and upgrading | Docker Documentation

When specifying the Compose file version to use, make sure to specify both the major and minor numbers.

v2 and v3 Declaration | Compose file versions and upgrading | Docker Documentation

Compose ファイルのバージョンを指定するときは、
メジャー番号とマイナー番号の両方を指定していることを確認してください。

わからない記法を調べるときは

わからない記法を調べるときは、
次のページ内をブラウザーの検索機能で検索すると良いでしょう:

Compose file version 3 reference | Docker Documentation

実用から入る Docker 講座 目次に戻る

タイトルとURLをコピーしました