Docker環境でのNew Relic Infrastructure Agent導入

はじめに

コンテナ化された環境でのインフラ監視は、従来の物理・仮想サーバー監視とは異なる考慮事項があります。New Relic Infrastructure Agentは、Dockerコンテナとして提供されており、ホストOSとコンテナの両方を効率的に監視できます。

本記事では、Docker Composeを使用した導入から、マルチコンテナ環境での監視設定まで、実践的な導入手順を詳しく解説します。また、コンテナ特有の監視課題とその解決方法についても併せて説明します。

コンテナ監視の基本概念

Infrastructure Agentコンテナの特徴

New Relic Infrastructure Agentコンテナは、ホストOSのシステム情報を収集するため、特権モードでの実行とホストファイルシステムへのアクセスが必要です。これにより、ホストOSのメトリクスとコンテナ固有のメトリクスの両方を統合的に監視できます。

監視対象の範囲

Dockerコンテナとして動作するInfrastructure Agentは、以下の情報を収集します。

ホストレベル情報

  • CPU、メモリ、ディスク、ネットワークの使用状況
  • ホストOSのプロセス情報
  • ファイルシステムの状態

コンテナレベル情報

  • 各コンテナのリソース消費量
  • コンテナのライフサイクル状態
  • Docker daemonのメトリクス

Docker Composeを使用した導入

基本的なDocker Compose設定

シンプルなDocker Compose設定でInfrastructure Agentを導入する例です。

yaml
# docker-compose.yml
version: '3.8'

services:
  newrelic-infra:
    image: newrelic/infrastructure:latest
    container_name: newrelic-infra
    restart: unless-stopped
    
    # 特権モードでの実行(ホストメトリクス収集に必要)
    privileged: true
    
    # ホストネットワークの使用
    network_mode: host
    
    # ホストPIDネームスペースの使用
    pid: host
    
    # ボリュームマウント設定
    volumes:
      - "/:/host:ro"
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "/proc:/host/proc:ro"
      - "/sys:/host/sys:ro"
      - "/etc:/host/etc:ro"
    
    # 環境変数設定
    environment:
      - NRIA_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY}
      - NRIA_DISPLAY_NAME=${HOSTNAME}
      - NRIA_VERBOSE=1
      
    # CPUとメモリの制限設定
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.1'
          memory: 128M

環境変数ファイルの設定

セキュリティを考慮して、ライセンスキーは環境変数ファイルで管理します。

bash
# .env ファイル
NEW_RELIC_LICENSE_KEY=your_license_key_here
HOSTNAME=docker-host-01

# カスタム属性(オプション)
NRIA_CUSTOM_ATTRIBUTES='{"environment":"production","team":"backend","location":"tokyo"}'

詳細設定でのDocker Compose

より詳細な監視設定を含むDocker Compose例です。

yaml
# docker-compose.advanced.yml
version: '3.8'

