Zenn
🐳

Docker Composeで開発効率UP!使ってよかった便利機能まとめ

2025/03/29に公開

1. はじめに

日頃業務で Docker Compose を使って開発環境を構築している人も多いと思いますが、その中で私が便利だなと思った機能をピックアップします。

2. 想定読者と背景

想定読者:Docker Compose を使ったことはあるが、もっと便利な機能を知りたい人
背景:Docker Compose を使ってよかった機能を紹介し、開発効率を上げるヒントを提供する

3. 使って良かった機能

include 属性を使って Compose ファイルを再利用

include 属性とは

  • Docker Compose 2.20 で導入
  • include 属性を使用することで他の Compose ファイルへの依存関係を宣言可能
    • 他の Compose ファイルを再利用可能
    • 肥大化した Compose ファイルを個別に管理し見通しがよくなる

事例

最初にモノレポの環境でアプリケーション( hoge-app )の開発環境を構築する際、ディレクトリ構成と Compose ファイルは以下のような構成にしていました。

-- ディレクトリ構成
root
├── hoge-app
└── infra
     └── docker
          └── hoge-app
              ├── nginx
              │    └── Dockerfile -- nginx のイメージを構築する
              ├── php
              │    └── Dockerfile -- php-fpm のイメージを構築する
              ├── postgresql
              │    └── Dockerfile -- postgresql のイメージを構築する
              └── compose.yaml
# hoge-app を構築する Compose ファイル
name: sample

services:
  php:
    container_name: php-container
    image: sample/php:dev
    build:
      context: ../../..
      dockerfile: ./infra/docker/hoge-app/php/Dockerfile
    ports:
      - "9000:9000"
    volumes:
      - ../../../hoge-app/:/var/www/
    depends_on:
      - postgresql
    networks:
      - default

  nginx:
    container_name: nginx-container
    image: sample/nginx:dev
    build:
      context: ../../..
      dockerfile: ./infra/docker/hoge-app/nginx/Dockerfile
    ports:
      - "8080:80"
    volumes:
      - ../../../hoge-app/:/var/www/
    depends_on:
      - php
    networks:
      - default

  postgresql:
    container_name: postgresql-container
    image: sample/postgresql:dev
    build:
      context: ../../..
      dockerfile: ./infra/docker/hoge-app/postgresql/Dockerfile
    restart: always
    ports:
      - "5432:5432"
    volumes:
      - postgresql-store:/var/lib/postgresql/data/
    environment:
      - POSTGRES_PASSWORD=${PARTNER_DB_PASSWORD:-test}
    networks:
      - default

volumes:
  postgresql-store:
    name: postgresql-store
    driver: local

networks:
  default:
    name: sample
    driver: bridge

こうしておくことで、環境の起動は docker compose up -d を実行すれば一発で立ち上がりますので便利ですね。
ただ、しばらくしてもう一つ別のアプリケーション( fuga-app )を開発する必要がでてきました。
モノレポの構成で普通に構築すれば以下のような構成になると思います。

-- ディレクトリ構成
root
├── hoge-app
├── fuga-app -- 新規構築するアプリケーション
└── infra
     └── docker
          ├── hoge-app
          │   ├── nginx
          │   │    └── Dockerfile -- nginx のイメージを構築する
          │   ├── php
          │   │    └── Dockerfile -- php-fpm のイメージを構築する
          │   ├── postgresql
          │   │    └── Dockerfile -- postgresql のイメージを構築する
          │   └── compose.yaml
          └── fuga-app
              ├── jdk
              │    └── Dockerfile -- jdk のイメージを構築する
              ├── postgresql
              │    └── Dockerfile -- postgresql のイメージを構築する
              └── compose.yaml

fuga-app

  • DB は hoge-app が参照している DB を参照
  • hoge-app 自体と疎通することはない

といったものですが、上記の構成だと DB が分かれてしまうため、開発体験があまりよくないことになります。
例えば以下のようなことが考えられます。

  • hoge-app で登録、更新されたデータを fuga-app で参照することができない
  • DBのマイグレーションを hoge-appfuga-app のDBそれぞれで実施しないといけない

では、hoge-appfuga-app の開発環境をまとめてしまえばよいのでは?と思いますが、そうなった場合、Compose ファイルは以下のような感じになります。

