Docker Compose 一键部署 SkyWalking 10.2.0 + Elasticsearch8.11,分布式链路追踪完整实战

前言

最近在学习微服务可观测性,选用 Apache SkyWalking 做分布式链路追踪。在部署 SkyWalking10.2.0 时踩了大量新版本的坑:

  1. SkyWalking10.2 彻底移除内置 H2、内存 memory 存储,不再支持单机无数据库模式;
  2. BanyanDB 镜像国内拉取困难;
  3. OAP 环境变量配置名称变更,旧文档SW_ES_ADDRESS直接报错;
  4. Docker 容器网络问题,OAP 尝试连接 127.0.0.1:9200 拒绝;
  5. Elasticsearch 启动必须修改宿主机内核参数vm.max_map_count。

本文采用 SkyWalking10.2.0 + Elasticsearch8.11.0 组合,使用 docker-compose 编排,完整记录部署 + 排坑全过程。

环境信息

  • 操作系统:Ubuntu 22.04(宝塔面板)
  • Docker 版本:24+
  • Docker Compose:v2
  • 服务器:106.34.17.239
  • 端口规划 | 端口 | 服务 | 说明 | | ---- | ---- | ---- | |9200|Elasticsearch|ES REST 接口 | |11800|SkyWalking OAP GRPC|Agent 上报链路数据端口 | |12800|SkyWalking OAP HTTP|UI 面板后端接口 | |8080|SkyWalking UI|Web 可视化面板 |

一、前置准备

1.1 安装 Docker & Docker Compose

复制代码
# 更新源
apt update && apt upgrade -y
# 安装docker(宝塔一般自带docker,没有再执行)
apt install docker.io -y
# 启动并开机自启
systemctl start docker
systemctl enable docker

如果你用宝塔面板,直接在【软件商店】安装 Docker。

1.2 Elasticsearch 硬性内核参数(必做,否则 ES 无法启动)

ES 要求vm.max_map_count=262144

复制代码
# 临时生效,重启服务器失效
sysctl -w vm.max_map_count=262144

# 永久生效
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p

1.3 防火墙放行端口(宝塔重点!)

宝塔安全 -> 防火墙,放行端口:9200,11800,12800,8080

二、编写 docker-compose.yml

新建目录存放配置文件

复制代码
mkdir -p /opt/skywalking
cd /opt/skywalking
vi docker-compose.yml

复制下面完整配置粘贴进去

复制代码
version: '3.8'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: sky-es
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - discovery.type=single-node
      - xpack.security.enabled=false
      - xpack.security.enrollment.enabled=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ports:
      - "9200:9200"
    volumes:
      - es-data:/usr/share/elasticsearch/data
    ulimits:
      nofile:
        soft: 65535
        hard: 65535

  oap:
    image: apache/skywalking-oap-server:10.2.0
    container_name: sky-oap
    restart: always
    depends_on:
      - elasticsearch
    ports:
      - "11800:11800"
      - "12800:12800"
    environment:
      - TZ=Asia/Shanghai
      - SW_STORAGE=elasticsearch
      # SkyWalking10.x 正确ES集群节点配置!旧文档SW_ES_ADDRESS已经废弃!
      - SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200
      - JAVA_OPTS=-Xms512m -Xmx1024m

  ui:
    image: apache/skywalking-ui:10.2.0
    container_name: sky-ui
    restart: always
    depends_on:
      - oap
    ports:
      - "8080:8080"
    environment:
      - TZ=Asia/Shanghai
      - SW_OAP_ADDRESS=http://oap:12800

volumes:
  es-data:

⚠️ 踩坑重点:

  1. depends_on仅控制容器启动先后顺序 ,不会等待 ES 服务就绪。ES 启动很慢,OAP 会持续重试连接,属于正常现象;
  2. 容器内部网络,OAP 访问 ES 不能写127.0.0.1,必须使用 compose 服务名elasticsearch:9200;
  3. 环境变量:SW_STORAGE_ES_CLUSTER_NODES ,网上很多旧博客写的SW_ES_ADDRESS在 10.2 版本无效,会报连接 127.0.0.1:9200 拒绝。

三、启动整套 SkyWalking 集群

复制代码
# 进入目录
cd /opt/skywalking

# 销毁旧容器(修改yml后每次建议执行)
docker-compose down

# 后台拉起所有容器
docker-compose up -d

执行完成,可以看到三个容器:sky-es、sky-oap、sky-ui 状态 Started。

四、验证服务状态

4.1 验证 Elasticsearch 是否正常

复制代码
curl http://127.0.0.1:9200

返回下面 json,代表 ES 启动成功:

