docker部署spring boot并接入skywalking【探索篇】

docker部署spring boot并接入skywalking【探索篇】

一、问题引入

  最近忙标书的事,或者是一些技术含量不高的,写下来恐贻笑大方,难登大雅之堂。。。

  这个课题是最近闲起来自己找事做的,因为写的标书里面有提到什么灰度发布呀,docker镜像恢复呀,各种监控呀。首先我一开始并不知道skywalking是什么来的,是某强告诉我的,只知道ELK 7版本有个APM的东西,然后我经理叫我点进去,说有空研究下。

  然后研究不下去,倒是部署下来了,如下图:

 

   当我想搞清楚页面每个指标代表啥意思的时候(老实说,即使知道中文意思也挺懵逼的,估计开发才了解),发现并没有很多参考文档,而且elk官网对这个APM都是全英解释,关键的是,做报警监控的时候还有短板,说是内测阶段。看着研究价值不高,而且感觉会死很多脑细胞,干脆放弃了,问某强公司用的APM工具是什么,然后这个skywalking出场了,是针对微服务用得非常普遍的APM工具。

  单纯单机版在操作系统运行,指定下agent收集器跑jar包(目前我们线上业务就是操作系统跑的jar微服务),完事~

  但上面说到标书是要用docker,也就是标如果中了,这个是趋势,docker下跑jar包,方便回滚操作,然后什么高大上的灰度发布,滚动升级,用户无感知。。。k8s应该以后也是会用到的,从简单入手,我就先研究这个了。

 

二、问题探索

  昨天搞的时候一点进度都木有,可能过急了,就是跳跃式,越快越好,不仅jar包无法注册到nacos服务中心,而且skywalking也监控不到跑起来的jar包服务。我直接改以前docker版pipeline的jenkins发布任务,因为我以为很简单 = =,无非就是把jar包打到skywalking基础镜像上,然后指定agent跑起来就好。才发现,出问题很难定位问题原因。

  参考文档:https://www.jb51.net/article/210119.htm

  首先讲下我是怎么做这个东西的。测试的排版目录长这样:

 说明:

(1)build目录:

以 apache/skywalking-base:8.4.0-es6 作为基础镜像,把启动脚本startup.sh打进去,最终构建出 “服务名:sw” 的新镜像 

[root@170 builds]# more 服务名/Dockerfile 
FROM apache/skywalking-base:8.4.0-es6 

WORKDIR /app
COPY startup.sh /app/startup.sh

# 赋予运行权限
RUN chmod +x /app/startup.sh

# 指定容器时区:东八区
ENV TZ=Asia/Shanghai 
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

ENV SW_AGENT_COLLECTOR_BACKEND_SERVICES="192.168.0.170:11800" \
    SW_AGENT_NAME="api-gateway_sw"

# 进行运行脚本
CMD [ "sh", "-x", "/app/startup.sh" ]

docker build -t 服务名:sw ./服务名/

 

(2)services目录:映射运行目录到docker里面,包括jar包和日志,方便我在docker容器外看日志

(3)yaml 目录:装有docker-compose.yaml文件,用于运行微服务

[root@170 test_sw]# more yaml/docker-compose.yml 
version: '3.5'

## 微服务
services:
  服务名:
    image: 服务名:sw    #builds 目录构建出来的镜像
    container_name: 服务名
    volumes:
      - /root/test_sw/services/服务名:/app
    ports:
      - 8080:8080
    environment:
      - TZ="Asia/Shanghai" 

 

  然后讲下我怎么查出来的,看日志!jenkins发布完竟然说是success的,但是docker ps 压根没有看到微服务!

  于是,我手动运行  “docker-compose start 服务” 是跑不动的,说容器里面找不到jar包,我就纳闷了,明明build的时候弄进去了的。没办法,只能docker run这个“服务名:sw”的镜像去查

 

三、排查流程:

1)把微服跑起来
docker run -itd --name 微服务-sw  -p 8081:8081 -v /root/test_sw/services/微服务:/app 微服务:sw bash

(2)进去容器
 docker exec -it 容器id bash 

(3)在容器里面手动跑jar包
java -Duser.timezone=GMT+08 -verbose:gc  -XX:+PrintGCDetails -Xms512m -Xmx512m -Xloggc:微服务-gc.log -javaagent:/skywalking/agent/skywalking-agent.jar -jar 微服务.jar >> out_微服务.log     

 

 

记录下解决问题的几个关键点

1、dockerfile构建镜像的时候,记得用skywalking-base 这个基础镜像,这个镜像已经有java环境,不用担心跑不了jar

FROM apache/skywalking-base:8.4.0-es6

 

2、以这个基础镜像打进去的jar包,或者运行脚本,启动jar包时有些参数是不支持的,譬如在我测试中,这两个参数就报错

-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC

 

3、诸如这种127.0.0.1的报错,要检查相关配置文件,都改到docker外的宿主机ip上,不然通信不了

(1)skywalking报错:连接拒绝

这个启动文件 startup.sh

SW_AGENT_COLLECTOR_BACKEND_SERVICES  如果写成 127.0.0.1 会报如下错误
Caused by: org.apache.skywalking.apm.dependencies.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: /127.0.0.1:11800
Caused by: java.net.ConnectException: Connection refused
 
(2)服务中心nacos报错:微服务无法注册

 

 

要检查下配置文件,或者启动脚本

  nacos报错,叫开发修改BOOT-INF/classes/bootstrap-test.properties 的配置,写成127.0.0.1是无法注册上去的,因为是容器内,要写成操作系统ip,因为已经映射出来,注意docker下的容器之间的网络是隔离的。

spring.cloud.nacos.config.server-addr=http://127.0.0.1:8848   #127.0.0.1需要改成操作系统ip  

  这个文件改了之后,还要确保application-test.yml也要修改,改成当前服务器的ip,我这里是192.168.0.170,原来写的是127.0.0.1

 

成品图是这样的,指标还没出来,因为还需要一个服务,明天再搞

 

 待续。。。。。

 

  

  

posted @ 2021-09-28 22:37  windysai  阅读(1422)  评论(0编辑  收藏  举报