【初心者向け】docker-compose.ymlの書き方を調べてみた

こんにちは、おくやんです。

このブログでは、開発に役立つノウハウを実践的なコード例と共に紹介しています。

Dockerを利用しているが、docker-compose.ymlの書き方がわからない。。。
書かれている内容をいまいち理解していない。。。
設定を変えたいときにどのように変更していいかわからない。。。

今回は、このようなお悩みを解決します。

 本記事の内容

バージョン設定(version)の書き方
サービス設定(services)の書き方
ボリューム設定(volumes)の書き方

今回はdocker-compose.ymlの書き方についてまとめました。

docker-compose.ymlの内容はなんとなく理解しているけど・・・という方は多いと思います。実際の設定例を見ながら解説していきますので理解を深めていきましょう。

docker-compose.ymlの中身を見てみよう

docker-compose.ymlの中身を見てみよう画像

今回は下記の設定例をもとに解説を行っていきます。

 docker-compose.yml

# ① バージョン設定
version: '3.8'

# ② サービス設定
services:
  db:
    image: postgres:14.4-alpine3.16
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - db-data:/var/lib/postgresql/data
    ports:
      - 15432:5432
    env_file:
      - .env-dev

  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    environment:
      STAGE: local
      DOMAINS: "${HTTPS_PORTAL_HOST} -> http://web:3000"
    depends_on:
      - web

  web:
    build:
      context: .
      target: development
    environment:
      - TZ=Asia/Tokyo
      - BUNDLE_APP_CONFIG=/app/.bundle
    env_file:
      - .env-dev
    ports:
      - 3000:3000
    volumes:
      - .:/app
      - bundle-data:/usr/local/bundle
    command: bash -c "rm -f tmp/pids/server.pid && bin/dev"
    stdin_open: true
    tty: true
    depends_on:
      - db

# ③ ボリューム設定
volumes:
  db-data:
    driver: local
  bundle-data:
    driver: local

早速設定の内容を見ていきます。

① バージョン設定(version)

version: 3.8

versionはComposeファイルの文法バージョンを定義します。

ComposeファイルのバージョンとDockerバージョンのサポート状況に関してはCompose ファイル version 3 リファレンスを参照ください。

今回はバージョン 3.8を利用します。

② サービス設定(services)

services:
  db:
    ・・・

  https-portal:
    ・・・

  web:
    ・・・

servicesは実行するサービス(コンテナ)の定義を記載していきます。サービスは複数定義でき、サービス名は任意に指定可能です。

今回はDBサーバ(db)、Webサーバ(https-portal)、APサーバ(web)の3つを定義しています。

続いてサービス設定の中身を見ていきましょう。

image

services:
  db:
    image: postgres:14.4-alpine3.16
    ・・・

  https-portal:
    image: steveltn/https-portal:1
    ・・・

imageでは起動するDockerイメージを指定します。Dockerイメージをもとに各コンテナが生成されます。

DockerイメージはDocker Hubで取得することができるため、サイトから必要なイメージを探して利用しましょう。

設定例ではDBサーバにpostgres:14.4-alpine3.16のイメージを、Webサーバにsteveltn/https-portal:1のイメージを指定しています。

build

web:
  build:
    context: .
    target: development

buildではDockerfileをもとに作成した、独自のDockerイメージを利用します。

imageの記述しない場合はbuildの記述が必要です。

context

contextではDockerfileを含むフォルダパスか、GitリポジトリのURLが指定可能です。

相対パスで指定する場合はComposeファイルからの相対パスを指定します。

設定例ではカレントフォルダにあるDockerfileをもとにbuildが実行されます。

target

targetはマルチステージビルドを利用する場合に利用します。

ビルドするステージ名を選択したい場合は、targetで指定可能です。

設定例ではbuildステージをdevelopmentに指定しています。

dockerfile

dockerfileでは使用するDockerfileを指定できます。

省略された場合は、contextで指定したフォルダ配下の「Dockerfile」が読み込まれまれる仕様です。

設定例では省略しており、contextで指定した「.」配下のDockerfileが読み込まれます。

volumes

services:
  db:
    ・・・
    volumes:
      - db-data:/var/lib/postgresql/data
    ・・・
 
  web:
    ・・・
    volumes:
      - .:/app

volumesでは下記の指定が可能です。

 volumesの種類

・名前付きボリューム割り当て
・ホスト側のフォルダをマウント

名前付きボリューム割り当て

