SkyWalking使用和Docker环境下部署方式

 更新时间:2026年02月11日 09:30:29   作者:Hoking  
Skywalking是一款分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8S、Mesos)架构而设计,该框架采用字节码注入的方式实现代码的无侵入,数据存储支持Mysql、Elasticsearch等

一、Skywalking概述

1、Skywalking介绍

Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等。

Skywalking是一个国产的开源框架,2015年由吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,主要开发人员来自于华为,2019年4月17日Apache董事会批准SkyWalking成为顶级项目,支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等,跟Pinpoint一样采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生支持,目前增长势头强劲,社区活跃。

2、Skywalking架构图

整个架构,分成上、下、左、右四部分

  • 1)上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。Agent 收集 SkyWalking Tracing 数据,传递给服务器。
  • 2)下部分 SkyWalking OAP :负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能。
  • 3)右部分 Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主。
  • 4)左部分 SkyWalking UI :负责提供控台,查看链路等等。

SkyWalking 三个核心部分

  • Agent(探针):Agent 运⾏在各个服务实例中,负责采集服务实例的 Trace 、Metrics 等数据,然后通过 gRPC ⽅式上报给 SkyWalking 后端。
  • OAP:SkyWalking 的后端服务,⼀个是负责接收 Agent 上报上来的 Trace、Metrics 等数据,进⾏流式分析,最终将分析得到的结果写⼊持久化存储中,另⼀个是负责响应 SkyWalking UI 界⾯发送来的查询请求。
  • UI 界⾯:展示查询结果。

SkyWalking Agent实现原理

  • SkyWalking Agent是通过Java Agent的方式随着应用程序一起启动,然后通过Byte Buddy库动态插入埋点信息收集Trace信息。
  • Java Agent本质上就是⼀个Jar包,它会调⽤ Instrumentation API,来修改已经加载到JVM中的字节码。
  • Instrumentation API由JVM提供⽤来修改已加载类的⼯具,可以提供Java语⾔编写的插桩功能,动态修改运⾏时代码的能⼒。

Java Agent具有两种加载⽅式

静态加载

这种⽅式下,在应⽤程序的任何代码被执⾏之前,就加载Agent以修改字节码。静态加载需要使⽤JVM 的-javaagent参数:

java -javaagent:agent.jar -jar application.jar
# 可以同时加载多个Agents
java -javaagent:agentA.jar -javaagent:agentB.jar application.jar

动态加载

这种⽅式下,Agent可以在运⾏时动态按需的加载。动态加载需要调⽤Java Attach API。

// 根据PID查找⽬标JVM,并连接到JVM 
VirtualMachine jvm = VirtualMachine.attach(jvmPid); 
// 加载Agent 
jvm.loadAgent(agentFile.getAbsolutePath()); 
// 取消到JVM的连接 
jvm.detach();

Instrumentation

Instrumentation是java提供的修改已经加载到JVM中字节码的API。使⽤ Instrumentation,开发者可以构建⼀个独⽴于应⽤程序的代理程序(Agent),⽤来监测和协助运⾏在 JVM 上的程序,甚⾄能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的运⾏时虚拟机监控和Java 类操作了,这样的特性实际上提供了⼀种虚拟机级别⽀持的 AOP 实现⽅式,使得开发者⽆需对 JDK 做任何升级和改动,就可以实现某些 AOP 的功能了。JVM级别AOP。

在JDK 1.6以前,instrument只能在JVM刚启动开始加载类时生效,而在JDK 1.6之后,instrument支持了在运行时对类定义的修改。在 Java SE 6 ⾥⾯,instrumentation 包被赋予了更强⼤的功能:启动后的instrument、本地代码 (native code)instrument,以及动态改变 classpath 等等。这些改变,意味着 Java 具有更强的动态控制、解释能⼒,它使得 Java 语⾔变得更加灵活多变。

二、Docker环境下使用docker-compose部署Skywalking

1、相关组件及版本

序号

组件

版本

备注

1

skywalking-oap-server

