Dockerとコンテナ技術 その5:Docker Composeファイル

Docker Composeで簡単なコンテナの作成や起動までを前回行いました。
ただ、Docker Composeファイルのcompose.yamlに関しては中身の詳細は触れていませんでした。
今回は、具体的な記述方法についてまとめていきたいと思います。

YAMLファイルの記法

Docker ComposeファイルはYAML記法で記述します。
まずはYAML記法について理解する必要があります。
基本的な記述方法は以下のとおりです。

基本構造:

YAMLは階層的なデータ構造をインデントを使用して表現します。通常、スペース2つまたは4つをインデントに用います。

キーと値:

キーと値はコロン(:)で区切ります。コロンの後にはスペースを一つ入れます。

key: value

コメント:

# を使用して行のどこかにコメントを追加できます。

# これはコメントです
key: value # ここにもコメントを追加できます

リスト:

リスト項目はハイフン(-)を使って表現します。各項目は新しい行に置き、同じインデントレベルで始めます。

yaml items:
  - item1
  - item2
  - item3

辞書(マップ):

キーと値のペアを使って表現します。値が辞書の場合、さらにインデントを深くして表現します。

person:
  name: John Doe 
  age: 30

複数行の文字列:

|> を使って複数行にわたる文字列を記述できます。| は改行を保持、> は改行をスペースに変換します。

description: |
  This is a description
  that spans multiple lines.

複数のドキュメント:

--- を使用して一つのファイル内に複数のYAMLドキュメントを記述できます。

---
doc1: value1
---
doc2: value2

データ型:

YAMLは文字列、数値、真偽値(true/false)など、さまざまなデータ型をサポートします。文字列は通常、クォートなしで記述できますが、特殊文字を含む場合はシングルクォート(’)またはダブルクォート(”)を使用します。

integer: 123
floating_point: 123.45
boolean: true
string: "Hello, world!"

Docker Composeファイルの主な項目

Docker Composeで利用するキーや階層構造の主な記述方法についてまとめていきます。
Docker Composeで利用するcompose.yamlファイル内では、最上位で操作対象の指定をします。
これはコマンドで言うところの、dockerの後に指定するcontainernetworkなどの部分に近いイメージです。
ここにはコンテナを示すservices、ネットワークを示すnetworks、データボリュームを示すvolumesなどが記述されます。
その後に、1つインデントを下げてリソースの名前を記述します。例えば、services:の下に1つインデントを下げてcontainer01と記述すると、container01という名前のコンテナを設定していることになります。
リソースの名前の後にさらに1つインデントを下げて、そのリソースに対する設定を記述してきます。例えば、コンテナに対する設定であれば、image:でコンテナイメージの指定やports:でポート番号の設定などを行います。

servicesでコンテナの設定を記述する

services内ではコンテナの設定を記述していきます。
基本的な書き方と主な項目は以下の通りです。

services:
  containerName: #コンテナ名
    image: imageName #コンテナイメージ
    ports: #ポート番号
      - "XX:XX"
    networks: #接続するネットワーク
      - networkName
    volumes: #接続するボリューム
      - volumesName
    environment: #環境変数の設定
      ENV_KEY1: envValue1
      ENV_KEY2: envValue2

networksでネットワークの設定を記述する

networksでネットワークの設定を記述していきます。
基本的な書き方と主な項目は以下の通りです。

networks:
  networkName: #ネットワーク名
    driver: driverName #ドライバーの指定
    ipam: #IPアドレス管理の設定
      driver: default
      config:
        - subnet: "xxx.xx.xxx.x/xx"
          gateway: "xxx.xx.xxx.x"

volumesでボリュームの設定を記述する

volumesでボリュームの設定を記述していきます。
基本的な書き方と主な項目は以下の通りです。

volumes:
  volumeName: #ボリュームの名前
    driver: local #ドライバーの指定
    external: #外部で作成されたボリュームを利用する場合の設定
      name: externalVolumeName 外部ボリューム名

ファイル先頭にDocker Composeのバージョンを指定

ファイルの先頭にversionを指定することでDocker Composeのバージョンを指定することができます。
バージョンによってサポートされる機能が異なるため、バージョンを指定する方が望ましいでしょう。

version: 'x.x'

記述例

実際の記述例を以下に示します。
こちらの例では、webとdbの2つのコンテナとコンテナを繋ぐwebnetというネットワーク、dbコンテナのデータボリュームであるdb-dataについての設定が記述されています。

version: '3.8'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - webnet
  db:
    image: postgres:latest
    environment:
      POSTGRES_DB: example
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - webnet

networks:
  webnet:

volumes:
  db-data:

まとめ

Docker Composeの設定ファイルとなるcompose.yamlについて簡単な記述方法をまとめてきました。
yaml形式のファイルはDockerコンテナ以外にも利用シーンがあると思うので、基本的な記述方法は覚えておきましょう。
また、compose.yamlについても本当に基礎的な部分にしか触れていません。
それぞれ様々なオプションがあるので、必要に応じて調べてみてください。
ここまで読んでいただき、ありがとうございました。
それでは、また。