(最終更新月: 2025年7月15日)
✓当記事はこんな方におすすめです
「docker-compose.ymlの書き方を実例付きで丁寧に知りたい」
「docker composeの最新仕様やベストプラクティスを把握したい」
「実際の使い方・エラー対策・開発現場で役立つポイントを知りたい」
✓当記事で理解できること
- docker-compose.yml(compose.yaml)の基本構造と最新仕様
- よく使う書き方・実践的なサンプルと開発効率UPのコツ
- 失敗しがちな落とし穴・エラー解決策・ベストプラクティス
この記事では、未経験・初学者の方でも迷わないよう、経験に基づく具体例・最新のドキュメント情報(2025年7月時点)を元に「docker-compose.yml」作成から運用、エラー解消のポイントまで詳しく解説します。Dockerを仕事や学習に活かす人が増えている今、他サイトよりも一歩先んじる知識を身につけたい方にもピッタリです。
最後まで読み進めていただくことで、現場ですぐ役立つdocker-compose.yml知識を得られます。それでは、一緒に見ていきましょう。
Docker Composeの基本とアプリケーションモデル
このセクションでは、「Docker Compose とは何か・どんな仕組みで動くのか」「現代的なcompose.yaml構造」について解説します。
なぜなら、Docker Composeの全体像がイメージできていないと、書き方やエラーの意味を正しく理解できないからです。
- Docker Composeの役割・メリット
- アプリケーションモデル(services・networks・volumes)
- プロジェクト名によるリソース分離と実運用例
Docker Composeの役割・メリット
Docker Composeは、複数のコンテナから成るアプリケーション環境を1つの宣言的なYAMLファイルで「まとめて管理・起動」できるツールです(参照: 公式ドキュメント)。
この仕組みにより、開発・テスト・本番などあらゆる場面で「同じ手順」「同じ動作環境」を再現できる強みがあります。
たとえばWebアプリ+DB+キャッシュサーバーを一発で起動する、CI/CDのジョブごとに新しい環境を用意する、といった作業もシンプルなコマンドだけで実現できます。
「各サーバーの設定が人ごとにバラバラ」「起動する度に手順で戸惑う」といったトラブルもComposeでグッと減らせます。
アプリケーションモデル(services・networks・volumes)
Composeが扱う基本要素はservices(サービス)・networks(ネットワーク)・volumes(ボリューム)です。
services にはWebアプリ、DB、Redisなどの役割を持つ「コンテナ」の定義を書きます。
networks はサービス間通信の経路を分離・制御するしくみで、デフォルトではプロジェクトごとに分離したネットワークが自動生成されます。
volumes は永続データやファイルをサービス間で共有する領域を表します。Composeファイルはこれらを宣言的に管理し、一貫性ある環境を作り出します。
プロジェクト名によるリソース分離と実運用例
Composeは「プロジェクト」という概念で、同じホスト内でもサービス・ネットワーク・ボリュームを安全に分離します。
例えばmyappディレクトリで docker compose up を実行すると、「myapp_default」などプロジェクト名接頭辞つきのリソースが自動生成されます。
この仕組みのおかげで複数のアプリ環境を一台で同時に立ち上げたり、「feature-x」「main」などブランチ単位でまるごと動作比較や検証が可能です。
開発組織やCI/CD、個人学習問わず再現性・安全性を担保する基本設計となっています。
compose.yamlの書き方と現代的な仕様のポイント
このセクションでは、docker-compose.yml(compose.yaml)の基本構造と、最新仕様への移行ポイントを詳しく解説します。
理由は、現代のDocker Composeは「version」キー推奨廃止など変化が大きく、情報が混在しているため、ここで「いま正しい書き方」を頭に入れておくと安心して実践できます。
- ファイル名とYAML構文の注意点
- 現代Composeではversionキーは不要
- トップレベル要素と最新Compose Specification
ファイル名とYAML構文の注意点
Composeファイルはcompose.yamlが標準名です(互換のためdocker-compose.yaml等も読まれる)。
YAMLは空白2つのインデントで階層管理します。タブは使えないのでインデントミスが散発しがちです。
例えば下記のように記述します。
services:
web:
image: nginx:alpine
ports:
- "8080:80"
ファイル先頭に不要な空白やタブが入っただけでエラーになるため、エディタのYAMLサポートやエラーメッセージの読解力アップが必須です。
現代Composeではversionキーは不要
かつては version: ‘3.8’ などファイルの先頭でバージョンを明示していましたが、2025年時点のdocker composeコマンド(スペース区切り)は “version” キーを不要としています(参照: Compose file reference)。
Compose Specification(統一仕様)に則って常に最新スキーマで解釈されるため、今から新規作成する場合は省略しましょう。
昔のサンプルや他サイトの例で “version” があっても、機能的な意味は無いので混乱しないでください。
トップレベル要素と最新Compose Specification
compose.yamlは主に次のトップレベル要素からなります。
- services: アプリの構成単位(コンテナの中身)
- networks: サービス間ネットワーク分離・追加設定
- volumes: 永続データ保存・各サービスの共有ボリューム
- configs: 設定ファイルをサービスへ注入(大規模向け)
- secrets: パスワード等の機密データ注入(本番用途推奨)
この他にも、build, environment, depends_onなど様々な属性がservicesの中で使えます。
servicesセクションの書き方と主要パターン
このセクションでは、compose.yamlの中心となるservicesセクション(各サービスの定義方法)およびよく使うオプションを具体的に解説します。
なぜなら、servicesセクションはDocker Composeの肝であり、ここを理解すればほとんどの設定が自信を持って書けるからです。
- imageとbuildの使い分け
- 環境変数とenv_fileで機密管理
- ポート・ネットワーク・ボリュームの記述法
- 依存関係(depends_on+healthcheck)のベストプラクティス
imageとbuildの使い分け
サービス定義で核になるのが image および build キーです。
imageはDockerHub等の既存イメージ指定、buildはカスタムDockerfileを使う時指定します。
併用(build+imageも同時に書く)することで、「このDockerfileからビルドしたイメージに指定名(タグ)を付けてね」と明示でき、CI/CDパイプラインでのイメージ管理にも最適です。
services:
app:
build: ./src
image: myorg/myapp:1.0 # この指定があるとレジストリプッシュにも連携しやすい
環境変数とenv_fileで機密管理
バージョンやパスワードなどの設定値は environment か env_file で渡せます。
env_fileにしておくと機密値(APIキーやDBのパスワード)を.gitignore管理しやすく、本番や開発など環境ごとに切り替えも便利です。
services:
db:
image: postgres:14-alpine
environment:
POSTGRES_DB: mydb
env_file:
- ./.env
.env ファイルはバージョン管理から除外し、本番はDocker Secretsを利用するのが推奨です。
詳しくはDocker ComposeでMySQLを使う方法|コード例付きも参考にどうぞ。
ポート・ネットワーク・ボリュームの記述法
外部からアクセスするAPIやWebアプリのサービスは ports でホスト→コンテナへのマッピングを行います。
networksはサービス間の接続範囲を制御するために利用し、volumesは永続ストレージを提供します。
services:
web:
image: nginx:alpine
ports:
- "8080:80"
networks:
- frontend
volumes:
- ./app:/usr/share/nginx/html
enetworks:
frontend: {}
依存関係(depends_on+healthcheck)のベストプラクティス
サービス間の起動順制御には depends_on を使い、healthcheck を組み合わせることで「DBなど内部プロセスが完全に起動してからアプリを起動する」制御が可能になります。
従来のdepends_onは単なる起動順制御でしたが、condition: service_healthy を加えるとアプリケーションの起動のタイミングも安全に制御できます。
services:
app:
build: .
depends_on:
db:
condition: service_healthy
db:
image: postgres
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
interval: 10s
timeout: 5s
retries: 5
この仕組みは、特に「初めてDBコンテナを立ち上げる時に接続エラー」というつまずきを防ぎます。
開発現場で役立つcompose.yaml 実践Tips
このセクションでは、実務やハンズオン学習ですぐに使えるcompose.yamlの書き方・発展テクニックを紹介します。
背景には、「設定の使い回しや開発・本番切り分け」「複雑なサービス構成の管理」が必要になる場面が多いからです。
- 開発・本番で設定を分ける方法(複数ファイルのマージ)
- profiles/extends/includeによる設定の再利用
- watchモードでライブリロードを実現
開発・本番で設定を分ける方法(複数ファイルのマージ)
compose.yaml+compose.override.yamlなど複数ファイルを作成し、docker composeコマンドの-fオプションでマージするのが主流です。
たとえば、開発用はバインドマウント、デバッグ、ポート公開、本番用は最小限公開と役割を分離できます。
# compose.yaml(共通設定)
services:
app:
image: myorg/app:latest
# compose.override.yaml(開発用)
services:
app:
ports:
- "3000:3000"
volumes:
- ./src:/app/src
docker compose up だけで両者が自動的にマージされ、環境ごとに柔軟に対応可能です。
profiles/extends/includeによる設定の再利用
profilesを使えば「テスト用サービスだけ起動」「デバッグ時だけphpmyadminを追加起動」といった柔軟制御も一発です。
services:
backend:
image: my-backend
db:
image: mysql
phpmyadmin:
image: phpmyadmin
depends_on:
- db
profiles:
- debug
extendsやincludeで設定をモジュール化・チーム共有することもできます。
YAMLアンカー+extendsは似ているようで役割が違うため、状況に応じて賢く使い分けましょう。
watchモードでライブリロードを実現
docker compose up –watch を使うと、ホスト側ファイルの変更を即座にコンテナに反映して、ライブコーディング・ホットリロード開発が快適にできます。
srcやconfigファイルごとに sync・rebuild・sync+restart のアクションを分けて設定できるのが強みです。
services:
frontend:
build: ./frontend
develop:
watch:
- path: ./frontend/src
action: sync
target: /app/src
- path: ./frontend/package.json
action: rebuild
従来のバインドマウントよりもパフォーマンス&安定性に優れた現代的な開発手法になりつつあります。
よくある実践例とdocker-compose.ymlサンプル集
このセクションでは、さまざまな用途で役立つdocker-compose.yml(compose.yaml)の具体的な書き方サンプルを紹介します。
理由は、「実際のユースケースを自分の環境に合わせてまねる」のが初学者や現場エンジニアのテクニック向上に直結するからです。
- WordPress+MySQLのサンプル
- Node.js + PostgreSQLの開発環境
- Nginxリバースプロキシで複数サービス分岐
WordPress+MySQLのサンプル
Web開発学習、業務用WordPressサイトの立ち上げで人気な構成例です。(参照:awesome-compose)
services:
db:
image: mariadb:10.6
command: '--default-authentication-plugin=mysql_native_password'
volumes:
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=somewordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
expose:
- 3306
wordpress:
image: wordpress:latest
volumes:
- wp_data:/var/www/html
ports:
- "8080:80"
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
- WORDPRESS_DB_NAME=wordpress
depends_on:
- db
volumes:
db_data:
wp_data:
解説:サービス名がDNS解決されるので、WORDPRESS_DB_HOST=db のような指定でOK。ボリューム利用でデータが消える心配もありません。
さらに詳しいWordPress活用例はDockerでWordPressを立ち上げる方法|具体例・解説付きもどうぞ。
Node.js + PostgreSQLの開発環境
APIサーバー+DBの定番セット。ホストのsrcをマウントしnodemonでライブリロードのコツを紹介します。
services:
app:
build:
context: .
dockerfile: Dockerfile
image: node-postgres-api:dev
ports:
- "3000:3000"
volumes:
- ./src:/usr/src/app/src
- /usr/src/app/node_modules
env_file:
- ./.env
environment:
- NODE_ENV=development
depends_on:
postgres:
condition: service_healthy
command: npm run dev
postgres:
image: postgres:14.1-alpine
restart: always
env_file:
- ./.env
volumes:
- postgres-data:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $POSTGRES_USER"]
interval: 10s
timeout: 5s
retries: 5
volumes:
postgres-data:
この例ではnode_modulesを匿名ボリュームで上書きし、OS差異によるバグを防止。DBサービスのhealthcheckと連動したdepends_onで失敗しづらい起動順に整えています。
Node.js環境詳細や応用例はDockerでNode.jsを扱う方法|Dockerfile例付きもおすすめです。
Nginxリバースプロキシで複数サービス分岐
マイクロサービスや本格的なAPI構成に不可欠な「Nginxが各サービスへリクエストを分配」するケースを紹介します。
services:
proxy:
image: nginx:1.25-alpine
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "80:80"
networks:
- app-network
depends_on:
- service-a
- service-b
service-a:
image: my-service-a:latest
networks:
- app-network
service-b:
image: my-service-b:latest
networks:
- app-network
networks:
app-network:
driver: bridge
サンプルnginx.confでは location /api/a/ で service-a:8080 に転送、と柔軟なリバースプロキシが実現できます。
「本番に向けたセキュリティや構成の工夫」はDockerでNginxを利用する方法|具体例付きで丁寧に解説でも触れています。
docker compose コマンドの基礎とエラー対策
このセクションでは、compose.yamlの作成・デバッグ・運用に欠かせないdocker composeコマンド群と「やりがちなエラー」「トラブル時の対策」をまとめます。
これは、新人・現場問わず「起動できない・設定が反映されない・謎エラー」などに出くわす機会が多いからです。
- よく使うdocker composeコマンドとオプション
- 典型的なエラー・トラブルと解決策
よく使うdocker composeコマンドとオプション
主なコマンドと使い分け例は以下の通りです(参照: 公式CLIリファレンス)。
- up / up -d : プロジェクト起動(-dはバックグラウンド化)
- down : 全て停止し削除
- ps : 状態・ポート一覧
- logs : ログ表示。サービス名指定で個別詳細
- exec : 起動中コンテナ内で任意コマンド(例: bashでログイン)
- run : 一度きりの一時コンテナ起動(DB初期化やマイグレーションなど)
- build : 再ビルド
- pull : イメージの取得のみ
- config : マージ済み設定内容の検証。エラー調査に便利
プロジェクトごとの分離や複数ファイルの組み合わせ時は-p, -f, –profileなどグローバルオプションも効果的です。
典型的なエラー・トラブルと解決策
、インデント・コロン抜け・versionキー混在など細かいミスが初学者の失敗パターン1位です。
構文エラー時はdocker compose configで「意図した設定か/どこでパースエラーが出てるか」をチェックないしYAML lintツールを事前活用をおすすめします。
また、depends_onの罠(DB準備が遅い/healthcheck未設定)、イメージタグ:latestのまま(予期せぬバージョン障害)、環境変数エスケープ漏れなども失敗しやすいポイントです。
解消のコツとしては「公式ドキュメントの該当セクションを確認+構成を小さくして一つずつ積み上げる」のが王道です。
まとめ
この記事で押さえておきたい重要ポイントは次の3つです。
- compose.yamlは現代のDocker Composeで標準。versionは省略し、サービス・ネットワーク・ボリュームを宣言的に管理することで再現性と運用性が飛躍的にUPします。
- healthcheck+depends_on・env_fileなどの機能を使いこなすことで、開発効率&失敗率の低減に直結します。また、複数ファイルのマージやprofilesで現場の柔軟性を担保できます。
- 公式サンプルや内部リンク先記事も活用し、慣れたら自分向けテンプレートファイルとして少しずつ構成を進化させていくのがベストプラクティスです。
現場に出る・受託案件を進める・自分の開発を加速したい方も、docker-composeを積極的に活用し、効率的なインフラ管理を実現してください!
さらに一歩踏み込んだクラウド活用やサーバー選びも検討したい方はDigitalOceanなどもぜひチェックしてみてください。