Docker

Docker Compose 基本と最新仕様 – V2への移行とベストプラクティス

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

Docker Compose の基本と最新仕様

Docker Compose は 複数コンテナを 1 つの YAML ファイルで宣言的に管理 できるツールです。2026 年時点では CLI が Compose V2 に統合され、ファイル形式は Compose Specification(バージョン番号不要)を推奨しています。本セクションでは、最新仕様の全体像と従来との主な違いを整理し、実務で迷わないためのポイントを解説します。

Compose ファイルの基本構造

Compose ファイルはトップレベルに 4 つのキー を持ちます。以下はそれぞれの役割と最小構成例です(インデント・コメントは統一しています)。

  • services:起動対象コンテナとその設定。
  • networks:明示的に定義しなくても default が自動生成されますが、分離したい場合はここで名前を付けます。
  • volumes:永続化領域を Docker が管理する named volume を宣言します。

ポイントversion: フィールドは省略可能です。Docker はファイルを自動的に最新仕様として解釈し、非推奨構文の使用を防ぎます。

バージョン指定の変遷とベストプラクティス

時期 記述方法 主な特徴
Compose V1(2020 以前) version: "3.9" 必須 スキーマが固定、拡張性が低い
Compose V2(現在) version: 省略可 プラグインで機能追加可能、CLI が統合

結論:新規プロジェクトは バージョン行を削除 した形で作成し、将来の互換性を確保してください。

Compose V2 と従来 v3.9 の比較

以下の表は、CLI の実装とファイル形式の違いをまとめたものです。表の前に簡単な説明文を入れています。

比較ポイント:主に「バージョン指定」「拡張性」「ネットワーク自動生成」の観点で差異があります。

項目 Compose V2(CLI) 従来 v3.9 形式
version フィールド 任意・省略可 必須(非推奨)
プラグイン拡張 docker compose plugin install <name> で追加可能 スキーマ固定
デフォルトネットワーク 自動作成 (bridge) が標準 明示的に default 必要
シークレット管理 BuildKit の --secret と組み合わせて利用可 Swarm 専用 secrets: キーのみ

サービス構成パターン:シングル vs マルチ

プロジェクト規模や開発フェーズに応じて 単一サービス、または 複数サービス の構成を選択します。ここでは代表的な実装例と、依存関係・起動順序のベストプラクティスを示します。

最小構成のシングルサービス(Nginx)

単体コンテナで動作確認したい場合の最短例です。ports によるポートマッピングだけで完結します。

ポイント:この形はローカル開発やデモ環境での「すぐに起動」向けです。

Node.js + MySQL の典型スタック

アプリと DB を別サービスとして定義し、depends_onhealthcheck で安全な起動順序を実現します。

ポイントhealthcheck が成功するまで api は待機し、接続失敗を防げます。

Flask + Redis のバックエンド API パターン

環境変数は .env に外部化し、env_file で一括読み込みします。

ポイントenv_file に書かれた変数はコンテナ内部で自動的に展開されます。

Nginx リバースプロキシ+複数コンテナ構成

フロントエンド・バックエンドを統合し、外部ネットワーク public を経由してホストと通信させる例です。external: true の意味は公式ドキュメント(Docker Engine reference – network create)で確認できます。

ポイントpublic は既存のブリッジネットワークを共有するため、外部 API やホスト側ツールとの連携が容易です。


ビルド・イメージ管理・環境変数・ボリューム活用法

実務では ビルド方式の選択機密情報の安全な取り扱い が鍵になります。この章でそれぞれのベストプラクティスを具体例と共に示します。

buildimage の使い分け

用途 設定例
ソースからイメージ生成(開発・CI) build:contextdockerfile を指定
既製イメージの利用(本番) image: にレジストリタグを記述

ポイント:ローカル開発では build、本番環境では CI が作成したレジストリイメージを image: で参照するのが管理しやすいです。

.env による環境変数の一元管理

機密情報は .gitignore に追加し、チームごとにローカルで保持します。以下はサンプルです。

Compose 側の記述はシンプルです。

ポイントenv_file はファイル全体をインポートするので、個別に environment: を書く手間が省けます。

永続化ボリュームの種類と設定例

