Docker构建分布式追踪镜像的核心是组合标准组件而非从零开发:Agent嵌入应用采集数据,OAP/Collector接收分析,UI展示,存储(如ES)持久化;需明确角色、网络互通、版本匹配与资源限制。

用 Docker 构建具备分布式追踪能力的镜像,核心不是“从零写一个带追踪功能的镜像”,而是把标准追踪组件(如 SkyWalking OAP、Jaeger Collector、Prometheus Exporter)和应用探针(如 SkyWalking Agent)通过 Dockerfile 或 docker-compose 组织起来,形成可复用、可部署的监控单元。关键在于分清角色:谁采集数据、谁接收数据、谁存储数据、谁展示数据。
明确组件职责与协作关系
全链路监控不是单个容器的事,而是一套协同工作的服务组合:
-
Agent(探针):嵌入在你的业务容器中,比如 Java 应用启动时添加
-javaagent:/skywalking/agent/skywalking-agent.jar参数,自动上报调用链数据;它不单独做镜像,而是挂载进应用镜像或通过多阶段构建集成。 -
OAP / Collector(后端服务):接收、分析、聚合追踪数据,例如
apache/skywalking-oap-server或jaegertracing/jaeger-collector;这类镜像需配置存储后端(Elasticsearch、MySQL 或内存模式)。 -
UI(可视化界面):如
apache/skywalking-ui或jaegertracing/jaeger-query,只负责读取 OAP/Collector 提供的 API 展示拓扑、Trace 列表、耗时瀑布图。 -
存储(可选但推荐):生产环境必须外接持久化存储,比如
elasticsearch:7.5.1(SkyWalking 常用)、jaegertracing/jaeger-es-index-cleaner配合 ES,或cassandra(Jaeger 传统方案)。
两种主流构建路径
根据你的目标环境选择:
-
学习/演示环境:用 all-in-one 镜像快速验证
例如 Jaeger:docker run -d --name jaeger -p 6831:6831/udp -p 16686:16686 jaegertracing/all-in-one:latest。它把 Collector、Query、UI、内存存储打包在一起,适合 5 分钟上手,但数据不持久、不可扩缩容。 -
生产就绪环境:拆分部署 + 自定义镜像
以 SkyWalking 为例:- 用官方
apache/skywalking-oap-server:9.7.0-es7镜像启动 OAP,并通过-e SW_STORAGE=elasticsearch7指向外部 ES; - 用
apache/skywalking-ui:9.7.0启动 UI,通过环境变量-e SW_OAP_ADDRESS=https://www.php.cn/link/933f4346eb5223b968a949ddb0215dff连接 OAP; - 为你的 Spring Boot 应用构建新镜像,在 Dockerfile 中 COPY SkyWalking Agent 并修改启动命令:
COPY apache-skywalking-apm-bin/agent /skywalking/agent<br>RUN java -javaagent:/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=my-app -jar app.jar
- 用官方
关键配置要点(避坑重点)
很多失败源于忽略这些细节:
-
网络互通:OAP、UI、Agent、存储必须在同一 Docker 网络(推荐自定义 bridge 网络),避免用
localhost——容器内localhost指自己,应使用服务名(如es7、oap); -
ES 版本强绑定:SkyWalking OAP 对 Elasticsearch 版本敏感,
skywalking-oap-server:9.7.0-es7必须配elasticsearch:7.17.12类版本,不能混用 8.x; -
Agent 挂载方式:不建议在运行时用
-v挂载 agent 目录(权限/路径易错),更稳妥是构建进镜像,或用initContainer(K8s 场景)预置; -
资源限制:OAP 和 ES 内存消耗大,Docker 启动时加
--memory=2g --cpus=2防止 OOM; -
健康检查:为 OAP 容器添加
healthcheck,探测http://localhost:12800/v3/scope,确保依赖就绪再启 UI。
推荐最小可行组合(docker-compose.yml 片段)
以下是一个轻量、可直接运行的三件套(SkyWalking + ES + 应用)结构:
version: '3.8'
services:
es7:
image: elasticsearch:7.17.12
container_name: es7
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms1g -Xmx1g
ulimits:
memlock: -1
nofile: 65536
volumes:
- es7_data:/usr/share/elasticsearch/data
<p>oap:
image: apache/skywalking-oap-server:9.7.0-es7
container_name: oap
depends_on:</p>
- es7 environment:
- SW_STORAGE=elasticsearch7
- SW_STORAGE_ES_CLUSTER_NODES=es7:9200 ports:
- "12800:12800"
ui: image: apache/skywalking-ui:9.7.0 container_name: ui depends_on:
- oap environment:
- SW_OAP_ADDRESS=https://www.php.cn/link/933f4346eb5223b968a949ddb0215dff ports:
- "8080:8080"
my-app: build: ./my-springboot-app
此处已集成 SkyWalking Agent 启动参数
depends_on: - oap
volumes: es7_data:











