将 OBI 作为 Docker 容器运行

了解如何设置和运行 OBI 作为独立的 Docker 容器,该容器可以检测另一个容器中的进程。

OBI 可以运行一个独立的 Docker 容器,该容器可以检测另一个容器中运行的进程。

Docker Hub 上查找 OBI 的最新镜像,其名称如下:

ebpf-instrument:main

OBI 容器必须按以下方式配置:

  • 特权 容器模式运行,或者使用 SYS_ADMIN 功能(但后者在某些容器环境中可能不起作用)。
  • 使用 host PID 命名空间,以便能够访问其他容器中的进程。

Docker CLI 示例

对于此示例,您需要一个运行 HTTP/S 或 gRPC 服务的容器。如果没有,您可以使用这个 用 Go 编写的简单博客引擎服务

docker run -p 18443:8443 --name goblog mariomac/goblog:dev

上面的命令运行了一个简单的 HTTPS 应用程序。该进程打开容器的内部端口 8443,然后将其作为端口 18443 暴露在宿主机上。

设置环境变量以配置 OBI 输出到 stdout,并监听一个端口(容器)来检查可执行文件。

export OTEL_EBPF_TRACE_PRINTER=text
export OTEL_EBPF_OPEN_PORT=8443

OBI 需要使用以下设置运行:

  • --privileged 模式运行,或具有 SYS_ADMIN 功能(尽管在某些容器环境中 SYS_ADMIN 可能不足以获得足够权限)。
  • 宿主 PID 命名空间,使用选项 --pid=host
docker run --rm \
  -e OTEL_EBPF_OPEN_PORT=8443 \
  -e OTEL_EBPF_TRACE_PRINTER=text \
  --pid=host \
  --privileged \
  docker.io/otel/ebpf-instrument:main

OBI 运行后,在浏览器中打开 https://:18443,使用该应用程序生成测试数据,并验证 OBI 是否向 stdout 打印类似以下的跟踪请求:

time=2023-05-22T14:03:42.402Z level=INFO msg="creating instrumentation pipeline"
time=2023-05-22T14:03:42.526Z level=INFO msg="Starting main node"
2023-05-22 14:03:53.5222353 (19.066625ms[942.583µs]) 200 GET / [172.17.0.1]->[localhost:18443] size:0B
2023-05-22 14:03:53.5222353 (355.792µs[321.75µs]) 200 GET /static/style.css [172.17.0.1]->[localhost:18443] size:0B
2023-05-22 14:03:53.5222353 (170.958µs[142.916µs]) 200 GET /static/img.png [172.17.0.1]->[localhost:18443] size:0B
2023-05-22 14:13:47.52221347 (7.243667ms[295.292µs]) 200 GET /entry/201710281345_instructions.md [172.17.0.1]->[localhost:18443] size:0B
2023-05-22 14:13:47.52221347 (115µs[75.625µs]) 200 GET /static/style.css [172.17.0.1]->[localhost:18443] size:0B

现在 OBI 正在跟踪目标 HTTP 服务,请将其配置为将指标和跟踪发送到 OpenTelemetry 端点,或者让 Prometheus 抓取指标。

有关如何导出跟踪和指标的信息,请参阅 配置选项 文档。

Docker Compose 示例

以下 Docker compose 文件复制了 Docker CLI 示例的相同功能。

version: '3.8'

services:
  # Service to instrument. Change it to any
  # other container that you want to instrument.
  goblog:
    image: mariomac/goblog:dev
    ports:
      # Exposes port 18843, forwarding it to container port 8443
      - '18443:8443'

  autoinstrumenter:
    image: docker.io/otel/ebpf-instrument:main
    pid: 'host'
    privileged: true
    environment:
      OTEL_EBPF_TRACE_PRINTER: text
      OTEL_EBPF_OPEN_PORT: 8443

使用以下命令运行 Docker compose 文件,并使用该应用程序生成跟踪:

docker compose -f compose-example.yml up

最后修改日期:2025 年 8 月 28 日:docs: fix tag for ebpf-instrument (#7661) (a4915a1d)