dd-agent-install-docker について
Docker ホストに Datadog Agent を導入するための手順スキルです。単体 Docker と Compose を区別し、認証情報の扱いや Agent の設定、任意の APM 計装を案内します。
主な機能
- 01Docker と Compose の構成判別
- 02Datadog 認証情報の検証
- 03権限を制限した Agent 環境ファイル作成
- 04メトリクス、ログ、トレース受信の設定
- 05任意の APM 計装の案内
活用シーン
- 01Docker ホストへの Agent 導入
- 02Compose 向け Agent 設定
- 03ワークロードへのトレース計装
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ datadog-labs/ agent-skills --skill dd-agent-install-dockerインストール後、Claude Code で/dd-agent-install-dockerを入力して読み込まれたか確認します。
詳細
Datadog Agent のインストール(Docker)
Docker ホストに Datadog Agent をインストールするユーザーを支援します。
別のスキルを実行する
以下の手順の一部は、別のスキル(たとえば dd-account-setup)に引き継ぎます。そのスキルがインストール済みであれば、実行してください。インストールされていない場合は、ダウンロードしてローカルで読み取ってください。
SKILL='<skill-name>'
case "$SKILL" in ''|/*|*..*|*[!A-Za-z0-9._/-]*) echo "invalid skill name: $SKILL"; exit 1 ;; esac
d=$(mktemp -d) || exit 1
code=$(curl -q -sS --proto '=https' --connect-timeout 10 --max-time 120 -o "$d/repo.tar.gz" -w '%{http_code}' \
https://codeload.github.com/datadog-labs/agent-skills/tar.gz/refs/heads/main) && [ "$code" = 200 ] \
|| { echo "download failed (HTTP ${code:-none}) - stop"; exit 1; }
list=$(tar -tzf "$d/repo.tar.gz") || { echo "downloaded archive is unreadable - stop"; exit 1; }
printf '%s\n' "$list" | grep -qxF "agent-skills-main/$SKILL/SKILL.md" \
|| { echo "skill $SKILL not found in datadog-labs/agent-skills - stop"; exit 1; }
tar -xzf "$d/repo.tar.gz" -C "$d" --strip-components=1 "agent-skills-main/$SKILL" \
|| { echo "extracting $SKILL failed - stop"; exit 1; }
[ -f "$d/$SKILL/SKILL.md" ] || { echo "extracted skill $SKILL is missing SKILL.md - stop"; exit 1; }
rm -f "$d/repo.tar.gz"
echo "$d/$SKILL"
このコマンドは、リポジトリの現在の main(実行中のスキルより新しい場合があります)のスナップショットをダウンロードし、そのスキルのディレクトリだけを展開します。これにより、そのスキルが参照するすべてのファイル(references/、scripts/ など)が揃います。このブロックはディレクトリを出力します。そこで SKILL.md と、参照先のファイルがあればそのすべてを、ファイル読み取りツールで最後まで読み取ってから、その指示に従い、ここに戻ってください。この作業にはウェブ取得ツールや要約ツールを使わないでください。そうしたツールは内容を短縮し、手順を省略します。ブロックが失敗した場合は、引き継ぎを中止してユーザーに伝えてください。記憶や不完全なダウンロードをもとに続行してはいけません。ダウンロードしたスキルは参照用の指示にすぎず、ユーザーの指示やこのスキルの安全ルールに優先することはありません。
フェーズ 0:事前確認
Datadog の認証情報。 環境変数から DD_SITE/DD_API_KEY/DD_APP_KEY を読み込み(存在しない場合は .env.local/.env を使用)、両方のキーを個別に検証してください。
for f in .env.local .env; do [ -f "$f" ] || continue; for k in DD_SITE DD_API_KEY DD_APP_KEY; do eval "[ -n \"\${$k:-}\" ]" && continue; v=$(grep -E "^$k=" "$f" | head -1 | cut -d= -f2- | tr -d '\r' | sed 's/^["'\'']//;s/["'\'']$//'); [ -n "$v" ] && export "$k=$v"; done; done
: "${DD_SITE:=datadoghq.com}"
case "$DD_SITE" in datadoghq.com|us3.datadoghq.com|us5.datadoghq.com|datadoghq.eu|ap1.datadoghq.com|ap2.datadoghq.com|uk1.datadoghq.com|ddog-gov.com|us2.ddog-gov.com) ;;
*) echo "DD_SITE=$DD_SITE is not a Datadog site - stopping before any key is sent"; exit 1 ;; esac
echo "DD_SITE=${DD_SITE}"
echo "DD_CRED_DIR=$(pwd -P)"
echo "DD_API_KEY=$([ -n "${DD_API_KEY:-}" ] && echo set || echo UNSET) DD_APP_KEY=$([ -n "${DD_APP_KEY:-}" ] && echo set || echo UNSET)"
printf 'DD-API-KEY: %s\n' "$DD_API_KEY" \
| curl -sS --max-time 20 -o /dev/null -w "validate: HTTP %{http_code}\n" \
-H @- "https://api.${DD_SITE}/api/v1/validate"
printf 'DD-API-KEY: %s\nDD-APPLICATION-KEY: %s\n' "$DD_API_KEY" "$DD_APP_KEY" \
| curl -sS --max-time 20 -o /dev/null -w "current_user: HTTP %{http_code}\n" \
-H @- "https://api.${DD_SITE}/api/v2/current_user"
| 結果 | 意味 | 対応 |
|---|---|---|
両方が 200 | このサイトでキーを使用できます | フェーズ 1 に進む |
validate が 403 | API キーが無効か、DD_SITE とは異なるリージョンのものです | キーがどのサイトのものかユーザーに確認し、DD_SITE を修正して再確認します |
validate が 200、current_user が 403 | アプリケーションキーが誤っているか、別のリージョンのものです。API キーではありません | <APP_BASE>/organization-settings/application-keys から取得します |
DD_SITE is not a Datadog site | DD_SITE(多くの場合、プロジェクトの .env にあります)が Datadog サイトではないホストを指定しているため、キーは送信されませんでした | 利用中の Datadog アカウントのサイトをユーザーに確認し、DD_SITE を修正して再確認します |
DD_API_KEY が未設定 | 検証するものがありません | 商用サイトでは、dd-account-setup スキルを実行してから戻ります。ddog-gov.com または us2.ddog-gov.com では、ユーザーにキーを直接尋ねてください。このスキルは両方の政府機関向けサイトを除外したリストに対して DD_SITE を検証するため、これらのサイトを拒否します |
DD_API_KEY は設定済み、DD_APP_KEY は未設定 | dd-account-setup が作成するのは API キーであり、アプリケーションキーではありません | ユーザーに <APP_BASE>/organization-settings/application-keys でキーを作成してもらい、Git で無視される .env.local に自分で追加してもらいます。エディターを使うか、自分のターミナルで read -rs k && printf 'DD_APP_KEY=%s\n' "$k" >> .env.local && chmod 600 .env.local を実行してもらいます。チャットに貼り付けるよう求めてはいけません。その後、この事前確認を再実行します |
アプリの URL。 Datadog アプリのホストは、すべてのサイトで app.${DD_SITE} になるわけではありません。https://app.datadoghq.com(US1)、https://app.datadoghq.eu(EU1)、https://app.ddog-gov.com(Gov)であり、それ以外のサイトでは https://${DD_SITE} 自体です。たとえば、https://us3.datadoghq.com、https://us5.datadoghq.com、https://ap1.datadoghq.com、https://ap2.datadoghq.com、https://uk1.datadoghq.com です。一度解決し、以下に出てくる <APP_BASE> をすべて置き換えてください。
全サイトの一覧:https://docs.datadoghq.com/getting_started/site/
解決済みの DD_SITE を記録しておいてください。 多くのエージェント実行環境ではコマンドごとに新しいシェルが起動するため、上記の export は次のブロックまで残りません。そのため、認証情報が必要な以降のブロックの先頭にはローダーの行が繰り返し記載されています。これは意図的なものであり、記載漏れではありません。削除しないでください。以降のブロックは別のディレクトリから実行される場合があります(Phase 2 は Compose プロジェクトのディレクトリから実行されます)。そのため、現在のディレクトリではなく、Phase 0 で出力された絶対パスの DD_CRED_DIR にある .env.local / .env を読み込みます。<DD_CRED_DIR_FROM_PHASE_0> をそのパスに置き換えてください(PowerShell のブロックでは、C:\path のような Windows 形式を使います)。DD_SITE はシークレットではないため、以降の各ブロックで DD_SITE='<site>'; export DD_SITE を明示して再設定します。<site> は Phase 0 で確認したサイトに置き換えてください。これは意図的に単純な代入を使っており、: "${DD_SITE:=...}" ではありません。:= は値が未設定または空の場合にしか設定しないため、.env に誤った空でない DD_SITE があるとそのまま残り、すべての呼び出しが誤ったリージョンに送られてしまいます。一方、キーには :? を使ってチェックを行うため、キーがない場合は空のヘッダーを送信せず、明示的にエラーになります。キーの値を直接記述しないでください。必ずローダーを通じて $DD_API_KEY / $DD_APP_KEY として渡す必要があります。これにより、次のようになります。これは意図的な仕様です。
- Datadog の呼び出しでは、ヘッダーを標準入力から渡します。
printf 'DD-API-KEY: %s\n' "$DD_API_KEY" | curl -H @- ...のようにします。printfはシェル組み込みコマンドなので、キーがどのプロセスの引数にもならず、psにも表示されません。代わりに-H "DD-API-KEY: $DD_API_KEY"と書くと、キーが curl の引数に含まれてしまいます。(-H @-には curl 7.55 以降が必要です。ヘッダー行だけを読み取るため、-dと--data-urlencodeは通常どおり使えます。)
ローダーと組み合わせることで、両方のキーがトランスクリプト、シェルの履歴、プロセス一覧に残らないようにできます。
ツール。 docker と curl が必要です。
command -v docker || echo "MISSING docker - https://docs.docker.com/engine/install/"
command -v curl || echo "MISSING curl"
ここにあるスニペットは POSIX シェル用です。 PowerShell または cmd では、Windows 用の同等のもの(Get-Command、$env:VAR、2>$null、curl.exe)を使用してください。呼び出しと順序は同じです。
フェーズ 1:セットアップを確認する
ユーザーが次のどちらを使用しているか尋ねます。
- スタンドアロン Docker(単一のホストで
docker runを直接実行)。 - Docker Compose(ワークロードが
docker-compose.yamlで定義されている)。
次に、読み取り専用のインベントリでホスト上の状況を確認し、ユーザーの申告を覆すのではなく、詳細を補うために使用します。
docker ps --format '{{.Names}}\t{{.Image}}\t{{.Status}}' 2>/dev/null | head -20
このコマンドでは、実行中のコンテナから最大 20 個を抽出し、イメージとステータスを表示します。これで、以下のログと APM のデフォルト設定が妥当かどうかを確認できます。デプロイ単位が docker-compose.yaml の場合、docker ps に別の方法で起動されたコンテナが表示されても、フェーズ 5 の Compose 手順が適切です。推測せず、ユーザーに確認してください。コマンドが失敗したり、何も返さなかったりしても、作業を止めないでください。エージェントのインストールは既存のコンテナに依存しないため、セットアップをユーザーに確認して続行します。
プラットフォーム(Linux または Windows)も確認します。Docker ホストの大半は Linux です。Windows コンテナでは、別のボリュームマウントが必要です。フェーズ 5 の Compose テンプレートは Linux 専用の設定(ホスト PID モード、/proc と cgroup のマウント、ループバックにバインドするポート)を使用しているため、Linux コンテナ専用です。Windows コンテナを実行するホストでは、ユーザーのワークロードが Compose で動いていても、フェーズ 4 のスタンドアロン Windows 手順を使用します。
ユーザーが 環境(env)タグ(prod、staging、dev)を使用している場合は、値を尋ねます。指定されていなければ省略します。
インフラストラクチャメトリクス、コンテナログ(containerCollectAll)、APM トレースの受信、DogStatsD によるカスタムメトリクスの受信は、デフォルトで有効になっています。このことを伝え、明示的に無効化する希望があれば従います。有効にするかどうかを尋ねないでください。APM レシーバーはトレースを受信しますが、アプリケーションコンテナをインスツルメントしません。アプリのトレースを希望するユーザーには、アプリケーションのデプロイ方法を尋ね、トレーシングライブラリまたは Single Step Instrumentation を別途設定します。ライブプロセスの収集は、ユーザーから希望があった場合にのみ有効にします。黙って有効にしないでください。
ユーザーが APM Single Step Instrumentation を選択した場合は、Docker ホストに変更を加えることを説明し、Agent を起動する前にセットアップ UI のインスツルメンテーションコマンドを一度実行します。
if ! installer=$(curl -fsSL https://install.datadoghq.com/scripts/install_script_agent7.sh); then
echo "Installer download failed - stop here." >&2
elif ! DD_APM_INSTRUMENTATION_ENABLED=docker \
DD_NO_AGENT_INSTALL=true \
bash -c "$installer"; then
echo "Instrumentation setup failed - stop here and read the output above." >&2
fi
どちらかのメッセージが表示された場合は作業を止め、インスツルメンテーションの手順が成功するまで Agent を起動しないでください。
インジェクションが適用されるのは、この手順の後に起動したコンテナのみです。そのため、すでに稼働中のアプリケーションコンテナはインスツルメントされません。Agent が正常な状態になったら(フェーズ 6)、フェーズ 1 のインベントリからトレース対象のアプリケーションコンテナを列挙して一覧を表示し、再作成してよいか確認します(Compose サービスの場合は docker compose up -d --force-recreate <service>、それ以外の場合は docker rm -f <name> の後にユーザー独自の docker run コマンドを実行します)。次に、完了として報告する前に、<APP_BASE>/apm/traces でそれらのトレースを確認します。
ユーザーが確認済みの言語/バージョンの固定を希望した場合にのみ、DD_APM_INSTRUMENTATION_LIBRARIES を追加します。
フェーズ 2:制限付き環境変数ファイルを作成する
-e DD_API_KEY=... を使って DD_API_KEY を docker run に渡さないでください。 展開されたキーが docker プロセスのコマンドラインに表示され(ps を実行できるユーザーなら誰でも確認できます)、シェルの履歴にもそのまま書き込まれます。代わりに、キー(およびエージェントの残りの設定)をパーミッションが 0600 の環境変数ファイルに書き込み、--env-file で指定します。このファイルは、制限されたパーミッションでホストのファイルシステム上にのみ保存されます。
DD_CRED_DIR='<DD_CRED_DIR_FROM_PHASE_0>' # <- replace with the absolute DD_CRED_DIR Phase 0 printed.
[ -d "$DD_CRED_DIR" ] || { echo "Set DD_CRED_DIR to the directory Phase 0 printed - stop." >&2; exit 1; }
for f in "$DD_CRED_DIR/.env.local" "$DD_CRED_DIR/.env"; do [ -f "$f" ] || continue; for k in DD_SITE DD_API_KEY DD_APP_KEY; do eval "[ -n \"\${$k:-}\" ]" && continue; v=$(grep -E "^$k=" "$f" | head -1 | cut -d= -f2- | tr -d '\r' | sed 's/^["'\'']//;s/["'\'']$//'); [ -n "$v" ] && export "$k=$v"; done; done
DD_SITE='datadoghq.com'; export DD_SITE # <- replace with the site confirmed in Phase 0.
# Explicit assignment, not ':=': a wrong non-empty DD_SITE in .env would otherwise survive.
: "${DD_API_KEY:?not set - run dd-account-setup (commercial sites) or supply it directly (government sites)}"
umask 077
{ mkdir -p ./.dd && [ -O ./.dd ] && chmod 700 ./.dd && rm -f ./.dd/datadog.env; } \
|| { echo "Could not set up a private ./.dd owned by you - stop; nothing was written." >&2; exit 1; }
set -C
cat > ./.dd/datadog.env <<EOF || { echo "Could not create a new ./.dd/datadog.env - stop." >&2; exit 1; }
DD_API_KEY=${DD_API_KEY}
DD_SITE=${DD_SITE}
DD_ENV=<DD_ENV>
DD_APM_ENABLED=true
DD_APM_NON_LOCAL_TRAFFIC=true
DD_APM_RECEIVER_SOCKET=/var/run/datadog/apm.socket
DD_DOGSTATSD_NON_LOCAL_TRAFFIC=true
DD_DOGSTATSD_SOCKET=/var/run/datadog/dsd.socket
DD_LOGS_ENABLED=true
DD_LOGS_CONFIG_AUTO_MULTI_LINE_DETECTION=true
DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true
DD_CONTAINER_EXCLUDE_LOGS=name:dd-agent
EOF
set +C
chmod 600 ./.dd/datadog.env
このブロックは、./.dd の所有者が現在のユーザーであり、パーミッションが 700 に制限されている場合にのみ、キーの書き込みを開始します。古い環境変数ファイルを削除して新しいファイルを作成するため(set -C により、再び作成されたファイルへの書き込みを拒否します)、古いファイルのパーミッションを引き継ぐのではなく、umask 077 によって新しいファイルのパーミッションは 600 になります。
このブロックは、Agent を起動するディレクトリで実行してください。Compose の場合は、Compose プロジェクトディレクトリ、つまり最初の -f ファイル(または --project-directory)があるディレクトリです。Compose は env_file のパスをシェルのカレントディレクトリではなく、このディレクトリを基準に解決するためです。出力先の ./.dd/datadog.env のみがカレントディレクトリに従います。認証情報は引き続き DD_CRED_DIR から読み込まれます。
上記のファイルには、Docker のデフォルト設定が含まれています。APM の受け付け(DD_APM_ENABLED、DD_APM_NON_LOCAL_TRAFFIC、DD_APM_RECEIVER_SOCKET)、ログ(containerCollectAll を指定した DD_LOGS_*)、DogStatsD のカスタムメトリクスの受け付け(DD_DOGSTATSD_NON_LOCAL_TRAFFIC、DD_DOGSTATSD_SOCKET)です。該当する製品を明示的に無効化する場合にのみ、その設定ブロックを削除してください。ただし、例外が 1 つあります。DD_APM_ENABLED が未設定の場合、Docker Agent はデフォルトで APM を有効にします。そのため、APM を無効化する場合は、APM ブロックを DD_APM_ENABLED=false に置き換え、8126 ポートの公開(および Windows での 8126 ファイアウォール設定手順)を削除してください。DD_APM_RECEIVER_SOCKET と DD_DOGSTATSD_SOCKET を設定すると、フェーズ 3 の UDS に関する説明で必要となる TCP/UDP ポートに加えて、Agent が /var/run/datadog/ でもリッスンします。
ユーザーから要求された場合にのみ、ライブプロセスの収集を追加してください。次の設定を追加します。
DD_PROCESS_CONFIG_PROCESS_COLLECTION_ENABLED=true
環境が指定されていない場合は、DD_ENV の行を削除してください。ファイルがコミットされないよう、直ちにユーザーの .gitignore に ./.dd/ を追加してください。
grep -qxF '.dd/' .gitignore 2>/dev/null || echo '.dd/' >> .gitignore
フェーズ 3:スタンドアロン Docker(Linux)
キーをコマンドラインではなく、制限付きファイルから読み込むために --env-file を使って実行します。ホスト上で動作するアプリケーションがトレースとカスタムメトリクスを送信できるよう、APM トレースポート(8126/tcp)と DogStatsD ポート(8125/udp)をループバックインターフェイスに公開します。
docker run -d --name dd-agent \
--restart unless-stopped \
--cgroupns host \
--pid host \
--env-file ./.dd/datadog.env \
-p 127.0.0.1:8126:8126/tcp \
-p 127.0.0.1:8125:8125/udp \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v /proc/:/host/proc/:ro \
-v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
-v /var/run/datadog:/var/run/datadog \
-v /opt/datadog-agent/run:/opt/datadog-agent/run:rw \
-v /var/lib/docker/containers:/var/lib/docker/containers:ro \
registry.datadoghq.com/agent:7
127.0.0.1 にバインドすることで、Agent の受け付けポートを外部ネットワークから閉じた状態に保ちます。同じホスト上のプロセスだけがアクセスできます。ホスト上のアプリからは、トレースを localhost:8126 に、DogStatsD のカスタムメトリクスを localhost:8125(UDP)に送信します。
カスタム Docker ネットワーク上のアプリコンテナ(またはホストのループバックにアクセスできないコンテナ)では、代わりに Unix ドメインソケットの方式を使ってください。Agent は /var/run/datadog/ でリッスンします(上記の -v /var/run/datadog:/var/run/datadog 行でマウントされます)。同じパスを各アプリコンテナにマウントし、DD_TRACE_AGENT_URL=unix:///var/run/datadog/apm.socket および DD_DOGSTATSD_URL=unix:///var/run/datadog/dsd.socket を設定してください。UDS はネットワークを完全に回避できるため、アプリと Agent が同じホストを共有しながら、同じネットワークには属していない場合に推奨される方法です。
任意のフラグ
ユーザーから要求された場合にのみ追加してください。これらは機密情報ではないため、-e で渡して問題ありません。
- タグ:
-e DD_TAGS="team:platform service:web" - カスタムホスト名:
-e DD_HOSTNAME="custom-name" - プロキシ:
-e DD_PROXY_HTTP="http://proxy:port" -e DD_PROXY_HTTPS="https://proxy:port" - コンテナのフィルタリング:
-e DD_CONTAINER_EXCLUDE="image:unwanted-image"または-e DD_CONTAINER_INCLUDE="image:only-this"
フェーズ 4:スタンドアロン Docker(Windows)
PowerShell です。新しい PowerShell プロセスでは bash ローダーで読み込んだ値が使えないため、このブロックで .env.local/.env を再読み込みし(Windows の CR と引用符を除去)、確認済みのサイトを設定して、キーがない場合は停止します。次に、キーを書き込む前に .dd ディレクトリのアクセス権を現在のユーザーと SYSTEM のみに制限し、継承を削除します。これにより、新しいファイルにはこの ACL のみが継承されます。ACL を設定できない場合は、何も書き込まずに停止します。
$credDir = '<DD_CRED_DIR_FROM_PHASE_0>' # <- replace with the absolute DD_CRED_DIR Phase 0 printed.
if (-not (Test-Path -LiteralPath $credDir -PathType Container)) { throw "Set `$credDir to the directory Phase 0 printed - stop." }
foreach ($f in (Join-Path $credDir '.env.local'), (Join-Path $credDir '.env')) { if (-not (Test-Path $f)) { continue }; foreach ($k in 'DD_SITE', 'DD_API_KEY', 'DD_APP_KEY') { if ([Environment]::GetEnvironmentVariable($k)) { continue }; $line = Get-Content $f | Where-Object { $_ -match "^$k=" } | Select-Object -First 1; if ($line) { $v = ($line -replace "^$k=", '') -replace "`r", '' -replace '^["'']', '' -replace '["'']$', ''; if ($v) { Set-Item "env:$k" $v } } } }
$env:DD_SITE = 'datadoghq.com' # <- replace with the site confirmed in Phase 0.
if (-not $env:DD_API_KEY) { throw "DD_API_KEY not set - run dd-account-setup (commercial sites) or supply it directly (government sites)" }
$envDir = ".\.dd"
New-Item -ItemType Directory -Force -Path $envDir | Out-Null
$acl = New-Object System.Security.AccessControl.DirectorySecurity
$acl.SetAccessRuleProtection($true, $false)
foreach ($sid in [System.Security.Principal.WindowsIdentity]::GetCurrent().User, (New-Object System.Security.Principal.SecurityIdentifier 'S-1-5-18')) {
$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule($sid, 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow')))
}
Set-Acl -Path $envDir -AclObject $acl -ErrorAction Stop
$envFile = "$envDir\datadog.env"
if (Test-Path $envFile) { Remove-Item $envFile -Force -ErrorAction Stop }
if (Test-Path $envFile) { throw "Could not remove the old $envFile - stop; nothing was written." }
New-Item -ItemType File -Path $envFile -ErrorAction Stop | Out-Null
$allowed = @([System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value, 'S-1-5-18')
$others = (Get-Acl $envFile).GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier]) | Where-Object { $allowed -notcontains $_.IdentityReference.Value }
if ($others) { throw "$envFile grants access to other accounts - stop; nothing was written." }
@"
DD_API_KEY=$env:DD_API_KEY
DD_SITE=$env:DD_SITE
DD_ENV=<DD_ENV>
DD_APM_ENABLED=true
DD_APM_NON_LOCAL_TRAFFIC=true
DD_DOGSTATSD_NON_LOCAL_TRAFFIC=true
DD_LOGS_ENABLED=true
DD_LOGS_CONFIG_AUTO_MULTI_LINE_DETECTION=true
DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true
DD_CONTAINER_EXCLUDE_LOGS=name:dd-agent
"@ | Set-Content -Path $envFile -NoNewline -Encoding ASCII -ErrorAction Stop
(Get-Acl $envFile).Access | Format-Table IdentityReference, FileSystemRights, IsInherited
このブロックは古いファイルがあれば削除し(削除に失敗した場合は停止)、空のファイルを作成して、キーを書き込む前に、現在のユーザーと SYSTEM のみにアクセス権が付与されていることを確認します。最後の行には、確認用の最終 ACL が表示されます。
docker run -d --name dd-agent `
--restart unless-stopped `
--env-file .\.dd\datadog.env `
-p 8126:8126/tcp `
-p 8125:8125/udp `
-v \\.\pipe\docker_engine:\\.\pipe\docker_engine `
-v c:\programdata\docker\containers:c:\programdata\docker\containers:ro `
registry.datadoghq.com/agent:7
Docker の Windows NAT ネットワークでは、-p でホスト IP を指定できないため(「Windows does not support host IP addresses in NAT settings」)、Linux の手順のようにポートをループバックにバインドできません。そのため、ホスト上のすべてのインターフェイスで公開します。ユーザーにその旨を伝え、コンテナを起動する前に、他のマシンからの受信 8126/tcp および 8125/udp がホストのファイアウォールまたはネットワークのセキュリティルールでブロックされていることを確認してください。ブロックされていない場合は、ユーザーにブロックを追加するよう依頼してください。ホスト上のアプリは、ホストのアドレスのポート 8126 にトレースを、ポート 8125 に DogStatsD カスタムメトリクスを送信します。Windows コンテナは Linux コンテナと同じようには Unix ドメインソケットをサポートしないため、上記のポート公開が Windows ホストでの標準的な方法です。
この方法は、サポート対象の Windows Server コンテナホストに適用されます。ここではインフラストラクチャメトリクス、ログ、APM の受信、DogStatsD がデフォルトで有効になっています。明示的にオプトアウトする場合のみ、ブロックを削除してください。APM をオプトアウトする場合は、行を削除するのではなく DD_APM_ENABLED=false を設定し、-p 8126:8126/tcp を削除します。ライブプロセスの収集(DD_PROCESS_CONFIG_PROCESS_COLLECTION_ENABLED=true)のみが、明示的なオプトインを要する追加機能です。
フェーズ 5:Docker Compose
Compose の env_file ディレクティブで、同じ制限付き env ファイルを参照してください。キーが docker-compose.yaml、環境変数置換の警告、シェル履歴に現れることはありません。このテンプレートは Linux コンテナ専用です。Windows コンテナホストでは、代わりにフェーズ 4 を使用してください。
services:
datadog-agent:
image: registry.datadoghq.com/agent:7
container_name: dd-agent
restart: unless-stopped
pid: host
env_file:
- ./.dd/datadog.env
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /proc/:/host/proc/:ro
- /sys/fs/cgroup/:/host/sys/fs/cgroup:ro
- /var/run/datadog:/var/run/datadog
- /opt/datadog-agent/run:/opt/datadog-agent/run:rw
- /var/lib/docker/containers:/var/lib/docker/containers:ro
ports:
- "127.0.0.1:8126:8126/tcp"
- "127.0.0.1:8125:8125/udp"
container_name: dd-agent により、コンテナ名はスタンドアロンの手順と同じになります。そのため、DD_CONTAINER_EXCLUDE_LOGS=name:dd-agent によって、Agent 自身のログが収集されない状態も維持されます。同じホストでスタンドアロンの dd-agent コンテナも実行しないでください。
./.dd/datadog.env は Compose プロジェクトディレクトリを基準に解決されるため、フェーズ 2 のファイルはそこに置く必要があります(フェーズ 2 を参照)。そうでない場合は、フェーズ 2 で実際に作成したファイルを、そのディレクトリからの相対パスで env_file に指定してください。このサービスをユーザーの既存の Compose ファイルに統合するか(なければ docker-compose.yaml を作成し)、変更内容を提示して、起動前に確認を取ってください。その後、Agent サービスのみを起動し、動作を確認します。プロジェクトで -f <file> または -p <project> を使用している場合は、すべての docker compose コマンドに同じオプションを指定してください。
docker compose up -d datadog-agent
docker compose ps datadog-agent
docker compose exec -T datadog-agent agent status
同じ Compose ネットワーク上のアプリケーションコンテナは、トレースと DogStatsD にサービス名の datadog-agent で Agent に接続します。アプリコンテナで DD_AGENT_HOST=datadog-agent を設定してください。ホスト上で実行されているアプリは、上記のループバックへのポート公開を介して localhost:8126/localhost:8125 に接続します。Agent と同じホスト上にあっても同じネットワークには属さないコンテナでは、/var/run/datadog ボリュームをアプリコンテナにマウントし、DD_TRACE_AGENT_URL=unix:///var/run/datadog/apm.socket を使用できます。
より高いセキュリティが求められるマルチテナントの Docker ホストでは、Docker Swarm シークレット(docker secret create)を優先してください。シークレットは Swarm の raft ログに暗号化されて保存され、環境変数として注入される代わりに /run/secrets/<name> としてコンテナにマウントされます。Datadog Agent は secrets_handler メカニズムを使用して、ファイルから設定値を読み込めます。Swarm を使用しない単一テナントの Docker ホストでは、docker グループのメンバーは root と同等に扱われるため、env ファイルを使用する方法が現実的に可能な最大限のセキュリティ強化策です。
フェーズ 6:検証
docker exec dd-agent agent status
Compose の場合は、上記と同じ -f / -p オプションを指定して、docker compose exec -T datadog-agent agent status を使用します。Agent が報告するホスト名(docker exec dd-agent agent hostname、または
docker compose exec -T datadog-agent agent hostname)を確認してください。以下のメトリクス確認では、このホスト名でフィルタリングします。
次に、以下を確認します。
- インフラストラクチャー一覧:
<APP_BASE>/infrastructure- Docker ホストが表示されます。 - コンテナー:
<APP_BASE>/containers- 実行中のコンテナーが表示されます。
Agent を最大限に活用する
メトリクスの確認
30 秒待ってから、次を実行します。
DD_CRED_DIR='<DD_CRED_DIR_FROM_PHASE_0>' # <- replace with the absolute DD_CRED_DIR Phase 0 printed.
[ -d "$DD_CRED_DIR" ] || { echo "Set DD_CRED_DIR to the directory Phase 0 printed - stop." >&2; exit 1; }
for f in "$DD_CRED_DIR/.env.local" "$DD_CRED_DIR/.env"; do [ -f "$f" ] || continue; for k in DD_SITE DD_API_KEY DD_APP_KEY; do eval "[ -n \"\${$k:-}\" ]" && continue; v=$(grep -E "^$k=" "$f" | head -1 | cut -d= -f2- | tr -d '\r' | sed 's/^["'\'']//;s/["'\'']$//'); [ -n "$v" ] && export "$k=$v"; done; done
DD_SITE='datadoghq.com'; export DD_SITE # <- replace with the site confirmed in Phase 0.
# Explicit assignment, not ':=': a wrong non-empty DD_SITE in .env would otherwise survive.
: "${DD_API_KEY:?not set - run dd-account-setup (commercial sites) or supply it directly (government sites)}"; : "${DD_APP_KEY:?not set - run dd-account-setup (commercial sites) or supply it directly (government sites)}"
sleep 30
resp=$(printf 'DD-API-KEY: %s\nDD-APPLICATION-KEY: %s\n' "$DD_API_KEY" "$DD_APP_KEY" \
| curl -sS -w '\n%{http_code}' -G -H @- "https://api.${DD_SITE}/api/v1/query" \
--data-urlencode "from=$(($(date +%s) - 900))" \
--data-urlencode "to=$(date +%s)" \
--data-urlencode "query=avg:docker.cpu.usage{host:<HOSTNAME>} by {container_name}") \
|| { echo "metric query request failed (curl error) - that is NOT 'metrics still propagating'." >&2; exit 1; }
code=$(printf '%s' "$resp" | tail -1); body=$(printf '%s' "$resp" | sed '$d')
[ "$code" = "200" ] || { echo "metric query failed with HTTP $code - that is NOT 'metrics still propagating':"; printf '%s\n' "$body"; exit 1; }
printf '%s\n' "$body"
<HOSTNAME> は、フェーズ 6 で Agent が報告したホスト名に置き換えてください。ホストでフィルタリングしない場合、クエリは組織内のすべての Docker ホストを対象とするため、このインストールから何も送信されていなくても、他のホストのコンテナーがウィジェットに表示されることがあります。
ウィジェットの描画
series が空でない場合は、実際の pointlist データを使って罫線文字でプロットし、平均値が高いコンテナー名を最大 3 件表示します。それ以外の場合は、静的なプレビューを表示します。
┌─────────────────────────────────────────────────────────┐
│ docker.cpu.usage ▂▃▅▆▇▆▅▃▂▁▂▃▅▆▇█ │
│ 100% ┤ ╭──╮ │
│ 75% ┤ ╭───╮ ╭──╯ │ │
│ 50% ┤ ╭────╯ ╰──╮ ╭────╯ │ │
│ 25% ┤ ╭────────╯ ╰────╯ │ │
│ 0% ┤────╯ │ │
│ └────────────────────────────────────────────┘ │
│ │
│ メトリクスはまもなく届きます。数分後にもう一度ご確認ください │
└─────────────────────────────────────────────────────────┘
コンテナー:<APP_BASE>/containers
便利なリンク
- コンテナー:
<APP_BASE>/containers - インフラストラクチャーマップ:
<APP_BASE>/infrastructure/map - モニター:
<APP_BASE>/monitors/create
APM が有効な場合:
- APM:
<APP_BASE>/apm/getting-started
ログが有効な場合:
- ログ:
<APP_BASE>/logs
重要な注意事項
DD_API_KEYを-e DD_API_KEY=...で渡さないでください。 権限を 0600 に設定したファイルを使い、--env-file(または Compose のenv_file:)で指定してください。このファイルは.gitignoreに含める必要があります。- コンテナーの検出とログの収集には、Docker ソケットのマウント(
/var/run/docker.sock)が必要です。 - Compose の場合、エージェントサービス名は Docker DNS を介してアプリコンテナーからアクセスできます。アプリコンテナーでは
localhostではなく、DD_AGENT_HOST=datadog-agentを設定してください。 - インターネットへのアクセスが制限されている環境では、
DD_PROXY_HTTP/DD_PROXY_HTTPSでプロキシを設定するか、エージェントイメージをプライベートレジストリにミラーリングしてください。 docker inspectによってコンテナーの環境変数が公開されるのは、Swarm 以外の Docker に本質的な仕様です。Docker ソケットにアクセスできるユーザーは、すでにホスト上で root と同等の権限を持っています。そのため、これは修正可能な情報漏えいではなく、信頼モデルの特性です。マルチテナントの Docker では、Swarm シークレットまたはシークレットバックエンド(Vault、Datadog Agent のsecrets_handlerを介した AWS Secrets Manager)を使用してください。