🚀 ニフティ’s Notion

Docker Compose

  • ここまで一つのコンテナを動かす方法を学んできました
  • 実際にサービスを動かす場合には、一つのコンテナでは足りない場合があります(Webアプリ + データベース、など)
  • 複数のコンテナを連携させるには、docker composeを使うのが簡単で一般的です

ここでは、Docker Composeを使って、データベースと連携したWebアプリを立ち上げてみましょう

docker composeとは

image block
  • Docker社の提供する、複数のコンテナを使う Docker アプリケーションを定義・実行するためのツール
  • compose.yaml という設定ファイルに、各コンテナをどのように立ち上げ、どのように連携するか記述する
  • docker compose up コマンドで設定ファイルで記述したとおりにコンテナが立ち上がり連携される

Docker Composeのメリット

複数コンテナを立ち上げるのが簡単 。コマンド一つで立ち上がる。

データベースと連携したWebアプリの例を考えると、

Composeを使わない場合

  1. Docker ネットワークを作成する( docker network create )。
  2. Webアプリと DB のコンテナをそれぞれ作成したネットワーク内で起動する( docker run —network …

Composeを使う場合

  1. compose.yaml を作成する。
  2. 立ち上げる( docker compose up

実際には、コンテナへの環境変数の設定や、Docker ボリューム機能を利用したデータの永続化などによって、コマンドはこれよりもっと長く多くなる。環境を立ち上げる度にそれを打たされることになる。

Docker Composeであればそれらの設定はすべて compose.yaml に記述できるため、コマンドは変わらず docker compose up 1つで済む。

compose.yaml

services:
  app:
    build:
      context: ./
      dockerfile: Dockerfile.dev
    volumes:
      - ./Tool:/usr/src/app
      - /usr/src/app/node_modules 
    command: sh -c "npm start"
    ports:
      - 3000:3000
    tty: true
    stdin_open: true
    environment:
      - CHOKIDAR_USEPOLLING=true 
networks:
  default:
    ipam:
      config:
        - subnet: 192.168.210.0/24
services
  • 起動するコンテナをサービスとして定義する
    • ↑ なら app というサービス
  • 各サービスについて設定を記述していく
    • 利用するイメージや Dockerfile、コンテナに設定する環境変数など
    • docker container run コマンドや docker image build コマンドの引数・オプションを指定していくイメージが近い
networks
  • Docker ネットワークを定義する
  • なくてもいい。ない場合はデフォルトネットワークが作成され、定義した各サービスがそのネットワーク内に作成される
    • networks: default: でデフォルトネットワークの設定を変更できる

その他にも指定できる項目がいくつかある。今回は省略。

⚠️
compose fileの最新仕様については現在、 The Compose Specification に記述されている。
その中で、以下のように述べられている。
The Compose file is a  YAML  file defining:

〜略〜

The default path for a Compose file is  compose.yaml  (preferred) or  compose.yml  that is placed in the working directory. Compose also supports  docker-compose.yaml  and  docker-compose.yml  for backwards compatibility of earlier versions. If both files exist, Compose prefers the canonical  compose.yaml .
  • 古いプロジェクトだと設定ファイル名が docker-compose.yml となっていることがあるが、今は compose.yaml を使うのが良さそう
  • 古いやつだとversionという項目があることがあるが、versionの記述は Optional になっているので必ずしも記述する必要はない
コマンドの説明
Command 説明
docker compose up サービス用のコンテナの構築、作成、起動、アタッチを行う。
docker compose down コンテナを停止し、  up で作成したコンテナ・ネットワーク・ボリューム・イメージを削除する。デフォルトではコンテナとネットワークのみ削除する。
docker compose build compose.yamlから一連のコンテナを構築する。
docker compose start コンテナを起動してサービスを開始する。
  • docker compose upは docker compose build docke compose start をまとめたもの
    • デフォルトでは再ビルドしないなど挙動が少しだけ違うので注意

リファレンス

⚠️
compose v1では、 docker-compose コマンドが使われていたが、現在は非推奨。
https://www.docker.com/blog/announcing-compose-v2-general-availability/#proposed-compose-v1-end-of-lie-timeline
先日 GitHub Actions でも v1 のコマンドは使えなくなったため注意。
https://engineering.nifty.co.jp/blog/26217