SpringCloud微服務部署方案
該文章需要一定的docker基礎才能看懂,不會的也可以先了解,萬一老闆讓你出個方案呢?
適用於中小規模的微服務,該文章基於Docker進行部署
1 整體思路
- 項目集成docker插件,用於上傳鏡像到私有倉庫
- Jenkins創建與服務數相等的構建流水線,負責編譯/打包/測試/上傳
- 對預先準備好的compose配置文件修改成本次部署所需的參數,手動執行命令,或使用Portainer等可視化頁面的方式進行操作(建議手動)
- 驗證部署結果
實際流程
1 首先對服務添加maven插件(該配置基於阿里雲私有鏡像倉庫,如你也使用該方法可以直接複製)
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<executions>
<execution>
<id>build-image</id>
<!-- 調用package時 觸發下面的操作-->
<phase>package</phase>
<goals>
<!-- 打包爲鏡像,需要Dockerfile,放入resource下即可-->
<goal>build</goal>
<!-- 推送到鏡像倉庫-->
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 鏡像名 地址 / 命名空間 / 倉庫 / 鏡像名 : 版本 -->
<imageName>registry.aliyuncs.com/namespace/鏡像名稱:標籤</imageName>
<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
<!-- 服務器上用專有網絡速度快 改成阿里雲的地址 -->
<registryUrl>registry-vpc.cn-beijing.aliyuncs.com</registryUrl>
<!-- 修改settings.xml配置阿里雲賬號密碼,服務器上的maven也需要 -->
<serverId>aliyun-register</serverId>
<imageTags>
<!--docker的tag爲項目版本號、latest-->
<imageTag>latest</imageTag>
</imageTags>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
2 配置jenkins
這裏我對jenkins鏡像做了一層包裝,將git,maven放入jenkins鏡像中,方便服務器遷移,如果宿主機已經安裝了git ,maven 則可以直接進行掛載也很方便
這裏稍微貼一下自定義jenkins的Dockerfile
FROM jenkins/jenkins:alpine
USER root
RUN echo http://mirrors.ustc.edu.cn/alpine/v3.10/main > /etc/apk/repositories && \
echo http://mirrors.ustc.edu.cn/alpine/v3.10/community >> /etc/apk/repositories
ADD apache-maven-3.6.3-bin.tar.gz /usr/local
RUN apk add git
RUN cd /usr/local && rm -rf *.gz
ENV MAVEN_HOME=/usr/local/apache-maven-3.6.3
ENV PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
ENTRYPOINT ["/sbin/tini","--","/usr/local/bin/jenkins.sh"]
這裏在簡單提一嘴必須掛載的內容
- settings.xml >>> 配置國內加速鏡像,倉庫位置,阿里雲私有鏡像賬號配置
- m2 >>> 防止每次都download到容器內部,刪除了容器就沒了
- docker.sock >>> 需要執行docker命令
- jenkinsHome
Jenkins需要配置jdk(jenkins鏡像自帶,因爲jenkins是java寫的),maven差價,git插件,以及settings.xml配置文件位置,最後構建maven風格的流水線即可,不需寫腳本等,從拉取最新代碼,到打包上傳,從頁面簡單配置即可,很簡單這裏不貼圖了(和打包SpringBoot應用一樣,只不過減少了後續的腳本調用)
到這裏就完成了鏡像上傳到了阿里雲私有鏡像倉庫的第一步操作
3 配置DockerSwarm
由於服務規模較小,沒有使用較爲流行的k8s,選擇了更加輕量級學習成本更低的swarm,這裏swarm用於對服務動態擴展和調度,配置的過程這裏不再闡述,比較簡單,這裏只講一些坑和使用方法
- 創建docker-compose.yml用來部署服務
- 通過docker stack deploy來調用配置
- 通過docker service scale動態控制服務副本數量
- 將master節點配置爲drain狀態就不會將服務調度到主節點
首先說一下遇到的坑,當執行命令時,會在work節點上pull配置文件中指定好的鏡像,如果是DockerHub中存在的鏡像則無問題,如果是私有鏡像,就算是登錄了也無法獲取
解決辦法:在stack deploy後添加–with-registry-auth即可
然後就是網絡的問題,默認會應用一個 ingress的overlay網絡,其實沒有特殊要求的話使用這個就足夠了,注意一下注冊到註冊中心的ip即可,如果是nacos記得指定網卡,否則可能會應用其他網卡的ip