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包时有些参数是不支持的,譬如在我测试中,这两个参数就报错
3、诸如这种127.0.0.1的报错,要检查相关配置文件,都改到docker外的宿主机ip上,不然通信不了
(1)skywalking报错:连接拒绝
这个启动文件 startup.sh
SW_AGENT_COLLECTOR_BACKEND_SERVICES 如果写成 127.0.0.1 会报如下错误
要检查下配置文件,或者启动脚本
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
成品图是这样的,指标还没出来,因为还需要一个服务,明天再搞
待续。。。。。