7.1 Prometheusを使ったモニタリングの設定
このステップでは、複数コンテナアプリケーションのモニタリングとログ設定について説明するよ。これにより、サービスの状態やパフォーマンスを確認できるし、問題の診断のためにログを収集して分析することもできるよ。
目的: サービスからメトリクスを収集して、それを可視化してアプリのパフォーマンスや状態をモニタリングすることだよ。
Prometheusのインストールと設定
この例では、PrometheusはDockerを使って起動されるよ。これにより、クロスプラットフォーム性が確保されて、Dockerをサポートするどんなオペレーティングシステムでも同じようにモニタリングが展開できるんだ。
1. Prometheusの設定用ディレクトリを作成する:
mkdir prometheus
cd prometheus
2. 設定ファイル prometheus.yml
を作成する:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'flask-app'
static_configs:
- targets: ['backend:5000']
- job_name: 'node-app'
static_configs:
- targets: ['frontend:3000']
3. PrometheusのためのDockerfileを作成する:
FROM prom/prometheus
COPY prometheus.yml /etc/prometheus/prometheus.yml
4. compose.yaml
にPrometheusを追加する:
version: '3'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
nginx:
build: ./nginx
ports:
- "80:80"
depends_on:
- frontend
- backend
networks:
- task-network
prometheus:
build: ./prometheus
ports:
- "9090:9090"
networks:
- task-network
networks:
task-network:
driver: bridge
volumes:
db-data:
7.2 Grafanaのインストールと設定
1. Grafana設定用ディレクトリ作成:
mkdir grafana
cd grafana
2. Grafana用Dockerfile作成:
FROM grafana/grafana
3. docker-compose.yml
にGrafana追加:
grafana:
image: grafana/grafana
ports:
- "3033:3000"
depends_on:
- prometheus
networks:
- task-network
4. GrafanaをPrometheusと連携する設定:
docker compose up
を使ってコンテナを起動します。- ブラウザで
http://localhost:3033
にアクセスします。 - デフォルトのクレデンシャル (admin/admin) を使ってログインします。
-
"Configuration"
->"Data Sources"
に移動し、新しいデータソースを追加します。 -
"Prometheus"
を選択し、URL http://prometheus:9090
を指定します。 - 設定を保存します。
Grafanaでダッシュボード作成
- 新しいダッシュボード作成:
-
"Create"
->"Dashboard"
に移動します。 "Add new panel"
をクリックします。-
"Query"
セクションでデータソースPrometheus
を選択します。 - メトリクスを取得するために
PromQL
クエリを入力します。例えば、CPU
使用率をモニタリングするには:
-
- パネル設定 (Panel):
- チャートタイプを選択します (例えば、"Graph")。
- パネルを設定します (例えば、名前、凡例、軸など)。
"Apply"
をクリックしてパネルを保存します。
- 追加のパネル作成:
- 他のメトリクス (メモリ、ネットワーク、ディスクなど) のために、これらの手順を繰り返します。
rate(container_cpu_usage_seconds_total[1m])
7.3 ELK Stackの設定
ELK Stack (Elasticsearch, Logstash, Kibana)
を使ったログの設定。
目的: サービスからのログを収集、保存、分析すること。
Elasticsearch
のインストールと設定
compose.yaml
にElasticsearch
を追加:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
environment:
- discovery.type=single-node
ports:
- "9200:9200"
networks:
- task-network
Logstash
のインストールと設定
ステップ 1. Logstash用のディレクトリを作成:
mkdir logstash
cd logstash
ステップ 2. logstash.conf
設定ファイルを作成:
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "docker-logs-%{+YYYY.MM.dd}"
}
}
ステップ 3. Logstash
用のDockerfileを作成:
FROM docker.elastic.co/logstash/logstash:8.15.0
COPY logstash.conf /usr/share/logstash/pipeline/logstash.conf
ステップ 4. compose.yaml
にLogstashを追加:
logstash:
build: ./logstash
ports:
- "5044:5044"
depends_on:
- elasticsearch
networks:
- task-network
Kibanaのインストールと設定
compose.yaml
にKibanaを追加:
kibana:
image: docker.elastic.co/kibana/kibana:8.15.0
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- task-network
ログ収集のためのFilebeatのインストール
ステップ 1. Filebeat用のディレクトリを作成:
mkdir filebeat
cd filebeat
ステップ 2. filebeat.yml
設定ファイルを作成:
filebeat.inputs:
- type: docker
containers.ids:
- '*'
processors:
- add_docker_metadata: ~
output.logstash:
hosts: ["logstash:5044"]
ステップ 3. Filebeat用のDockerfileを作成:
FROM docker.elastic.co/beats/filebeat:8.15.0
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
ステップ 4. compose.yaml
にFilebeatを追加:
filebeat:
build: ./filebeat
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
depends_on:
- logstash
networks:
- task-network
7.4 完全なファイル
完全なファイル compose.yaml
version: '3'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
nginx:
build: ./nginx
ports:
- "80:80"
depends_on:
- frontend
- backend
networks:
- task-network
prometheus:
build: ./prometheus
ports:
- "9090:9090"
networks:
- task-network
grafana:
image: grafana/grafana
ports:
- "3033:3000"
depends_on:
- prometheus
networks:
- task-network
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
environment:
- discovery.type=single-node
ports:
- "9200:9200"
networks:
- task-network
logstash:
build: ./logstash
ports:
- "5044:5044"
depends_on:
- elasticsearch
networks:
- task-network
kibana:
image: docker.elastic.co/kibana/kibana:7.9.2
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- task-network
filebeat:
build: ./filebeat
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
depends_on:
- logstash
networks:
- task-network
networks:
task-network:
driver: bridge
volumes:
db-data:
GO TO FULL VERSION