種類 特徴 推奨シーン
named volume Docker が管理し、バックアップや移行が容易 本番データベース・永続ストレージ
bind mount ホストディレクトリを直接マウント。コード変更が即時反映 ローカル開発・ホットリロード

ポイント:本番は named volume、ローカルは bind mount を組み合わせると安全かつ高速です。


実務で必須のオプションとネットワーク設計

コンテナ運用では 起動順序・ヘルスチェック・再起動ポリシー、そして ネットワーク分離 が重要です。以下に具体的な設定例を示します。

depends_onhealthcheckrestart の実装例

ポイントrestart: unless-stopped は開発マシンの再起動時にコンテナを自動で復帰させ、手作業を減らします。

ネットワーク分離と外部ネットワーク活用例

内部サービスはプライベート internal ネットワークに閉じ、外部 API と通信が必要なものだけ public に参加させます。public は Docker Desktop がデフォルトで提供するブリッジネットワークを再利用します(公式参照: https://docs.docker.com/engine/reference/commandline/network_create/#options)。

ポイントinternal は他サービスからのみアクセス可能。攻撃面を最小化しつつ、必要な通信だけ public に露出させます。


シークレット管理の実践例(Swarm 非対応でも安全に)

Docker Desktop の GUI では Secrets 機能が Swarm 専用で利用できません。その代わりに BuildKit の --secret オプション を組み合わせると、ビルド時に機密情報をコンテナ内部へ安全に流し込めます。以下は実際の手順です。

1. シークレットファイルを用意

.gitignore.db_pass を追加してください。

2. Dockerfile 側でシークレットを参照

3. Compose で BuildKit ビルドを実行

コマンド例:

ポイント:シークレットはビルドプロセスの中だけで利用され、最終イメージには残りません。実行時に環境変数として渡す場合は docker compose up -d 時に同様の --env-file を併用してください。


Docker Desktop での基本操作とトラブルシューティング

Docker Desktop は GUI と CLI のハイブリッド環境です。以下は日常的に使用するコマンドと、よくあるエラーへの対処法です。

基本コマンド一覧

コマンド 説明
docker compose up -d 定義されたサービスをバックグラウンド起動
docker compose down コンテナ・ネットワーク・ボリューム(オプション)を削除
docker compose logs -f リアルタイムで全コンテナのログを見る
docker compose exec <svc> sh 起動中コンテナにシェル接続

GUI でも同等操作が可能ですが、CI/CD や自動化では CLI が必須 です。

よくあるエラーと公式ドキュメントでの対処法

エラーメッセージ 原因例 推奨対策(公式リンク)
Error starting userland proxy (ポート競合) ホスト側で同じポートが使用中 docker compose ps で確認し、ports のマッピング先を変更。
参照: https://docs.docker.com/compose/networking/
permission denied(ボリューム権限) macOS/Windows とコンテナ UID が不一致 ボリュームオプションに cached / delegated を付与、または Docker Desktop の File Sharing 設定で対象ディレクトリを追加。
参照: https://docs.docker.com/desktop/mac/#file-sharing
healthcheck failed repeatedly 起動待ち時間が短すぎる interval, timeout, retries を長めに設定し、実際の起動ログで遅延を測定。
参照: https://docs.docker.com/engine/reference/builder/#healthcheck

ポイント:エラーメッセージはそのまま検索すると公式ドキュメントや GitHub Issue がヒットしやすいので、まずは Google / DuckDuckGo で検索しましょう。

設定ファイルの分割と CI/CD への組み込み

  1. 設定ファイル分割
  2. docker-compose.yml … 共通ベース
  3. docker-compose.override.yml … ローカル開発用上書き(IDE が自動適用)
  4. docker-compose.prod.yml … 本番環境向け設定

実行例:

bash
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

  1. シークレットの安全な取り扱い(上記 BuildKit 参照)
  2. CI/CD パイプライン
  3. GitHub Actions の docker/compose-action を使用し、docker compose build --push → レジストリへプッシュ。
  4. デプロイステップは docker compose pull && docker compose up -d で実行。

結論:ファイル分割と BuildKit によるシークレット管理を組み合わせれば、ローカル開発から本番デプロイまで同一の Compose 定義を安全に再利用できます。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Docker