volumes:
  - db-data:/var/lib/postgresql/data

名前付きボリュームをコンテナ上のフォルダに割り当てます。名前付きボリュームの割り当て定義は下記フォーマットで記述します。

[volume名]:[コンテナの絶対パス]

記述例ではコンテナ上の/var/lib/postgresql/dataに名前付きボリュームdb-dataを割り当ています。

ホスト側のフォルダをマウント

volumes:
  - .:/app

ホスト側のフォルダをコンテナ上のフォルダにマウントします。記述フォーマットは下記です。

[ホストのパス]:[コンテナの絶対パス]

ホスト側のパスを相対パスで指定する場合は、Composeファイルからのパスを指定します。

ports

ports:
  - 15432:5432

portsはホスト側のポートとコンテナ側のポートの紐づけを行います。

設定例はホスト側の15432ポートにアクセスすると、コンテナ側の5432につないでくれる設定です。

environment

environment:
  - TZ=Asia/Tokyo

environmentはコンテナ内で利用する環境変数の定義です。

DBサーバ用のコンテナでは環境変数TZを定義することで、コンテナ内のタイムゾーンをAsia/Tokyoに設定しています。

env_file

env_file:
  - .env-dev

env_fileは外部に定義した環境変数ファイルを指定します。

下記フォーマットで定義されている設定を読み込むことができます。

[Key]=[Value]

複数のコンテナで共通で利用したい環境変数や環境ごとに値を変更した場合に、設定をファイルに書き出しておくと便利です。

depends_on

depends_on:
  - web

depends_onはコンテナの起動順や停止順を制御する際に利用します。

設定例はDBサーバ→APサーバ→Webサーバの順に立ち上がり、Webサーバ→APサーバ→DBサーバの順で停止する設定です。

command

command: bash -c ""rm -f tmp/pids/server.pid && bin/dev""

commandではコンテナ起動時に実行するコマンドを指定します。

設定例ではrailsアプリケーションを立ち上げるためのコマンドを実行しています。

stdin_open

stdin_open: true

stdin_openはコンテナとホストの標準入力をつなぐ設定です。

trueを設定することでホストの入力がコンテナに送られるようになります。

tty

tty: true

ttyはコンテナに疑似TTYを割り当てる設定を行います。

trueに設定することで、コンテナを起動したままにすることが可能です。

③ ボリューム設定(volumes)

volumes:
 db-data:
  driver: local
 bundle-data:
  driver: local

ボリューム設定では名前付きボリュームの定義に関する記述をします。定義を追加することで、名前付きボリュームが作成されます。

今回はdb-dataとbundle-dataという名前のボリュームを作成しています。名前は任意に指定可能です。

driverにlocalを指定すると、PC上にデータが保存されます。

WSL2を利用している場合は\\wsl$\docker-desktop-data\data\docker\volumesに保存されます。

名前付きボリューム画像
名前付きボリューム

まとめ: docker-compose.ymlの書き方

まとめ docker-compose.ymlの書き方画像

今回はdocker-compose.ymlの書き方について調べた内容をまとめてみました。

各項目の役割はこちらです。

 docker-compose.ymlの項目

version Composeファイルの文法バージョンを定義
services 実行するサービス(コンテナ)の定義
②-1 image 起動するDockerイメージを指定
②-2 build Dockerfileに記述した内容をもとに、独自のDockerイメージを作成し利用する場合に指定
②-2-1 context Dockerifleを含むフォルダパスか、GitリポジトリのURLを定義
②-2-2 target マルチステージビルドを利用する場合にbuildステージを指定
②-2-3 dockerfile 使用するDockerfile名を指定
②-3 volumes 下記を利用する場合に指定
・名前付きボリューム割り当て
・ホスト側のフォルダをマウント
②-4 ports ホスト側のポートとコンテナ側のポートの紐づけを定義
②-5 environment コンテナ内で利用する環境変数を定義
②-6 env_file 外部に定義した環境変数ファイルを指定
②-7 depends_on コンテナの起動順や停止順を制御する際に指定
②-8 command コンテナ起動時に実行するコマンドを指定
②-9 stdin_open コンテナとホストの標準入力をつなぐ設定を指定
②-10 tty 疑似TTYを割り当てる設定を指定
volumes 名前付きボリュームに関する定義

docker-compose.ymlを作成する際は参考にしてみてください。

最後まで読んでいただき、ありがとうございます。


最新情報をチェックしよう!

Dockerの最新記事8件