絲滑的打包部署,一套帶走
你好,我是悟空。
本文主要內容如下:
目錄
一、背景
Docker打包部署方案
項目背景:新項目的后端框架是剛起步,搭建的是一套微服務框架,基礎服務有網(wǎng)關 Gateway, Nacos 注冊中心,以及其他的微服務。現(xiàn)在需要弄個簡單且方便的,基于 Docker 的部署方式。
為什么用 Docker:為了讓后端程序更容易打包部署和管理,所以用上了 Docker 容器化部署。比如用 Docker Swarm 或 K8s 來管理多個容器。
為什么要提到 Windows:本地機器是 Windows 系統(tǒng)開發(fā),通過 Windows + IDEA 將應用程序打成 Docker 鏡像,然后拷貝到 Linux 服務器進行容器化部署。
- 疑問1:有同學可能會有疑問,Windows 還能跑 Docker 嗎???那必須的!
- 疑問2:如果項目的代碼改了,是不是得重新打包 docker 鏡像?不需要,直接替換 docker volume 里面的 JAR 包即可。
- 疑問3:怎么沒有用 Jenkins?新項目,新項目,牛奶和面包都會有的。
二、Windows 運行 Docker
2.1 原理
為了在 Windows 能夠打包 Docker 鏡像,就必須弄個可以運行 Docker 的環(huán)境。
Docker 依賴于已存在并運行的 Linux 內核環(huán)境。實質上是在已經(jīng)運行的 Linux 下制造了一個隔離的文件環(huán)境,因此它執(zhí)行的效率幾乎等同于所部署的 Linux 主機。
如果其他系統(tǒng)想部署 Docker 就必須安裝一個虛擬 Linux 環(huán)境。
2.2 啟用 Hyper-V
Windows+虛擬機+Docker
Windows 自帶的 Hyper-V 工具就是一款管理和創(chuàng)建虛擬機的工具,要求:Windows 10 企業(yè)版、專業(yè)版或教育版。啟用 Hyper-V 如下所示:
啟用 Hyper-V
操作步驟:程序和功能->打開或關閉 Windows 功能->選擇“Hyper-V”,然后單擊“確定
參考鏈接:
2.3 安裝 Docker for Windows
點擊 官網(wǎng)下載地址,并下載 Windows 的版本,安裝就是一路點擊 next 就好了。
安裝好之后,打開 Windows 的Powershell 命令行窗口,執(zhí)行 docker run hello-world。當看到 Hello from Docker!就表示安裝成功。
好了,現(xiàn)在我們開發(fā)環(huán)境擁有了運行 docker 容器,打包 docker 鏡像的能力。接下來我們來看下如何用 IDEA 開發(fā)工具來啟動 docker 容器和打包鏡像。
三、IDEA 打包鏡像
IDEA 工具很強大,提供 Docker 相關的功能。
IDEA 打包 Docker 鏡像的方式主要分為這么幾步:
- 通過 Maven 工具將 SpringBoot 應用程序打成可執(zhí)行的 JAR 包。
- IDEA 執(zhí)行指定的 Dockerfile 打包成 Docker 鏡像。
這里我寫了一個簡單 SpringBoot 項目,定義了一個簡單的 Rest API 接口。
應用程序的端口為 9600。
3.1 Maven Build JAR 包
Maven 打包的話這個我們都比較熟悉,直接執(zhí)行 Maven 命令(mvn package)或者在 IDEA 上點擊 Maven 相關按鈕即可。就會生成這樣一個包
operation-core-0.0.1-SNAPSHOT,我們可以把它的名字改短一點,就改為 operation.jar 吧
3.2 編寫 Dockerfile
Dockerfile 又是什么呢?
它是一個用來構建鏡像的文本文件,文件內容就是一條條構建鏡像所需的指令和說明。
我們就到項目創(chuàng)建兩個 dockerfile 文件吧,一個用作開發(fā)環(huán)境的,一個用作生產(chǎn)環(huán)境的。
如下所示:
3.3 配置和執(zhí)行 Dockerfile
在 IDEA 里面創(chuàng)建一個 運行配置,添加一個 Dockerfile 配置,如下所示:
開始運行這個配置后,IDEA 就會根據(jù) dockerfile 里面的配置自動拉取 Java JDK 鏡像文件,這個過程會比較長,Java JDK 還是比較大的。
拉取之后,會一步步執(zhí)行 dockerfile 里面的命令,最后會啟動一個 docker 容器。
3.4 測試
我們來測試下 Java 程序是否正常運行。還是用 curl 命令訪問 Restful API。
咦?居然訪問不通,這是為啥??
我們來排查下。先看下容器日志,執(zhí)行命令 docker logs <容器id>,可以看到 Java 應用程序正常啟動,也沒有報錯日志。
那說明可能是網(wǎng)絡問題,比如容器的端口和我們本機的端口沒有映射。果不其然。這里端口是否沒有映射的,如下圖所示。
那說明通過這種方式雖然能正常啟動程序,但是程序不能提供服務,那就換一種方式。上面的方式是通過 Dockerfile 創(chuàng)建了一個鏡像文件,然后 IDEA 工具幫我們啟動了一個 Docker 容器,但是這種容器還缺少一些參數(shù),比如端口映射沒有做。要不我們就自己來啟動一個容器看看?自己啟動就是通過 docker run 命令即可,不過也可以通過創(chuàng)建一個 IDEA container 配置來啟動一個容器。
3.5 IDEA 自定義容器
如下圖所示,自定義一個容器跑配置。因為上面的步驟我們已經(jīng)創(chuàng)建了鏡像了,所以可以直接用這個鏡像即可。
話不多說,直接運行起來看下。
再來看下端口映射,這次就映射好了,完美!
再來測試下是否能訪問 API。還是用 curl 命令,返回結果如下,這次就成功了。
四、部署到服務器
4.1 部署思路
不過這都是在我們本地玩的,如何把它弄到服務器上呢??步驟如下:
- 把鏡像保存為一個壓縮包,上傳到服務器,服務器上用命令啟動容器。
- 如果有代碼修改,把項目重新打成 JAR 包上傳到掛載的目錄就可以了。
如下圖,和文章最開始看到的圖相比,做了一些簡化,思路是一致的。
4.2 部署
先在本地把 docker 鏡像打成一個 tar 包。
然后把這個 tar 包拷貝到 Linux 服務器。
將鏡像拷貝到服務器
接著將 tar 加載為 docker 鏡像
passjava-demo鏡像包
然后就可以通過命令來啟動容器了。命令里面包含了掛載的目錄卷,端口映射,啟動方式等。
咦,啟動容器又報錯了,查看日志提示找不到 jar 包。
啟動報錯,找不到 jar 包
哦,想起來了,掛載上面的 apps 目錄后,容器會從容器里面的 apps 目錄找 JAR 包,發(fā)現(xiàn)沒有這個 jar 包,當然報錯了呀!
運行命令
而這個 apps 目錄正好是和宿主服務器的 /nfs-data/service/apps 目錄做了映射的,這個目錄沒有 jar 包,容器里面的 apps 目錄也就沒有 jar 包。所以我們可以把 jar 包拷貝到這個目錄就好了。
等等,為什么用 IDEA 啟動容器時沒有問題?因為當時沒有 IDEA 做目錄的映射。
啟動完成后,我們來測試下部署的服務是否正常。
- END -
關于我
InfoQ 簽約作者、藍橋簽約作者、阿里云專家博主、51CTO 紅人。