# hoge-app と fuga-app を構築する Compose ファイル
name: sample

services:
  php:
    container_name: php-container
    # 長いので省略
  nginx:
    container_name: nginx-container
    # 長いので省略
  postgresql:
    container_name: postgresql-container
    # 長いので省略

  jdk:
    container_name: jdk-container
    image: sample/jdk:dev
    build:
      context: ../../..
      dockerfile: ./infra/docker/hoge-fuga-app/jdk/Dockerfile # docker 配下を hoge-app → hoge-fuga-app にリネーム
    ports:
      - "8081:80"
    volumes:
      - ../../../fuga-app/:/var/www/
    depends_on:
      - postgresql
    networks:
      - default
# 以下省略

はい、長くなり一気に Compose ファイルの見通しが悪くなりました。
また、環境起動で docker compose up -d を実行すると hoge-app の環境も起動してしまうため、場合によってはCPUやメモリに負荷がかかり開発速度に影響が出てしまう可能性があります。

こういったときに活躍するのが include 属性です。最終的には以下の構成になりました。

-- 最終的なディレクトリ構成
root
├── hoge-app
├── fuga-app -- 新規構築するアプリケーション
└── infra
     └── docker
          ├── hoge-app
          │   ├── nginx
          │   │    └── Dockerfile -- nginx のイメージを構築する
          │   ├── php
          │   │    └── Dockerfile -- php-fpm のイメージを構築する
          │   └── compose.yaml
          ├── fuga-app
          │   ├── jdk
          │   │    └── Dockerfile -- jdk のイメージを構築する
          │   └── compose.yaml
          └── db -- DB の構築を外に切り出す
              ├── postgresql
              │    └── Dockerfile -- postgresql のイメージを構築する
              └── compose.yaml

# hoge-app を構築する Compose ファイル
name: sample

services:
  php:
    container_name: php-container
    # 長いので省略

  nginx:
    container_name: nginx-container
    # 長いので省略

networks:
  default:
    name: sample
    driver: bridge

# include 属性を使い DB の Compose ファイルを読み込み
include: 
  - ../db/compose.yaml
# fuga-app を構築する Compose ファイル
name: sample

services:
  jdk:
    container_name: jdk-container
    # 長いので省略

networks:
  default:
    name: sample
    driver: bridge

# include 属性を使い DB の Compose ファイルを読み込み
include: 
  - ../db/compose.yaml
# DB を構築する Compose ファイル
name: sample

services:
  postgresql:
    container_name: postgresql-container
    # 長いので省略

networks:
  default:
    name: sample
    driver: bridge

このようにすることで hoge-app の環境起動で docker compose up -d を実行すれば DB のコンテナも一緒に起動するようになります。( fuga-app の起動時も同じ)
また、hoge-app を起動している際に fuga-app を起動すると DB が既に起動済みであるため、余分なリソースを消費せずに開発を進めることができます。
※注意事項としてプロジェクト名は統一しておかないと fuga-app 起動時にDBコンテナは別物として認識され衝突してしまいエラーになります。

やってみた所感

実際にやってみてよかった点はざっと以下になります。

  • Compose ファイルの見通しが圧倒的によくなった
  • DB の Compose ファイルを再利用できるため重複して作成しなくよくなった
    • 例えばマイグレーション用のアプリケーションを追加する場合などにも利用可能
  • 他のプロジェクトからの利用もしやすくなった
    • マイクロサービスなどでサービス分割をしている際に他チームにとっても共有しやすい状態

4. おわりに

include 属性を活用することで、Compose ファイルの肥大化を防ぎ、管理を容易にしつつ、開発環境の再利用性を高めることができます。
特にモノレポ構成で複数のアプリケーションを扱う場合には、include を用いることで共通化しやすくなり、開発効率の向上につながります。

Docker Compose は便利な機能が日々追加されているため、公式ドキュメントのリリースノートを定期的にチェックしながら、最新の機能を活用していきましょう!

※長くなってしまったため、今回は include 属性の紹介のみになりましたが、他にも便利な機能はありますのでまた次の機会にでも事例を踏まえてご紹介しようかと思います。

参照

Discussion

ログインするとコメントできます