Docker Compose

サービスを起動

docker-compose up

Remote

docker -H=remote-docker-engine:2375
docker -H=10.123.2.1:2375 run nginx

バージョン進化

Version 1

links を使用(しよう) してコンテナを接続(せつぞく)

redis:
    image: redis
db:
    image: postgres:9.4
vote:
    image: voting-app
    ports:
        - 5000:80
    links:
        - redis
result:
    image: result-app
    ports:
        - 5001:80
    links:
        - db
worker:
    image: worker
    links:
        - redis
        - db

Version 2

services とネットワークの概念(がいねん)導入(どうにゅう)

version: 2
services:
    redis:
        image: redis
        networks:
            - back-end
    db:
        image: postgres:9.4
        networks:
            - back-end
    vote:
        image: voting-app
        ports:
            - 5000:80
        depends_on:
            - redis
        networks:
            - front-end
            - back-end
    result:
        image: result
        networks:
            - front-end
            - back-end

networks:
    front-end:
    back-end:

Version 3

設定(せってい) 構造(こうぞう)簡素化(かんそか)

version: 3
services:
    redis:
        image: redis
    db:
        image: postgres:9.4
    vote:
        image: voting-app
        ports:
            - 5000:80

Deploy

従来(じゅうらい) のデプロイ方法(ほうほう)

docker run user/simple-webapp
docker run mongodb
docker run redis:alpine
docker run ansible

Docker Compose デプロイ方法(ほうほう)

services:
    web:
        image: "user/simple-webapp"
    database:
        image: "mongodb"
    messaging:
        image: "redis:alpine"
    orchestration:
        image: "ansible"

Old Way Container Connect

docker run -d --name=redis user/simple-webapp
docker run -d --name=db postgres
docker run -d --name=vote -p 5000:80 --link redis:redis voting-app
docker run -d --name=result -p 5001:80 --link db:db result-app
docker run -d --name=worker --link redis:redis --link db:db --link redis:redis worker

Compose

redis:
    image: redis
db:
    image: postgres:9.4
vote:
    build: ./vote
    ports:
        - 5000:80
    links:
        - redis
result:
    build: ./result
    ports:
        - 5001:80
    links:
        - db
worker:
    build: ./worker
    links:
        - redis
        - db
Docker Compose Overview

Commands

起動と停止

# すべてのサービスを起動
docker-compose up -d

# 特定のサービスを起動
docker-compose up -d service_name

# すべてのサービスを停止
docker-compose down

# 特定のサービスを停止(他のサービスは実行継続)
docker-compose stop service_name

# 特定のサービスを起動
docker-compose start service_name

# 特定のサービスを再起動
docker-compose restart service_name

# サービスを一時停止/再開
docker-compose pause service_name
docker-compose unpause service_name

コンテナ管理

# 停止したコンテナを削除
docker-compose rm service_name

# コンテナを強制削除(実行中でも)
docker-compose rm -f service_name

# 特定のサービスを再ビルドして再起動
docker-compose up -d --build service_name

# コンテナを強制再作成(キャッシュなし)
docker-compose up -d --force-recreate service_name

# すべてのサービスを削除し、volumes をクリーンアップ
docker-compose down -v

# すべてのサービス、volumes、images を削除
docker-compose down -v --rmi all

Build & Image Management

# すべてのサービスをビルド
docker-compose build

# 特定のサービスをビルド
docker-compose build service_name

# 強制再ビルド(キャッシュなし)
docker-compose build --no-cache

# イメージをプル
docker-compose pull

# 特定のサービスのイメージをプル
docker-compose pull service_name

# イメージをプッシュ
docker-compose push service_name

Scaling & Resource Management

# サービスインスタンス数をスケール
docker-compose up -d --scale web=3 --scale worker=2

# サービス状態を表示
docker-compose ps

# 特定のサービス状態を表示
docker-compose ps service_name

# リソース使用状況を表示
docker-compose top

# コンテナ統計を表示
docker stats $(docker-compose ps -q)

Logs & Debugging

# すべてのサービスのログを表示
docker-compose logs

# 特定のサービスのログを表示
docker-compose logs service_name

# リアルタイムでログを追跡
docker-compose logs -f service_name

# 最新 100 行のログを表示
docker-compose logs --tail=100 service_name

# タイムスタンプ付きでログを表示
docker-compose logs -t service_name

Container Interaction

# 実行中のコンテナでコマンドを実行
docker-compose exec service_name bash

# ワンタイムコマンドを実行
docker-compose run service_name python manage.py migrate

# ワンタイムコマンドを実行(依存サービスを作成しない)
docker-compose run --no-deps service_name npm test

# バックグラウンドでワンタイムコマンドを実行
docker-compose run -d service_name python worker.py

Configuration & Validation

# 設定ファイルの構文を検証
docker-compose config

# 最終設定を表示(変数置換後)
docker-compose config --services

# すべてのサービス名を一覧表示
docker-compose config --services

# 異なる compose ファイルを使用
docker-compose -f docker-compose.yml -f docker-compose.prod.yml config

# 環境変数ファイルを設定
docker-compose --env-file .env.prod up -d

Environment Management

# 開発環境
docker-compose up -d

# 本番環境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

# テスト環境
docker-compose -f docker-compose.test.yml up -d --abort-on-container-exit

# 開発環境をクリーンアップ
docker-compose down -v --remove-orphans
docker system prune -f

Health Check & Monitoring

# 不健康なサービスを確認
docker-compose ps --filter "health=unhealthy"

# サービスが健康になるまで待機して実行
docker-compose up -d
docker-compose exec service_name wait-for-it.sh db:5432 -- echo "DB is ready"

# コンテナ内部ネットワークを表示
docker-compose exec service_name ip addr show

