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

成品圖是這樣的,指標還沒出來,因為還需要一個服務,明天再搞


待續。。。。。