services:
  newrelic-infra:
    image: newrelic/infrastructure:latest
    container_name: newrelic-infra
    restart: unless-stopped
    privileged: true
    network_mode: host
    pid: host
    
    volumes:
      - "/:/host:ro"
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "/proc:/host/proc:ro"
      - "/sys:/host/sys:ro"
      - "/etc:/host/etc:ro"
      - "./newrelic-infra.yml:/etc/newrelic-infra.yml:ro"
    
    environment:
      - NRIA_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY}
      - NRIA_DISPLAY_NAME=${HOSTNAME}-docker
      - NRIA_VERBOSE=1
      - NRIA_CUSTOM_ATTRIBUTES=${NRIA_CUSTOM_ATTRIBUTES}
      
      # プロキシ設定(必要な場合)
      - NRIA_PROXY=${PROXY_URL}
      
      # ログ設定
      - NRIA_LOG_LEVEL=info
      
      # メトリクス収集間隔の調整
      - NRIA_METRICS_PROCESS_SAMPLE_RATE=20
      - NRIA_METRICS_STORAGE_SAMPLE_RATE=20
      - NRIA_METRICS_NETWORK_SAMPLE_RATE=10
    
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.1'
          memory: 128M
    
    # ヘルスチェック設定
    healthcheck:
      test: ["CMD", "pgrep", "-f", "newrelic-infra"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

設定ファイルを使用した詳細設定

外部設定ファイルの作成

コンテナ内で使用する設定ファイルを作成します。

yaml
# newrelic-infra.yml
license_key: ${NRIA_LICENSE_KEY}
display_name: ${NRIA_DISPLAY_NAME}
verbose: 1

# Docker固有設定
enable_docker: true
docker_api_version: "1.24"

# カスタム属性
custom_attributes:
  environment: production
  container_runtime: docker
  orchestrator: docker-compose

# ログ設定
log_level: info
log_format: json

# プロキシ設定(必要な場合)
# proxy: http://proxy.company.com:8080

# メトリクス収集設定
metrics_process_sample_rate: 20
metrics_storage_sample_rate: 20
metrics_network_sample_rate: 10

# Docker コンテナメトリクスの詳細設定
docker_container_filters:
  include:
    - "com.docker.compose.project=myapp"
  exclude:
    - "name=temp-*"

マルチコンテナアプリケーションでの統合監視

アプリケーションスタック全体の監視

Webアプリケーション、データベース、キャッシュサーバーを含む完全なスタックの監視例です。

yaml
# docker-compose.stack.yml
version: '3.8'

services:
  # New Relic Infrastructure Agent
  newrelic-infra:
    image: newrelic/infrastructure:latest
    container_name: newrelic-infra
    restart: unless-stopped
    privileged: true
    network_mode: host
    pid: host
    volumes:
      - "/:/host:ro"
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "/proc:/host/proc:ro"
      - "/sys:/host/sys:ro"
      - "/etc:/host/etc:ro"
    environment:
      - NRIA_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY}
      - NRIA_DISPLAY_NAME=production-stack
  
  # Webアプリケーション
  web-app:
    image: myapp:latest
    container_name: web-app
    ports:
      - "80:8080"
    environment:
      - NEW_RELIC_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY}
      - NEW_RELIC_APP_NAME=MyApp-Production
    labels:
      - "newrelic.monitor=true"
      - "newrelic.service=web"
    depends_on:
      - database
      - redis
  
  # データベース
  database:
    image: postgres:13
    container_name: postgres-db
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=myapp
      - POSTGRES_PASSWORD=password
    labels:
      - "newrelic.monitor=true"
      - "newrelic.service=database"
    volumes:
      - postgres_data:/var/lib/postgresql/data
  
  # キャッシュサーバー
  redis:
    image: redis:6-alpine
    container_name: redis-cache
    labels:
      - "newrelic.monitor=true"
      - "newrelic.service=cache"
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

Docker Swarmでの導入

Swarmサービスとしての展開

Docker Swarmクラスターでの展開例です。

yaml
# docker-compose.swarm.yml
version: '3.8'

services:
  newrelic-infra:
    image: newrelic/infrastructure:latest
    privileged: true
    networks:
      - host
    volumes:
      - "/:/host:ro"
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "/proc:/host/proc:ro"
      - "/sys:/host/sys:ro"
      - "/etc:/host/etc:ro"
    environment:
      - NRIA_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY}
      - NRIA_DISPLAY_NAME={{.Node.Hostname}}
    deploy:
      mode: global  # 全ノードにデプロイ
      placement:
        constraints:
          - node.role == manager
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.1'
          memory: 128M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

networks:
  host:
    external: true
    name: host

運用と監視

コンテナログの管理

Infrastructure Agentコンテナのログを効率的に管理する設定です。

yaml
# ログローテーション設定を含むCompose
services:
  newrelic-infra:
    image: newrelic/infrastructure:latest
    # ... 他の設定 ...
    
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
        labels: "service=newrelic-infra"

ヘルスチェックと監視

コンテナの健全性を監視するためのスクリプトです。

bash
#!/bin/bash
# check-newrelic-health.sh

