Docker Compose アプリケーションの構築方法

DockerBeginner
オンラインで実践に進む

はじめに

Docker Compose は、現代のソフトウェア開発において重要なツールです。開発者は、シンプルな宣言型の構成ファイルを通して、複雑なマルチコンテナアプリケーションを定義および管理できます。この包括的なチュートリアルでは、Docker Compose のコアコンセプト、アーキテクチャ、そして効率的なコンテナデプロイメントと管理のための実践的な実装戦略を探ります。

Docker Compose の基礎

Docker Compose の概要

Docker Compose は、コンテナオーケストレーションのための強力なツールです。開発者は、Docker Compose を使用して、マルチコンテナアプリケーションを容易に定義および管理できます。現代のソフトウェアデプロイメントにおける重要なコンポーネントとして、Docker Compose は複雑なアプリケーション環境の設定と実行を簡素化します。

コアコンセプトとアーキテクチャ

Docker Compose は、YAML 構成ファイルを使用して、コンテナ化されたアプリケーションのサービス、ネットワーク、ボリュームを定義します。主な目的は、単一の宣言型構成を通して相互接続されたコンテナのデプロイメントを効率化する事です。

graph TD
    A[Docker Compose] --> B[YAML 構成ファイル]
    B --> C[サービス定義]
    B --> D[ネットワーク構成]
    B --> E[ボリューム管理]

Docker Compose の主要コンポーネント

コンポーネント 説明 目的
サービス コンテナ構成 個々のコンテナを定義
ネットワーク コンテナ間の通信 コンテナ間のネットワークを管理
ボリューム 永続的なデータストレージ データの永続性を扱う

実践的な例:Web アプリケーションの設定

一般的な Web アプリケーションのための包括的な Docker Compose 構成を以下に示します。

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./website:/usr/share/nginx/html
  database:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: mysecretpassword
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

構成の解説

  1. この例では、Web サーバーとデータベースの 2 つのサービスを定義しています。
  2. Nginx はローカルディレクトリから静的コンテンツを提供します。
  3. PostgreSQL データベースは永続的なボリュームを使用して構成されています。
  4. ポートマッピングにより、外部からの Web アクセスが可能になります。

インストールと初期化

Ubuntu 22.04 で Docker Compose を開始するには、以下のコマンドを使用します。

sudo apt update
sudo apt install docker-compose-plugin
docker compose version

実行と管理

マルチコンテナアプリケーションの実行は簡単です。

## バックグラウンドでコンテナを起動
docker compose up -d

## 実行中のコンテナを表示
docker compose ps

## コンテナを停止して削除
docker compose down

設定とネットワーク

YAML 設定の基本

Docker Compose は、複雑なコンテナ環境を定義するために YAML ファイルを使用します。設定構造は、サービスのデプロイ、ネットワーク、環境設定を詳細に制御します。

graph LR
    A[YAML 設定] --> B[サービス定義]
    A --> C[ネットワーク設定]
    A --> D[環境変数]

サービス定義の戦略

設定オプション 目的
image コンテナのベースイメージを指定 nginx:latest
ports コンテナとホストのポートをマッピング "8080:80"
environment 実行時変数を設定 DATABASE_URL=postgres://...
volumes 永続的なストレージを管理 ./data:/app/data

高度なネットワーク設定

Docker Compose は、カスタムネットワーク定義を通して高度なネットワークシナリオを可能にします。

version: "3.8"
services:
  frontend:
    image: nginx:alpine
    networks:
      - frontend_network

  backend:
    image: python:3.9
    networks:
      - backend_network
      - frontend_network

networks:
  frontend_network:
    driver: bridge
  backend_network:
    driver: overlay

環境変数の管理

柔軟な環境設定は、複数のデプロイメントシナリオをサポートします。

## .env ファイルを作成
echo "DATABASE_PASSWORD=secretpassword" > .env

## Docker Compose 設定
version: '3.8'
services:
database:
image: postgres:13
environment:
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}

ネットワークの分離と通信

graph TD
    A[Frontend サービス] -->|分離されたネットワーク| B[Backend サービス]
    B -->|共有ネットワーク| C[データベースサービス]

実践的なネットワークコマンド

## Docker ネットワークの一覧表示
docker network ls

## 特定のネットワークの検査
docker network inspect frontend_network

## カスタムネットワークの作成
docker network create myapp_network

コンテナ接続性の検証

## サービス接続性の確認
docker compose exec frontend ping backend

## ネットワークの詳細を表示
docker compose config --resolve-env-vars

高度なデプロイ戦略

サービスの動的スケーリング

Docker Compose は、コンテナインスタンスの管理のための強力なスケーリングメカニズムを提供します。

## 特定のサービスをスケールアップ
docker compose up --scale web=3 -d
graph LR
    A[ロードバランサー] --> B[Web サービス 1]
    A --> C[Web サービス 2]
    A --> D[Web サービス 3]

サービスの依存関係管理

適切な起動シーケンスとサービス間の依存関係を確立します。

version: "3.8"
services:
  database:
    image: postgres:13
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5

  backend:
    image: myapp-backend
    depends_on:
      database:
        condition: service_healthy

モニタリングとヘルスチェック

モニタリング手法 説明 実装方法
ヘルスチェック サービスの稼働状態を確認 カスタムコマンドの実行
リソース制限 コンテナのリソースを制御 CPU/メモリ制限
ロギング 集中ログ管理 ELK スタックの統合

リソース制約の設定

services:
  web:
    image: nginx
    deploy:
      resources:
        limits:
          cpus: "0.50"
          memory: 512M
        reservations:
          cpus: "0.25"
          memory: 256M

高度なトラブルシューティング手法

## 詳細なサービスログ
docker compose logs -f backend

## リアルタイムのリソース監視
docker stats

## 包括的なシステム診断
docker compose ps
docker compose config

サービスディスカバリとネットワークの複雑さ

graph TD
    A[サービスレジストリ] --> B[Frontend サービス]
    A --> C[Backend サービス]
    A --> D[マイクロサービス 1]
    A --> E[マイクロサービス 2]

継続的デプロイワークフロー

version: "3.8"
services:
  ci-runner:
    image: docker:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: |
      sh -c "
        docker compose pull
        docker compose up -d --build
        docker compose ps
      "

パフォーマンス最適化戦略

## 並列サービス起動
docker compose up -d --parallel

## 選択的なサービス管理
docker compose up frontend backend

まとめ

Docker Compose を習得することで、開発者はアプリケーションのデプロイを効率化し、コンテナの設定を簡素化し、スケーラブルで再現可能な環境を作成できます。このチュートリアルは、基本的なサービス定義から高度なネットワークとボリューム管理までの重要な技術を網羅しており、コンテナ化されたアプリケーション開発とオーケストレーションのための堅固な基盤を提供します。