Docker

Docker Compose バージョン指定・include属性・.envベストプラクティス完全ガイド

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

お得なお知らせ

スポンサードリンク
1ヶ月で資格+現場入り

インフラエンジニアへの最短ルート

未経験でもAWS・Linux・ネットワーク資格を最短で取り、現場入りまでサポート。SREやクラウドエンジニアの入口。

CODE×CODEスピード転職|無料面談▶ SRE/クラウドのフリーランス案件▶

▶ AWS/GCP/Kubernetesの独学には Kindle Unlimited の技術書読み放題がコスパ最強。


Contents

スポンサードリンク

1️⃣ はじめに ― なぜ Compose の設計が重要なのか

Docker Compose は 複数コンテナをコードで管理 できる強力なツールです。
しかし、以下のような課題が見落とされがちです。

課題 影響
ファイルが肥大化 → メンテナンスコスト増大 変更箇所を探しにくい
機密情報を平文で管理 → セキュリティリスク 情報漏洩や不正アクセスの原因
ネットワーク・ボリュームがデフォルト設定のまま → 不要な通信やデータ破損 本番環境で障害につながる

本ガイドでは、「公式にサポートされている」手法 に絞って解決策を提示します。


2️⃣ Compose ファイルバージョンの選び方

Docker Engine 20.10 以降 が対象となる最新の Compose ファイル形式は version: "3.9" です。

  • 3.9 は Swarm 機能だけでなく、profileshealthcheck といったモダンな構文をすべてサポートします。
  • 古いバージョン(例: 2.x)は一部オプションが廃止されているため、できるだけ新しい形式で統一しましょう。

ポイント
公式ドキュメントは常に最新版を参照してください。
https://docs.docker.com/compose/compose-file/


3️⃣ ファイル分割と再利用 ― include は存在しない

Compose に include キーワードはありません。公式が推奨する方法は「複数ファイルを組み合わせて実行」 です。

3‑1️⃣ 推奨ディレクトリ構成例

3‑2️⃣ 基本ファイル(docker-compose.yml)

3‑3️⃣ オーバーライド例(docker-compose.dev.yml)

メリット
- ファイル単位で変更範囲が限定できる
- CI/CD パイプラインでは必要なオーバーレイだけを指定すれば済む


4️⃣ 環境変数とシークレットのベストプラクティス

4‑1️⃣ .env非機密情報 のみ保存

項目 推奨場所
アプリケーション名、ポート番号、デバッグフラグ .env(リポジトリ外・.gitignore
パスワードや API キー Docker Secrets / env_file で暗号化管理

安全な .env の例

4‑2️⃣ Docker Secrets(Swarm)または docker compose run --env-file を活用

Swarm でのシークレット定義例

ローカル開発向け env_file の使用例

ポイント
本番環境では必ず Secrets または外部の安全な鍵管理サービス(AWS Secrets Manager 等)に委ね、平文ファイルがコンテナ内に残らないようにします。


5️⃣ 典型的なマルチサービス構成例

以下は Web アプリ + PostgreSQL + Redis + RabbitMQ の構成です。
depends_onhealthcheck を組み合わせて、起動順序と可用性を保証します。

5‑1️⃣ depends_onhealthcheck の効果

コンテナ 待機条件
webdb service_healthy(PostgreSQL が起動し、pg_isready が OK)
webredis 同上(Redis が PING で応答)
webrabbitmq service_started(起動したらすぐに接続可)

この組み合わせだけで、「依存サービスがまだ準備できていない」エラー を大幅に減らせます。


6️⃣ ネットワーク・ボリューム設計指針

6‑1️⃣ カスタムネットワークで通信範囲を限定

ネットワーク 用途
frontend 外部からアクセスが必要なサービス(Web)だけを接続
backend DB・キャッシュ・キューなど内部専用。internal: true で外部からの直接到達を遮断

6‑2️⃣ 永続ボリュームは命名規則とバックアップ戦略を持つ

  • 命名は「プロジェクト‑環境‑用途」の形で一目で分かるように。
  • バックアップはホスト側のマウント先ディレクトリを rsync・スナップショットで取得すると安全です。

7️⃣ モノレポ(単一リポジトリ)での運用例

7‑1️⃣ サービスごとに独立した Compose ファイルを持つ

ルート docker-compose.yml

  • メリット
  • CI/CD が変更されたサービスだけをビルド・テストできる。
  • 共通設定(ネットワーク、ボリューム)は docker-compose.yml に集約し、重複を排除。

8️⃣ セキュリティ強化 ― 非 root ユーザーとシークレット管理

8‑1️⃣ Dockerfile は必ず非 root ユーザーで実行

8‑2️⃣ シークレットは ファイルシステムに残さない 設計

  • Swarm で docker secret create → コンテナ内は一時的なメモリ領域にマウント。
  • ローカル開発では env_file の代わりに .env.local.gitignore)を使用し、Git に含めない

9️⃣ トラブルシューティング ― Docker API バージョン不整合

Docker クライアントとデーモンの API バージョンがずれると次のようなエラーが出ます。

解決策

  1. クライアントを最新に更新(Homebrew、APT など)
    bash
    brew upgrade docker # macOS の例
    sudo apt-get install -y docker-ce-cli # Ubuntu の例

  2. 互換モードで実行(一時的な回避策)
    bash
    export DOCKER_API_VERSION=$(docker version --format '{{ .Server.APIVersion }}')
    docker compose up

    ただし根本的にはクライアントとサーバーのバージョンを合わせることが推奨です。


🔚 まとめ ― 今日から使える 5 つのチェックリスト

# チェック項目
1 Compose ファイルは version: "3.9" を使用し、公式ドキュメントと同期させる
2 複数ファイルは docker compose -f で組み合わせ、include は使わない
3 .env に入れる情報は 非機密 のみ。パスワード等は Secrets または外部管理ツールへ委譲
4 カスタムネットワークと命名規則付きボリュームで「境界」と「永続性」を明確化
5 Dockerfile は非 root ユーザー実行、CI/CD パイプラインでは変更のあったサービスだけをビルド

it-bokenki.com では、上記ガイドに沿った実装例や CI/CD テンプレートも無料で公開しています。
今すぐリポジトリをクローンし、プロジェクトに組み込んで安全・高速なコンテナ運用を体感してください。

Happy Containerizing! 🚀

スポンサードリンク

お得なお知らせ

スポンサードリンク
1ヶ月で資格+現場入り

インフラエンジニアへの最短ルート

未経験でもAWS・Linux・ネットワーク資格を最短で取り、現場入りまでサポート。SREやクラウドエンジニアの入口。

CODE×CODEスピード転職|無料面談▶ SRE/クラウドのフリーランス案件▶

▶ AWS/GCP/Kubernetesの独学には Kindle Unlimited の技術書読み放題がコスパ最強。


-Docker