Docker Composeで開発効率UP!使ってよかった便利機能まとめ
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-app
とfuga-app
のDBそれぞれで実施しないといけない
では、hoge-app
と fuga-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