IDEA 集成 Docker 插件實現一鍵遠程部署 SpringBoot 應用,無需三方依賴,開源微服務全棧有來商城線上部署方式

一. 前言

最近有些童鞋對開源微服務商城項目 youlai-mall 如何部署到線上環境以及項目中 的Dockerfile 文件有疑問,所以寫了這篇文章做個答疑以及演示完整的微服務項目發佈到線上的流程,當然除此之外也爲後續的項目更新計劃做一些基礎工作。

其實之前是寫了 關於 IDEA 整合Docker插件和 docker-maven-plugin 依賴構建鏡像實現一鍵部署 SpringBoot 應用。

Docker實戰 | 第三篇:IDEA集成 Docker 插件實現一鍵自動打包部署微服務項目

但是上篇文章的“ 一鍵部署”是有些誇大的,實踐過的童鞋應該清楚,在 IDEA 集成 Docker 和項目添加 docker-maven-plugin 依賴基礎上,部署SpringBoot 應用還需要經過 鏡像構建 → 容器配置 → 手動啓動容器 這些步驟,所以離一鍵部署相差甚遠。

本篇提供的方案中 IDEA 只需安裝 Docker 插件,項目不用添加 docker-maven-plugindockerfile-maven-plugin 依賴,且在完成首次的相關配置之後,後續只需點擊一下 IDEA 的 Run 按鈕 ▶️就可以將應用部署遠程服務器並且啓動,讓部署線上應用就是隨手點一下的事情。

二. Docker 配置

IDEA 需要連接 Docker 服務器來完成推送鏡像和一些交互,需要 Docker 開啓遠程監聽,如果是專網還好,但是公網下開啓監聽時一定要啓用 TLS 協議進行安全加密傳輸,否則被黑基本上是早晚的事情。

下面是輕身經歷得到的教訓總結,有想找點樂子的童鞋可以看一下:

Docker實戰 | 第五篇:Docker啓用TLS加密解決暴露2375端口引發的安全漏洞,被黑掉三臺雲主機的教訓總結

1. Docker 開啓遠程訪問

訪問 Docker 配置文件 docker.service

vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd 追加 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

重啓 Docker 讓配置生效

systemctl daemon-reload
systemctl restart docker

查看 Docker 遠程訪問服務是否開啓

# 查看服務端口監聽是否開啓
lsof -i:2375
# CURL測試是否生效
curl http://127.0.0.1:2375/info

2. Docker 啓用 TLS

傳輸層安全性協議(英語:Transport Layer Security,縮寫TLS),及其前身安全套接層(Secure Sockets Layer,縮寫作SSL)是一種安全協議,目的是爲互聯網通信提供安全及數據完整性保障。

  1. 設置主機名

    輸入命令 hostname 查看服務器主機名,如果存在則忽略,沒有則需設置主機名

    vim /etc/hostname
    

    修改配置之後重啓生效

  2. TLS 證書生成

    創建 TLS 證書存放目錄

    mkdir -p /etc/docker/cert
    

    創建 TLS 證書生成腳本

    vim /etc/docker/create_tls_cert.sh
    

    添加內容

    #!/bin/bash
    set -e
    if [ -z $1 ];then
            echo "請輸入 Docker 服務器主機名"
            exit 0
    fi
    HOST=$1
    # 生成證書的目錄 /etc/docker/cert
    cd /etc/docker/cert
    openssl genrsa -aes256 -out ca-key.pem 4096
    openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
    openssl genrsa -out server-key.pem 4096
    openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
    # 配置白名單,推薦配置0.0.0.0,允許所有IP連接但只有證書纔可以連接成功
    echo subjectAltName = DNS:$HOST,IP:0.0.0.0 > extfile.cnf
    openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
    openssl genrsa -out key.pem 4096
    openssl req -subj '/CN=client' -new -key key.pem -out client.csr
    echo extendedKeyUsage = clientAuth > extfile.cnf
    openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
    rm -v client.csr server.csr
    chmod -v 0400 ca-key.pem key.pem server-key.pem
    chmod -v 0444 ca.pem server-cert.pem cert.pem
    

    執行 create_tls_cert.sh 證書生成腳本

    # f.youlai.tech 爲 Docker 服務器主機名
    sh /etc/docker/create_tls_cert.sh f.youlai.tech
    

    紅色框部分需要設置證書密碼,可以爲了方便,填寫一致的就行。

    進入目錄 /etc/docker/cert 把本地需要的3個證書文件 ca.pem 、cert.pem、key.pem 下載到本地文件夾下 , 我的文件夾是 D:\項目資料\Docker證書\f.youlai.tech

    image-20210922002656358

  3. 配置 Docker 啓用 TLS監聽

    訪問 Docker 配置文件 docker.service

    vim /usr/lib/systemd/system/docker.service
    

    在 ExecStart=/usr/bin/dockerd 修改和追加內容如下

    ExecStart=/usr/bin/dockerd \
            --tlsverify --tlscacert=/etc/docker/cert/ca.pem \
            --tlscert=/etc/docker/cert/server-cert.pem \
            --tlskey=/etc/docker/cert/server-key.pem \
            -H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock
    

    重載配置和重啓 Docker 生效

    systemctl daemon-reload 
    systemctl restart docker
    

    查看監聽是否開啓

    lsof -i:2376
    

