自由気ままに書いちゃおう

好きなことをつらつらと・・・

【Docker】docker-compose.yaml(docker-compose.yml)の書き方について

今回は、docker-compose.yamlの書き方を深堀します。

■はじめに

docker-compose.yamlは既に過去の記事で取り上げているので今更感はありますが、
備忘も兼ね、まとめています。

■docker-composeの公式サイト

Overview of Docker Compose | Docker Documentation

■docker-compose.yaml or docker-compose.yml ?

ファイル名はどちらでも大丈夫です。
公式サイトでは.ymlを使っていますね。
ちなみに、「Composeファイル」と呼ばれます。

■docker-compose.yamlの体裁について

以下のサンプルコードを用いて解説致します。

version: "3.8"

services: 
  mysqldb:
    container_name: mysqldb # コンテナ名を指定
    image: mysql:5.7
    networks: 
      - wpnet
    volumes: 
      - db_volume:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: P@ssw0rd
      MYSQL_DATABASE: wpdb
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: P@ssw0rd

  wp:
    container_name: wp # コンテナ名を指定
    depends_on:
      - mysqldb
    image: wordpress
    networks:
      - wpnet
    ports: 
      - 8888:80
    restart: always
    environment: 
      WORDPRESS_DB_HOST: mysqldb
      WORDPRESS_DB_NAME: wpdb
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: P@ssw0rd

networks: 
  wpnet:
    name: wpnet # ネットワーク名

volumes:
  db_volume:
    name: db_volume # ボリューム名を指定

■version

f:id:guri2o1667:20210601171152p:plain

composeファイルのバージョンです。

Compose file | Docker Documentation

2021年6月では、3.8が最新版です。
version指定は必須です。

また、第三者が見た際にどのバージョンの書式で書かれたcomposeファイルなのかが一目でわかるので、小数点以下第一位まで記載するようにするのが良いです。

■services、networks、volumes(概要)

詳細は後述致します。また、少し行数が飛びますが、
3行目:serivces
34行目:networks
38行目:volumes
について先に記載致します。

これらは、Composeファイルのサービス設定ネットワーク設定ボリューム設定と呼ばれ、それぞれが一つの大枠になっています。

そのため、Composeファイルは3つの要素で成立します。
サービス設定の中の設定項目(キー)が一番多いです。

■services

サービス設定です。
一段落目に作成したいサービス名(4行目、18行目。プログラム言語でいうところの関数名に相当)を記載致します。
サービス名はこれから作成するコンテナの総称です。
混乱しがちなのは、コンテナ名は別の設定項目(container_name)で定義します

f:id:guri2o1667:20210601171856p:plain
4行目~17行目が一つの括りです。ここでは、mysqlコンテナの設定を記載しています。

f:id:guri2o1667:20210601171907p:plain

18行目~32行目が一つの括りです。ここでは、Wordpress コンテナの設定を記載しています。

■mysqlコンテナの設定項目(5行目~16行目)

f:id:guri2o1667:20210601172232p:plain


container_nameはコンテナ名です。docker runコマンドの--nameオプションと同じです。

imageはコンテナイメージです。mysqlイメージやwordpressイメージを指定します。

networksは、サービスの中のネットワーク設定です。
※グローバルのネットワーク設定は34行目のことです。
サービスの中のネットワーク設定では、グローバルのネットワーク設定を利用する旨を定義しています。

volumesは、サービスの中のボリューム設定です。
※グローバルのボリューム設定は38行目のことです。
サービスの中のボリューム設定では、グローバルのボリューム設定を利用する旨を定義しています。
ここでは、db_volumeと/var/lib/mysqlをボリュームマウントしています。

restartは、以下の項目が設定できます。
それぞれはdocker runコマンドのrestartオプションと同等です。
restartオプションはこちら

no
on-failure
always・・・コンテナの終了コードに関わらず、常にコンテナの起動を試みます。
unless-stopped

environmentは、環境変数のことです。
docker runコマンドの-eオプションと同じです。

■WordPressコンテナの設定項目(18行目~32行目)

f:id:guri2o1667:20210601173326p:plain

portsは、公開用のポートを指定します。コロン区切りです。
A:Bの場合、
AはDockerホスト側のポート。Bはコンテナ側のポートです。
※ポート転送と思ってもらえればと。
尚、たまにコロンなしの数値だけの場合があります。
その場合はコンテナ側のポートを表しています。
(ホスト側はランダムなポートが割り当てられます。)

■networks(34行目~36行目)

f:id:guri2o1667:20210601173807p:plain


グローバルのネットワーク設定です。
ここで指定した35行目の記載が、8行目や24行目に使われます。
※プログラミング言語の関数の参照みたいな感じです。

f:id:guri2o1667:20210601173858p:plain

f:id:guri2o1667:20210601173911p:plain

name でネットワーク名を指定しています。
docker network create と同じです。

■volumes(38行目~40行目)

f:id:guri2o1667:20210601174034p:plain

グローバルのボリューム設定です。
ここで指定した39行目の記載が、10行目に使われます。
※プログラミング言語の関数の参照みたいな感じです。

f:id:guri2o1667:20210601174102p:plain

name でボリューム名を指定しています。
docker volume create と同じです。

以上です。