一、创建网络
将应用部署在同一网络,应用之间访问可以通过docker名访问,后期也可以延展到K8S, SpringCloud.
docker network create -d bridge --gateway 172.22.0.1 --subnet 172.22.0.0/16 mynet
二、创建启动SkyWalking服务
1. 使用默认的内存数据库
docker run --name skywalking-oap \
--network mynet \
-d apache/skywalking-oap-server:latest
2. 使用MySql数据库
手动得到mysql的jar包,可以在IDEA开发的里面找到。
data/dockers/monitor/skywalking-oap/ext-libs/mysql-connector-java-8.0.29.jar
data/dockers/monitor/skywalking-oap/ext-config
目录下可以留空,如果配置了某个文件,启动时会自动复制到配置目录,如果存在相同的文件名就会覆盖掉,所以这个功能很方便使用哦。
3. 启动服务
docker run --name skywalking-oap \
--network mynet \
-e SW_STORAGE=mysql \
-e SW_JDBC_URL="jdbc:mysql://xxx:3306/skywalking?rewriteBatchedStatements=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai" \
-e SW_DATA_SOURCE_USER=xxx \
-e SW_DATA_SOURCE_PASSWORD=xxxxxxx \
-v /data/dockers/monitor/skywalking-oap/ext-libs:/skywalking/ext-libs \
-v /data/dockers/monitor/skywalking-oap/ext-config:/skywalking/ext-config \
-p 11800:11800 \
-d apache/skywalking-oap-server
三、创建启动Skywalking图形化界面
docker run --name skywalking-ui \
--network mynet \
-e SW_OAP_ADDRESS=http://skywalking-oap:12800 \
-p 8080:8080 \
-d apache/skywalking-ui
四、为应用接入Skywalking Agent
这里有两种方式,一种是下载 skywalking agent 自己创建镜像, 一种是直接使用镜像。
如果skywalking 服务和 应用不在同一服务器上部署则还需要修改 config/agent.conf
,文件末尾追加
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:skywalking-oap}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}
自己打包的方式
1.下载Agent 包
https://www.apache.org/dyn/closer.cgi/skywalking/java-agent/8.11.0/apache-skywalking-java-agent-8.11.0.tgz
docker pull apache/skywalking-java-agent:8.11.0-java17
mv skywalking-java-agent skywalking-agent
2. 创建Dockerfile, 用于整合agent
# Dockerfile
FROM openjdk:17.0.2
MAINTAINER JDK17 With SkyWalking <chenxue4076@163.com>
LABEL version="1.0" description="指定城市的容器" by="chenxue"
ENV ACTIVE_ENV=pre
COPY ./skywalking-agent /skywalking/agent
WORKDIR /opt/app
EXPOSE 8080
ENTRYPOINT java -jar -javaagent:/skywalking/agent/skywalking-agent.jar=agent.service_name=${SW_AGENT_NAME},collector.backend_service=skywalking-oap:11800 -jar /opt/app/${SW_AGENT_NAME}.jar --spring.profiles.active=${ACTIVE_ENV}
3. 创建镜像,在当前Dockerfile所在目录
docker build . -t jdk17-skywalking:v1.0.0
4. 创建应用是带上环境变量 , 其中 jar包是 /data/apps/taizhou-1.0.0.jar
docker run --name taizhou --network mynet \
-e SW_AGENT_NAME=taizhou-1.0.0 \
-e SW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking-oap \
-e ACTIVE_ENV=dev \
-v /data/apps:/opt/app \
-v /data/logs/taizhou:/opt/app/logs \
-v /etc/localtime:/etc/localtime:ro \
-p 8576:8080 \
-d jdk17-skywalking:v1.1.0
使用Docker镜像的方式
1. 需要获取一份 config/agent.config
的配置文件。
可以使用上面的手动下载下来的文件,找到此文件使用,或者直接先 docker run
一下 apache/skywalking-java-agent:8.11.0-java17
,使用 docker cp
将文件考到本地。类似这样的流程。
# 随便run一个container, 获取到其中的agent文件
docker run --name skywalking-test -d apache/skywalking-java-agent:8.11.0-java17
# 复制文件到本地
docker cp skywalking-test:/skywalking/agent/config/agent.config config/agent.config
# 删除 container
docker stop skywalking-test
docker rm skywalking-test
2. 参考上面的说明在 agent.config 尾部追加 grpc相关配置。
3. 创建Dockerfile
# Dockerfile
FROM apache/skywalking-java-agent:8.11.0-java17
MAINTAINER JDK17 With SkyWalking <chenxue4076@163.com>
LABEL version="1.0" description="指定城市的容器" by="chenxue"
# 复制一些用到的jar包
RUN cp /skywalking/agent/optional-plugins/apm-spring-cloud-gateway-*.jar /skywalking/agent/plugins/
RUN cp /skywalking/agent/optional-plugins/apm-trace-ignore-plugin-*.jar /skywalking/agent/plugins/
RUN cp /skywalking/agent/optional-plugins/apm-mybatis-*.jar /skywalking/agent/plugins/
COPY ./agent.config /skywalking/agent/config/
ENV ACTIVE_ENV=prod
ENV APP_NAME=app
EXPOSE 8080
ENTRYPOINT java -jar /apps/${APP_NAME}.jar --spring.profiles.active=${ACTIVE_ENV}
4. 创建镜像
docker build . -t jdk17-skywalking:v1.0.0
5. 创建应用, 可以参考下面的模板 jar文件是 data/apps/shaoxing/shaoxing-1.0.0.jar
docker run --name fujitec-shaoxing --network mynet \
-e SW_AGENT_NAME=prod::shaoxing \ # ::前面是group名
-e SW_AGENT_NAMESPACE=fujitec \ # namespace
-e SW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking-oap:11800 \
-e SW_GRPC_LOG_SERVER_HOST=skywalking-oap \
-e ACTIVE_ENV=prod \
-e APP_NAME=shaoxing-1.0.0 \
-v /data/apps/shaoxing:/apps \
-v /data/logs/shaoxing:/skywalking/logs \
-v /etc/localtime:/etc/localtime:ro \
-p 12003:12001 \
-d jdk17-skywalking:v1.0.0
五、应用代码怎么接入
下面简单说明,不做详细介绍。
- 引入 maven包。
<properties>
<skywalking.version>8.11.0</skywalking.version>
</properties>
<!-- skywalking log toolkit -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>${skywalking.version}</version>
</dependency>
<!-- skywalking trace toolkit -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>${skywalking.version}</version>
</dependency>
logback-spring.xml, 只加了部分配置,仅供参考 ,主要是 输出增加 [%tid]
<!-- 级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时 会输出 -->
<!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志 -->
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="true">
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 动态日志级别 -->
<jmxConfigurator />
<springProperty name="appName" source="spring.application.name" />
<!--spring只打印警告日志-->
<logger name="org.springframework" level="WARN"/>
<!--hibernate只打印警告日志-->
<logger name="org.hibernate" level="WARN"/>
<!--kafka只打印警告日志-->
<logger name="org.springframework.kafka" level="WARN"/>
<logger name="org.apache.kafka" level="WARN"/>
<!-- 日志输出 Encoder 类 -->
<property name="tidEncoder" value="ch.qos.logback.core.encoder.LayoutWrappingEncoder" />
<!-- 日志输出 Layout 类-->
<property name="tidLayout" value="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"/>
<!-- 日志输出格式 -->
<property name="tidPattern" value=" %d{yyyy-MM-dd HH:mm:ss.SSS} [${appName},%X{traceId},%X{spanId}] [%tid] [%thread] %-5level %logger{36} : %msg%n" />
<!-- 定义日志文件 输出位置 -->
<property name="logDir" value="logs"/>
<!-- 日志最大的历史 30天 -->
<property name="maxHistory" value="7"/>
<!-- INFO级别日志 appender -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logDir}/${appName}-info.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logDir}/${appName}-info-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<encoder class="${tidEncoder}">
<layout class="${tidLayout}">
<Pattern>${tidPattern}</Pattern>
</layout>
</encoder>
</appender>
<!-- 日志输出到 skywalking 的 appender -->
<appender name="SKYWALKING" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="${tidEncoder}">
<layout class="${tidLayout}">
<Pattern>${tidPattern}</Pattern>
</layout>
</encoder>
</appender>
<!-- root级别 DEBUG -->
<root>
<!-- 打印debug级别日志及以上级别日志 -->
<level value="INFO" />
<!-- skywalking 输出 -->
<appender-ref ref="SKYWALKING" />
</root>
</configuration>
其他监控方面正在研究。 也可以使用 Prometheus + Grafana 做监控。
(1589)