Springboot 应用与SkyWalking 集成,并使用 Docker 进行发布的完整步骤。整个过程分为两大部分:搭建 SkyWalking 后端与 UI 和 集成并发布 Spring Boot 应用。
方案概览
我们将使用两个 Docker 容器(或两个 Docker Compose 服务):
: 负责接收、聚合、分析链路和指标数据。
skywalking-oap-server
: 提供图形化界面用于查看数据。
skywalking-ui
: 应用容器,通过 Java Agent 将数据上报到
your-spring-boot-app
。
skywalking-oap-server
第一部分:搭建 SkyWalking 后台 (使用 Docker Compose)
这是最推荐的方式,可以快速搭建一套 SkyWalking 环境。
1. 创建
docker-compose.yml
文件
docker-compose.yml
创建一个目录,例如
,然后创建
skywalking-docker
文件。
docker-compose.yml
version: '3.8'
services:
# SkyWalking OAP 服务器
skywalking-oap:
image: apache/skywalking-oap-server:9.7.0
container_name: skywalking-oap
restart: always
ports:
- "11800:11800" # 接收 Agent 上报数据的 gRPC 端口
- "12800:12800" # 接收 Agent 上报数据的 HTTP 端口
environment:
- SW_STORAGE=elasticsearch7 # 存储类型,也可选用 elasticsearch8, h2, mysql 等
- SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 # ES 地址,这里用服务名
depends_on:
- elasticsearch
networks:
- skywalking-network
# SkyWalking Web UI
skywalking-ui:
image: apache/skywalking-ui:9.7.0
container_name: skywalking-ui
restart: always
ports:
- "8080:8080" # Web 界面访问端口
environment:
- SW_OAP_ADDRESS=skywalking-oap:12800 # 告诉 UI 后端 OAP 的地址
depends_on:
- skywalking-oap
networks:
- skywalking-network
# 可选的 Elasticsearch 服务(如果不想用外部的 ES)
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.10
container_name: es-server
restart: always
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
networks:
- skywalking-network
networks:
skywalking-network:
driver: bridge
2. 启动 SkyWalking 后台
在包含
的目录下运行:
docker-compose.yml
docker-compose up -d
等待所有容器启动后,你可以通过
访问 SkyWalking UI。初始状态没有应用数据,UI 界面是空的。
http://localhost:8080
注意:如果宿主机已经安装了 Elasticsearch,可以删除
服务,并将
elasticsearch
环境变量改为已有ES 地址(例如
SW_STORAGE_ES_CLUSTER_NODES
或服务器 IP)。
host.docker.internal:9200
第二部分:集成 SkyWalking Agent 并发布 Spring Boot 应用
Spring Boot 应用通过 Java Agent 的方式与 SkyWalking 集成,无需修改任何代码。
1. 获取 SkyWalking Java Agent
你需要下载 SkyWalking Agent,有两种方式:
方式一:直接下载(推荐)
从 SkyWalking Apache 下载页 下载对应的 Agent 压缩包(例如
),解压后得到
apache-skywalking-java-agent-8.20.0.tgz
目录。
agent
方式二:使用 Docker 镜像中的 Agent(更适用于 Docker 环境)
你可以直接使用
镜像中的 Agent,它位于
apache/skywalking-oap-server
目录。这是我们下面在 Dockerfile 中会用到的方式。
/skywalking/agent
2. 创建 Dockerfile 集成 Agent
Spring Boot 应用的
需要将 Agent 拷贝到镜像中,并在启动命令中通过
Dockerfile
参数启用它。
-javaagent
# 基础镜像
FROM eclipse-temurin:17-jre as builder
WORKDIR /app
# 从 apache/skywalking-oap-server 镜像中复制 agent 到当前镜像
# 这避免了手动下载,确保 Agent 与 OAP Server 版本兼容
COPY --from=apache/skywalking-oap-server:9.7.0 /skywalking/agent /skywalking/agent
# 拷贝 Spring Boot Jar 包(假设 jar 包在构建上下文目录)
COPY target/your-spring-boot-app.jar app.jar
# 启动命令,关键是指定 javaagent 参数
# 假设在 Dockerfile 中已通过 ENV 指令设置了某些默认值,或者打算在运行时传入
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -javaagent:/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=${SW_AGENT_NAME} -Dskywalking.collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES} -Djava.security.egd=file:/dev/./urandom -jar /app/yourapp.jar ${JAR_OPTS}"]
参数解释:
: 启用 SkyWalking Agent。
-javaagent:/skywalking/agent/skywalking-agent.jar
: 重要:设置应用在 SkyWalking 中显示的名字,例如
-Dskywalking.agent.service_name=your-application-name
,
user-service
。
order-service
-Dskywalking.collector.backend_service=host.docker.internal:11800
重要:告诉 Agent 将数据上报到哪里。
是 Docker 的一个特殊 DNS,指向宿主机的 IP。这在 Mac/Windows 的 Docker Desktop 中有效。如果 SkyWalking OAP 和 Spring Boot 应用都在同一个 Docker Compose 中,你应该使用 服务名 和 内部端口,例如
host.docker.internal
。如果在 Linux 服务器或生产环境中,请使用真实的 OAP 服务器 IP 或域名。
-Dskywalking.collector.backend_service=skywalking-oap:11800
3. 构建并运行 Spring Boot 应用容器
构建镜像:在 Spring Boot 项目根目录(包含
和 jar 包的地方)运行:
Dockerfile
docker build -t your-spring-boot-app:latest .
运行容器:
如果使用同一个 Docker Compose(推荐):
将应用服务添加到之前的
中:
docker-compose.yml
services:
# ... (之前的 skywalking-oap, skywalking-ui, elasticsearch 服务)
your-spring-boot-app:
build:
context: /path/to/your/spring-boot-app # 指向应用目录
container_name: your-spring-boot-app
restart: always
ports:
- "8081:8080" # 暴露应用端口
environment:
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking-oap:11800 # 也可以通过环境变量覆盖后端地址
networks:
- skywalking-network
depends_on:
- skywalking-oap
然后运行
来同时启动所有服务(SkyWalking 基础设施 + 应用)。
docker-compose up -d
如果单独运行:
docker run -d
--name your-app
-p 8080:8080
-e SW_AGENT_COLLECTOR_BACKEND_SERVICES=host.docker.internal:11800
your-spring-boot-app:latest
确保
能正确解析到运行着
host.docker.internal
容器的主机。
skywalking-oap
验证与查看
访问 Spring Boot 应用,触发几个接口调用。打开浏览器,访问 SkyWalking UI:
。在主页的服务下拉框中,你应该能看到你配置的服务名(例如
http://localhost:8080
)。点击搜索按钮,稍等片刻(约1-2分钟),就能看到应用的拓扑图、链路追踪(Traces)和指标(Metrics)等信息。
your-application-name
常见问题排查 (Troubleshooting)
在 UI 中看不到数据:
检查
和
skywalking-oap
容器日志是否有错误:
elasticsearch
。检查应用容器日志,确认 Agent 是否成功启动,并且没有连接
docker logs skywalking-oap
的错误。确保
backend_service
的地址和端口是正确的,并且网络是通的。在 Docker Compose 网络中,使用服务名;在宿主机单独部署时,使用
-Dskywalking.collector.backend_service
或宿主机 IP。 Agent 版本兼容性:确保 Java Agent 的版本与 OAP Server 的版本一致或兼容(主版本号相同通常可以)。
host.docker.internal
按照以上步骤,就可以成功地将 Spring Boot 应用与 SkyWalking 集成并通过 Docker 发布。
暂无评论内容