一、创建网络

将应用部署在同一网络,应用之间访问可以通过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 做监控

(1421)

Related Post