之前寫過2篇關於Docker部署的文章:
2、Docker通過阿里雲映象倉庫使用Gitlab_CI部署SpringBoot專案
用上篇部落格部署Java程式是ok的,不過Java日誌列印在容器裡,不能滿足原來ELK的日誌蒐集。
方法有2種:
1、在Docker容器內部加入日誌收集工具,Filebeat或Logstash。
2、將打Docker內的日誌列印到宿主機的目錄。
本文用的第二種,下面再慢慢說思路,開始叻
先看專案不迷糊
1、首先 Dockerfile 裡的 ENTRYPOINT配置Java日誌輸出無果
# 基礎映象使用Java FROM java:8 LABEL name=shop-client-prod LABEL version=v0.0.1 # 將jar包新增到容器中並更名為 # 注意:這個jar包檔名,請前方伺服器 目錄檢視 COPY /shop-client/target/shop-client-1.0-SNAPSHOT.jar /usr/local/app/client.jar # 容器暴露埠 EXPOSE 7071 # 這個暫且不用 # COPY target/lib /app/lib ENTRYPOINT ["nohup","java","-Djava.security.egd=file:/dev/./urandom","-jar","-Dspring.profiles.active=master","/usr/local/app/shop-client.jar", ">client.out" , "&"]
改為執行shell指令碼的方式,把啟動Jar的指令拆出來
# 基礎映象使用Java FROM java:8 LABEL name=shop-client-prod LABEL version=v0.0.1 # 將jar包新增到容器中並更名為 # 注意:這個jar包檔名,請前方伺服器 目錄檢視 COPY /shop-client/target/shop-client-1.0-SNAPSHOT.jar /usr/local/app/client.jar COPY /shop-client/clientStart.sh /usr/bin/clientStart.sh # 資料卷 VOLUME /usr/local/app/logos # 容器暴露埠 EXPOSE 7071 RUN chmod +x /usr/bin/clientStart.sh CMD ["sh","/usr/bin/clientStart.sh"]
2、專案路徑下建立clientStart.sh檔案,用於啟動Jar包
#!/bin/bash # author: Linnuo # date: 2021-12-16 # Filename: clientStart.sh # Description: 啟動客戶端後臺 nohup java -Djava.security.egd=file:/dev/./urandom -jar -Dspring.profiles.active=dev /usr/local/app/client.jar --server.port=7071 >/usr/local/app/logs/client.out
這裡啟動Jar不要後臺執行
3、gitlab-ci.yml 檔案修改Docker的啟動命令
# 第1步 client: image: maven:3-jdk-8 stage: client only: - master script: - mvn clean package # 建立shop-client映象 - sudo docker build -t $CI_REGISTRY_CLIENT_IMAGE -f ./shop-client/Dockerfile . # 推送到阿里雲映象庫 - sudo docker push $CI_REGISTRY_CLIENT_IMAGE # 從阿里雲拉取映象 - sudo docker pull $CI_REGISTRY_CLIENT_IMAGE # 先把之前存在的容器刪除 - CONTAINER_ID=$(sudo docker container ps -a -f "name=$CI_CLIENT_IMAGE" --format {{.ID}}) - echo "previous container id is $CONTAINER_ID" - if [ -z "$CONTAINER_ID" ]; then echo "沒有執行的容器";else sudo docker stop $CONTAINER_ID;sudo docker rm $CONTAINER_ID; fi # 把之前同名同版本的映象A刪除,否則A標籤會變為 <none> - EXIST_IMAGES=$(sudo docker images -f="dangling=true" -f "label=name=$CI_CLIENT_IMAGE" -f "label=version=$VERSION" --format {{.ID}}) - if [ -z "$EXIST_IMAGES" ]; then echo "沒有衝突映象";else sudo docker rmi $EXIST_IMAGES; fi # 獲取最新映象 - IMAGE_ID=$(sudo docker images -f="dangling=false" -f "label=name=$CI_CLIENT_IMAGE" -f "label=version=$VERSION" --format {{.ID}}) - echo "current image id is $IMAGE_ID" ### 重新構建映象,8181埠是伺服器的埠,8080埠是容器的埠,即專案中設定的埠(預設8080) - sudo docker run -d --name $CI_CLIENT_IMAGE --net=host $IMAGE_ID tags: - robot-shop-prod-tag
修改 sudo docker run 啟動這行即可,如下:
- sudo docker run -e TZ="Asia/Shanghai" -itd -v /usr/local/server/mall_server:/usr/local/app/logs:z --privileged=true --name $CI_CLIENT_IMAGE --net=host $IMAGE_ID
提交到Gitlab。
這裡說一下:
-e TZ="Asia/Shanghai" #指定伺服器時區,預設格林威治時間
-itd #後臺執行偽裝,不然輸出不了日誌檔案
-v /usr/local/server/mall_server:/usr/local/app/logs:z #將宿主機目錄掛載到容器內對應路徑,並容器共享路徑
--privileged=true #授權,讓容器獲取宿主機root許可權
Ok, 喜大普奔~
進到宿主機伺服器目錄就可以看到你的日誌了
cd /usr/local/server/mall_server