# コンテナの状態確認
CONTAINER_STATUS=$(docker inspect --format='{{.State.Status}}' newrelic-infra 2>/dev/null)

if [ "$CONTAINER_STATUS" = "running" ]; then
    echo "✅ New Relic Infrastructure Agent is running"
    
    # メモリ使用量の確認
    MEMORY_USAGE=$(docker stats --no-stream --format "{{.MemUsage}}" newrelic-infra)
    echo "📊 Memory Usage: $MEMORY_USAGE"
    
    # CPU使用率の確認
    CPU_USAGE=$(docker stats --no-stream --format "{{.CPUPerc}}" newrelic-infra)
    echo "⚡ CPU Usage: $CPU_USAGE"
    
else
    echo "❌ New Relic Infrastructure Agent is not running"
    echo "Attempting to restart..."
    docker-compose restart newrelic-infra
fi

トラブルシューティング

一般的な問題と解決方法

コンテナが起動しない場合

bash
# ログの確認
docker logs newrelic-infra

# 設定ファイルの構文チェック
docker run --rm -v $(pwd)/newrelic-infra.yml:/etc/newrelic-infra.yml newrelic/infrastructure:latest -dry-run

# 権限の確認
docker run --rm --privileged -v /:/host:ro newrelic/infrastructure:latest ls -la /host

メトリクスが表示されない場合

bash
# ネットワーク接続の確認
docker run --rm --network=host curlimages/curl:latest curl -I https://infra-api.newrelic.com

# Docker daemonへのアクセス確認
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock newrelic/infrastructure:latest ls -la /var/run/docker.sock

パフォーマンス最適化

リソース使用量を最適化するための設定です。

yaml
# リソース効率化設定
services:
  newrelic-infra:
    image: newrelic/infrastructure:latest
    # ... 基本設定 ...
    
    environment:
      # 収集間隔の調整(リソース使用量を削減)
      - NRIA_METRICS_PROCESS_SAMPLE_RATE=60
      - NRIA_METRICS_STORAGE_SAMPLE_RATE=60
      - NRIA_METRICS_NETWORK_SAMPLE_RATE=30
      
      # 不要な機能の無効化
      - NRIA_ENABLE_WIN_SERVICES=false
      - NRIA_ENABLE_WIN_FIREWALL=false
    
    deploy:
      resources:
        limits:
          cpus: '0.3'
          memory: 256M
        reservations:
          cpus: '0.05'
          memory: 64M

セキュリティ考慮事項

コンテナセキュリティ

yaml
# セキュリティ強化設定
services:
  newrelic-infra:
    image: newrelic/infrastructure:latest
    # ... 基本設定 ...
    
    # 読み取り専用ルートファイルシステム
    read_only: true
    
    # 一時ディレクトリの設定
    tmpfs:
      - /tmp
      - /var/tmp
    
    # セキュリティオプション
    security_opt:
      - no-new-privileges:true
    
    # ユーザー設定(可能な場合)
    user: "65534:65534"  # nobody:nobody

シークレット管理

Docker Secretsを使用したライセンスキー管理です。

yaml
# Docker Secrets使用例
version: '3.8'

services:
  newrelic-infra:
    image: newrelic/infrastructure:latest
    secrets:
      - newrelic_license_key
    environment:
      - NRIA_LICENSE_KEY_FILE=/run/secrets/newrelic_license_key

secrets:
  newrelic_license_key:
    external: true

まとめ

Docker環境でのNew Relic Infrastructure Agent導入は、適切な権限設定とボリュームマウントにより効率的に実行できます。コンテナ特有の監視要件を理解し、マルチコンテナ環境での統合監視を実現することで、現代的なアプリケーションインフラの可視性を大幅に向上できます。

セキュリティとパフォーマンスのバランスを考慮した設定により、本番環境での安定運用が可能になるでしょう。次回は、Kubernetes環境での導入方法について詳しく解説します。


関連記事: Kubernetes環境での導入関連記事: 設定ファイル完全リファレンス