复制代码
{
  "name" : "473adec58f7b",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "drYnIPU0SOG8HCkE5UnVzA",
  "version" : {
    "number" : "8.11.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "d9ec3fa628c7b0ba3d25692e277ba26814820b20",
    "build_date" : "2023-11-04T10:04:57.184859352Z",
    "build_snapshot" : false,
    "lucene_version" : "9.8.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

4.2 查看 OAP 日志,等待初始化成功

ES 启动耗时较长,需要等待 2~3 分钟,再查看 OAP 日志

复制代码
docker logs sky-oap -f

✅ 成功标志日志:OAP started successfully 出现这句话代表 OAP 连接 ES 成功,服务就绪。

前期看到Connection refused报错不用慌,只是 OAP 在重试等待 ES 启动,等 ES 完全就绪会自动连上。

4.3 验证 OAP 容器内连通 ES

进入 oap 容器内部测试网络连通性

复制代码
docker exec -it sky-oap curl http://elasticsearch:9200

返回 ES json,代表 docker compose 内部网络互通,配置没问题。

五、访问 SkyWalking UI 面板

浏览器访问地址:

复制代码
http://106.34.17.239:8080

成功进入 SkyWalking 的 WebUI 市场页面。

  • 【市场】:各类监控仪表盘插件安装,SpringBoot 微服务选择 常规服务
  • 【服务】:查看接入的微服务列表、接口调用 Trace 链路(最核心页面)
  • 【拓扑图】:微服务之间调用依赖关系图
  • 【追踪】:根据 TraceId 查询单次请求完整调用链路,定位慢接口、异常报错

六、SpringBoot 项目 Agent 接入(后续使用)

下载 SkyWalking Agent 包,在 SpringBoot 项目 JVM 启动参数添加 agent 配置

复制代码
-javaagent:/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.service_name=demo-service
-Dskywalking.collector.backend_service=106.34.17.239:11800
  • demo-service:自定义你的服务名称,微服务每个服务名称区分开
  • 106.34.17.239:11800:OAP GRPC 上报地址

启动 SpringBoot,等待几十秒,面板【服务】中就会识别到应用,开始采集链路、耗时、异常指标。

七、踩坑总结(重点,这是本文核心价值)

坑 1:SkyWalking10.2 版本不再支持 H2、memory 内置存储

旧版本 SkyWalking10.1 及以下支持 SW_STORAGE=h2,单机直接跑。10.2 版本移除内置存储,必须外接 BanyanDB 或者 Elasticsearch。BanyanDB 国内镜像拉取困难,因此选择 ES 方案。

坑 2:OAP 日志:Connection refused: localhost/127.0.0.1:9200

原因:网上旧教程使用环境变量SW_ES_ADDRESS,10.x 版本已经废弃。新版必须用:SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200

另外容器内部localhost指向容器自身,不能写 127.0.0.1 访问 ES,要用 compose 服务名。

坑 3:Elasticsearch 启动失败,max virtual memory areas vm.max_map_count 65530 is too low

解决:执行前文内核参数命令sysctl -w vm.max_map_count=262144

坑 4:容器全部 Started,但是浏览器访问 8080 打不开面板

排查:宝塔 / 服务器安全组防火墙没有放行 8080 端口。

坑 5:OAP 一直报连接 ES 拒绝

depends_on 只保证容器启动顺序,ES 初始化需要时间,耐心等待 2~3 分钟,OAP 会自动重试。服务器内存建议至少 3G,内存过低 ES 会 OOM 崩溃。

八、可选:服务器内存不足降级方案(备选)

如果服务器内存较小,ES+OAP 非常吃内存,可以降级 SkyWalking 到 10.1 版本,支持内置 H2,不需要额外部署 ES。

复制代码
version: '3.8'
services:
  oap:
    image: apache/skywalking-oap-server:10.1.0
    container_name: sky-oap
    restart: always
    ports:
      - "11800:11800"
      - "12800:12800"
    environment:
      - TZ=Asia/Shanghai
      - SW_STORAGE=h2
      - JAVA_OPTS=-Xms256m -Xmx512m
  ui:
    image: apache/skywalking-ui:10.1.0
    container_name: sky-ui
    restart: always
    depends_on:
      - oap
    ports:
      - "8080:8080"
    environment:
      - TZ=Asia/Shanghai
      - SW_OAP_ADDRESS=http://oap:12800
volumes:
  oap-data:

结尾

SkyWalking 是微服务分布式追踪优秀开源 APM 工具,新版本改动较大,网上大量博客是旧版本配置,直接复制很容易踩坑。本文完整记录 SkyWalking10.2+ES 部署和排错流程。

后续文章预告:SpringBoot 项目接入 SkyWalking Agent,实现接口链路追踪、慢请求告警、SQL 监控。

相关推荐
励志师code1 小时前
Kubernetes 集群节点生命周期管理实战:从扩容、调度管控到证书续期
运维·docker·容器·kubernetes·gpu算力·kubelet
AOI小白新手上路2 小时前
autodl无卡模式下载NTURain 训练集实录:基于 Git 部分克隆与稀疏检出的数据拉取
大数据·git·elasticsearch
木雷坞2 小时前
Docker Compose部署Metabase:应用库隔离与日期筛选看板
运维·docker·容器
怒放的生命19912 小时前
前端项目 Docker 打包实操指南
前端·docker·容器
tedcloud1232 小时前
Docker Compose 部署 Immich:手机照片自动备份与常见故障排查
运维·前端·docker·容器·智能手机·开源·流程图
古城小栈2 小时前
Docker Compose 云原生的底座
docker·云原生·容器
卜锦元3 小时前
Docker Compose 部署 Nginx 1.30.6 完整指南
nginx·docker·容器
骑着蜗牛撵大象3274 小时前
Spring AI + Qwen3.8 周报助手:从事项采集到人工确认卡的闭环实战
人工智能·spring·elasticsearch·自动化·大模型应用·qwen3.8·rag溯源
xrlfreedom4 小时前
MCP 面试高频考点:把知识库 RAG 检索封装为 Tool,Docker 与结构化输出怎么配合不踩坑
docker·结构化输出·mcp