8.9.1

2

elasticsearch

7.17.6

3

skywalking-ui

8.9.1

4

apache-skywalking-java-agent

8.15.0

2、创建目录赋予权限

mkdir elasticsearch
cd elasticsearch
mkdir logs
mkdir data
chmod 775 logs
chmod 775 data

3、准备docker-compose.yml文件

version: '3.3'
services:
  elasticsearch:
    image: elasticsearch:7.17.6
    container_name: elasticsearch
    restart: always
    ports:
      - 9200:9200
    environment:
      - "TAKE_FILE_OWNERSHIP=true" #volumes 挂载权限 如果不想要挂载es文件改配置可以删除
      - "discovery.type=single-node" #单机模式启动
      - "TZ=Asia/Shanghai" # 设置时区
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置jvm内存大小
    volumes:
      - ./elasticsearch/logs:/usr/share/elasticsearch/logs
      - ./elasticsearch/data:/usr/share/elasticsearch/data
     #- ./elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ulimits:
      memlock:
        soft: -1
        hard: -1
  skywalking-oap-server:
    image: apache/skywalking-oap-server:8.9.1
    container_name: skywalking-oap-server
    depends_on:
      - elasticsearch
    links:
      - elasticsearch
    restart: always
    ports:
      - 11800:11800
      - 12800:12800
    environment:
      SW_STORAGE: elasticsearch  # 指定ES版本
      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
      TZ: Asia/Shanghai
    #volumes:
     #- ./oap/conf/alarm-settings.yml:/skywalking/config/alarm-settings.yml
  skywalking-ui:
    image: apache/skywalking-ui:8.9.1
    container_name: skywalking-ui
    depends_on:
      - skywalking-oap-server
    links:
      - skywalking-oap-server
    restart: always
    ports:
      - 8080:8080
    environment:
      SW_OAP_ADDRESS: http://skywalking-oap-server:12800
      TZ: Asia/Shanghai

3、执行启动服务命令

docker-compose up -d

4、访问UI地址http:${IP}:8080

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker 部署Scrapy的详解

    Docker 部署Scrapy的详解

    这篇文章主要介绍了Docker 部署Scrapy的详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • docker 手动构建新镜像的方法

    docker 手动构建新镜像的方法

    这篇文章主要介绍了docker 手动构建新镜像的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Mac OS如何添加docker环境变量

    Mac OS如何添加docker环境变量

    安装Docker Desktop后需手动将CLI路径添加至/etc/paths.d文件,以恢复命令行工具,通过创建对应文件并设置路径,重启终端后环境变量生效,即可正常使用Docker CLI
    2025-07-07
  • docker各目录含义详细解析

    docker各目录含义详细解析

    Docker容器的目录结构通常是在构建镜像时定义的,它基于所使用的基础镜像,下面这篇文章主要给大家介绍了关于docker各目录含义详细解析的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • docker仓库数据传输加密的问题小结

    docker仓库数据传输加密的问题小结

    这篇文章主要介绍了docker仓库数据传输加密的问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-12-12
  • Docker中的数据存放位置

    Docker中的数据存放位置

    这篇文章主要介绍了Docker中的数据存放位置,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Dockerfile ENV语法使用指南

    Dockerfile ENV语法使用指南

    这篇文章主要为大家介绍了Dockerfile ENV语法使用指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 通过Docker Compose部署MySQL的详细教程

    通过Docker Compose部署MySQL的详细教程

    Docker Compose 作为 Docker 官方的容器编排工具,为 MySQL 数据库部署带来了显著优势,下面小编就来为大家详细介绍一下具体的流程吧
    2025-03-03
  • Docker中的四种网络模式

    Docker中的四种网络模式

    Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。本文详细介绍了docker中的四种网络模式,感兴趣的小伙伴可以参考一下
    2023-04-04
  • docker容器启动设置固定IP的实现

    docker容器启动设置固定IP的实现

    本文主要介绍了docker容器启动设置固定IP的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12

最新评论