Docker Compose
サービスを起動
docker-compose upRemote
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
- dbVersion 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:80Deploy
従来 のデプロイ方法 :
docker run user/simple-webapp
docker run mongodb
docker run redis:alpine
docker run ansibleDocker 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 workerCompose
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
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 allBuild & 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_nameScaling & 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_nameContainer 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.pyConfiguration & 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 -dEnvironment 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 -fHealth 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 6379Demo
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/16LGTM Stack Microservices Architecture
Components Breakdown
Loki(ログ集約 システム)
Grafana Labs が開発 した水平 スケーラブルで高 可用性 のログ集約 システムです。ログ内容 ではなくラベルのみをインデックス化 する設計 理念 により、従来 の ELK Stack より軽量 で低 コストです。
Grafana(可視化 ダッシュボード)
統一 された可視化 プラットフォームとして、Loki、Tempo、Mimir に接続 し、ログ、トレース、メトリクスの統一 ビューを提供 します。
Tempo(分散 トレーシング)
分散 トレースデータを専門 に処理 し、マイクロサービスアーキテクチャにおけるリクエストの完全 なパスを追跡 できます。
Mimir(長期 メトリクスストレージ)
Grafana Labs が提供 する Prometheus の代替 案 で、より優 れた水平 スケーリング能力 と長期 ストレージ機能 を提供 します。
Practical Monitoring Workflows
シナリオ1:パフォーマンス問題 の調査
API 応答 時間 に異常 がある場合 :
- Grafana で応答 時間 メトリクスを確認 (Mimir から)
- 異常 な時点 をクリックして関連 する trace を表示 (Tempo から)
- trace からボトルネックを特定 し、関連 サービスのログを確認 (Loki から)
- 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 grafanaAccess URLs
| Service | URL | Credentials |
|---|---|---|
| Grafana Dashboard | http://localhost:3001 | admin/admin123 |
| Frontend Application | http://localhost:3000 | - |
| Go Server API | http://localhost:8080 | - |
| Python Server API | http://localhost:8001 | - |
| Node.js Server API | http://localhost:8002 | - |
| RedisInsight | http://localhost:5540 | - |
| pgAdmin | http://localhost:5050 | admin@example.com/admin123 |
| Loki API | http://localhost:3100 | - |
| Tempo API | http://localhost:3200 | - |
| Mimir API | http://localhost:9009 | - |