三. IDEA 配置

1. 安裝 Docker 插件

安裝後重啓 IDEA 讓插件生效

2. Docker 服務器連接配置

打開 FileSettingBuild,Execution,DeploymentDocker+

image-20210922010139527

  • Engine API URL : Docker 服務器遠程監聽地址
  • Certificates folder : 上文下載 Docker 的證書的文件件

四. SpringBoot 應用部署

1. Dockerfile 文件

在項目根目錄添加 Dockerfile 文件

image-20210922214712212

完整內容如下:

# 基礎鏡像
FROM openjdk:8-jre

# 維護者信息
MAINTAINER youlai <[email protected]>

# 設置容器時區爲當前時區
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone

# /tmp 目錄作爲容器數據卷目錄,SpringBoot內嵌Tomcat容器默認使用/tmp作爲工作目錄,任何向 /tmp 中寫入的信息不會記錄進容器存儲層
# 在宿主機的/var/lib/docker目錄下創建一個臨時文件並把它鏈接到容器中的/tmp目錄
VOLUME /tmp

# 複製主機文件至鏡像內,複製的目錄需放置在 Dockerfile 文件同級目錄下
ADD target/admin-boot.jar app.jar

# 容器啓動執行命令
ENTRYPOINT ["java", "-Xmx128m", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]

# 聲明容器提供服務端口
EXPOSE 8800

2. pom.xml文件

添加 spring-boot-maven-plugin 依賴爲SpringBoot 應用打包,指定 finalName 不帶版本號,這樣打包出的 jar 包名稱就沒有版本號。

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

3. Run/Debug Configurations 配置

Run/Debug Configurations 運行/調試 配置

image-20210922082012314

Dockerfile 配置

image-20210922083446011

添加執行目標 Maven Goal

image-20210922083520500

Command line 輸入 clean package -U -DskipTests

點擊 OK 保存配置,至此,已完成所有的配置,接下來就是一鍵部署。

4. SpringBoot應用一鍵構建部署

工具欄 Run/Debug 選擇上文的 Docker配置

點擊 ▶️開始執行

稍等一會兒,就可以看到啓動的容器

image-20210922230343185

Nacos 註冊中心可以看到youlai-admin服務在線

image-20210922232150804

五. 總結

本篇通過 IDEA 集成 Docker 插件和通過 Dockerfile的方式一鍵完成 SpringBoot應用的打包 → 構建鏡像 → 容器創建和啓動 的整套應用部署的流程,沒有第三方 maven 依賴,可以說非常的簡單便捷,再不會對頻繁的應用部署而感到頭疼。當然寫這篇文章的目的除了解釋開源微服務商城 youlai-mall 項目中的 Dockerfile 作用和有來商城微服務是如何部署到線上之外,還有就是爲後續的 ELK + Filebeat實現日誌收集和線上環境遠程調試等等做好基礎工作,具體的在後續文章說明。

附錄:

1. 開源項目

項目名稱 碼雲(Gitee) Github
微服務後臺 youlai-mall youlai-mall
系統管理前端 youlai-mall-admin youlai-mall-admin
微信小程序 youlai-mall-weapp youlai-mall-weapp

2. 聯繫信息

微信交流羣只能通過邀請方式進入,如果項目中遇到什麼問題或者想進入交流羣學習的朋友請添加開發人員後由其拉進羣,備註“有來”即可。

【有來小店】微信小程序體驗碼 進羣加我,我發邀請連接,備註“有來”即可
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章