# ポートの接続性を確認
docker-compose exec service_name telnet redis 6379

Demo

version: '3.8'

services:
  # Frontend - React + Vite Development Server
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile.dev
    ports:
      - "3000:3000"
    volumes:
      - ./frontend:/app
      - /app/node_modules
    environment:
      - VITE_API_URL=http://localhost:8080
      - VITE_PYTHON_API_URL=http://localhost:8001
      - VITE_NODE_API_URL=http://localhost:8002
      - VITE_TRACING_ENDPOINT=http://tempo:3200
    depends_on:
      - go-server
      - python-server
      - nodejs-server
    networks:
      - app-network
    restart: unless-stopped

  # Go Backend Server with OpenTelemetry
  go-server:
    build:
      context: ./go-server
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    environment:
      - GIN_MODE=debug
      - REDIS_URL=redis:6379
      - REDIS_PASSWORD=redis123
      - DB_HOST=postgres
      - DB_PORT=5432
      - DB_NAME=goapp
      - DB_USER=postgres
      - DB_PASSWORD=password123
      - OTEL_EXPORTER_OTLP_ENDPOINT=http://tempo:4317
    volumes:
      - ./go-server:/app
    depends_on:
      - redis
      - postgres
      - tempo
    networks:
      - app-network
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  # Redis Cache Server
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    command: >
      redis-server
      --appendonly yes
      --requirepass redis123
      --maxmemory 256mb
      --maxmemory-policy allkeys-lru
    volumes:
      - redis_data:/data
    networks:
      - app-network
    restart: always
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "redis123", "ping"]
      interval: 10s
      timeout: 5s
      retries: 3

  # PostgreSQL Database
  postgres:
    image: postgres:15-alpine
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=password123
      - POSTGRES_MULTIPLE_DATABASES=goapp,pythonapp,nodeapp
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app-network
    restart: always
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

# Named Volumes for Data Persistence
volumes:
  postgres_data:
    driver: local
  redis_data:
    driver: local

# Custom Networks
networks:
  app-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

LGTM Stack Microservices Architecture

Components Breakdown

Loki(ログ集約(しゅうやく) システム)

Grafana Labs が開発(かいはつ) した水平(すいへい) スケーラブルで(こう) 可用性(かようせい) のログ集約(しゅうやく) システムです。ログ内容(ないよう) ではなくラベルのみをインデックス() する設計(せっけい) 理念(りねん) により、従来(じゅうらい) の ELK Stack より軽量(けいりょう)(てい) コストです。

Grafana(可視化(かしか) ダッシュボード)

統一(とういつ) された可視化(かしか) プラットフォームとして、Loki、Tempo、Mimir に接続(せつぞく) し、ログ、トレース、メトリクスの統一(とういつ) ビューを提供(ていきょう) します。

Tempo(分散(ぶんさん) トレーシング)

分散(ぶんさん) トレースデータを専門(せんもん)処理(しょり) し、マイクロサービスアーキテクチャにおけるリクエストの完全(かんぜん) なパスを追跡(ついせき) できます。

Mimir(長期(ちょうき) メトリクスストレージ)

Grafana Labs が提供(ていきょう) する Prometheus の代替(だいたい) (あん) で、より(すぐ) れた水平(すいへい) スケーリング能力(のうりょく)長期(ちょうき) ストレージ機能(きのう)提供(ていきょう) します。

Practical Monitoring Workflows

シナリオ1:パフォーマンス問題(もんだい)調査(ちょうさ)

API 応答(おうとう) 時間(じかん)異常(いじょう) がある場合(ばあい)

  1. Grafana で応答(おうとう) 時間(じかん) メトリクスを確認(かくにん) (Mimir から)
  2. 異常(いじょう)時点(じてん) をクリックして関連(かんれん) する trace を表示(ひょうじ) (Tempo から)
  3. trace からボトルネックを特定(とくてい) し、関連(かんれん) サービスのログを確認(かくにん) (Loki から)
  4. PostgreSQL と Redis のデータソースを()() わせて、データベースとキャッシュのパフォーマンスを分析(ぶんせき)

シナリオ2:エラー(りつ) 監視(かんし)

複数(ふくすう) のデータソースに(もと) づいたアラートを設定(せってい) できます:

  • エラー(りつ) がしきい()() えた(とき) (Mimir のメトリクスから)
  • 特定(とくてい) のエラーキーワードがログに出現(しゅつげん) した(とき) (Loki から)
  • trace のエラー(りつ)異常(いじょう)(とき) (Tempo から)

Quick Start Commands

# 完全な LGTM Stack 環境を起動
docker-compose up -d

# コアアプリケーションサービスのみを起動(監視なし)
docker-compose up -d frontend go-server python-server nodejs-server nginx redis postgres

# 監視サービスのみを起動
docker-compose up -d loki tempo mimir grafana promtail otel-collector

# 監視サービスのヘルス状態を確認
docker-compose ps loki tempo mimir grafana

# OTEL Collector のログを表示(トレースデータのデバッグ用)
docker-compose logs -f otel-collector

# 特定の監視コンポーネントを再起動
docker-compose restart grafana

Access URLs

ServiceURLCredentials
Grafana Dashboardhttp://localhost:3001admin/admin123
Frontend Applicationhttp://localhost:3000-
Go Server APIhttp://localhost:8080-
Python Server APIhttp://localhost:8001-
Node.js Server APIhttp://localhost:8002-
RedisInsighthttp://localhost:5540-
pgAdminhttp://localhost:5050admin@example.com/admin123
Loki APIhttp://localhost:3100-
Tempo APIhttp://localhost:3200-
Mimir APIhttp://localhost:9009-