絲滑的打包部署,一套帶走

官網:www.passjava.cn

你好,我是悟空。

本文主要內容如下:

目錄

一、背景

Docker 打包部署方案

項目背景:新項目的後端框架是剛起步,搭建的是一套微服務框架,基礎服務有網關 Gateway, Nacos 註冊中心,以及其他的微服務。現在需要弄個簡單且方便的,基於 Docker 的部署方式。

爲什麼用 Docker:爲了讓後端程序更容易打包部署和管理,所以用上了 Docker 容器化部署。比如用 Docker Swarm 或 K8s 來管理多個容器。

爲什麼要提到 Windows:本地機器是 Windows 系統開發,通過 Windows + IDEA 將應用程序打成 Docker 鏡像,然後拷貝到 Linux 服務器進行容器化部署。

二、Windows 運行 Docker

2.1 原理

爲了在 Windows 能夠打包 Docker 鏡像,就必須弄個可以運行 Docker 的環境。

Docker 依賴於已存在並運行的 Linux 內核環境。實質上是在已經運行的 Linux 下製造了一個隔離的文件環境,因此它執行的效率幾乎等同於所部署的 Linux 主機。

如果其他系統想部署 Docker 就必須安裝一個虛擬 Linux 環境。

2.2 啓用 Hyper-V

Windows + 虛擬機 + Docker

Windows 自帶的 Hyper-V 工具就是一款管理和創建虛擬機的工具,要求:Windows 10 企業版、專業版或教育版。啓用 Hyper-V 如下所示:

啓用 Hyper-V

操作步驟:程序和功能 -> 打開或關閉 Windows 功能 -> 選擇 “Hyper-V”,然後單擊 “確定

參考鏈接:

https://learn.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v

2.3 安裝 Docker for Windows

點擊 官網下載地址,並下載 Windows 的版本,安裝就是一路點擊 next 就好了。

官網下載地址:https://www.docker.com/products/docker-desktop/

安裝好之後,打開 Windows 的 Powershell 命令行窗口,執行 docker run hello-world。當看到 Hello from Docker!就表示安裝成功。

好了,現在我們開發環境擁有了運行 docker 容器,打包 docker 鏡像的能力。接下來我們來看下如何用 IDEA 開發工具來啓動 docker 容器和打包鏡像。

三、IDEA 打包鏡像

IDEA 工具很強大,提供 Docker 相關的功能。

IDEA 打包 Docker 鏡像的方式主要分爲這麼幾步:

這裏我寫了一個簡單 SpringBoot 項目,定義了一個簡單的 Rest API 接口。

應用程序的端口爲 9600。

server.port=9600

3.1 Maven Build JAR 包

Maven 打包的話這個我們都比較熟悉,直接執行 Maven 命令(mvn package)或者在 IDEA 上點擊 Maven 相關按鈕即可。就會生成這樣一個包

operation-core-0.0.1-SNAPSHOT,我們可以把它的名字改短一點,就改爲  operation.jar 吧

3.2 編寫 Dockerfile

Dockerfile 又是什麼呢?

它是一個用來構建鏡像的文本文件,文件內容就是一條條構建鏡像所需的指令和說明。

我們就到項目創建兩個 dockerfile 文件吧,一個用作開發環境的,一個用作生產環境的。

如下所示:

# 拉取指定的鏡像文件
FROM hub.c.163.com/library/java:latest

# MAINTAINER 指令允許你給將要製作的鏡像設置作者信息
MAINTAINER wukong <1@163.com>
# 容器內創建一個 apps 目錄,用來掛載 jar 包
RUN mkdir -p /apps
# 將 passjavas-demo-1.0 jar 包複製到 /apps/passjava-demo.jar
ADD passjava-demo-1.0.jar /apps/passjava-demo.jar
# 設置時區
ENV TZ "Asia/Shanghai"
# 設置暴露的端口
EXPOSE 9600
#dockerfile中增加健康檢查,interval表示每個5分鐘檢查一次,timeout每次超過5秒鐘認定爲失敗,retries失敗後輪詢3次認定爲容器不健康,考慮重啓。
#HEALTHCHECK --interval=60s --timeout=5s --retries=6 \
#  CMD curl -f http://localhost:8989/health || exit 1
# 運行 Java 應用程序的命令
ENTRYPOINT ["java","-jar","/apps/passjava-demo.jar"]

3.3 配置和執行 Dockerfile

在 IDEA 裏面創建一個 運行配置,添加一個 Dockerfile 配置,如下所示:

開始運行這個配置後,IDEA 就會根據 dockerfile 裏面的配置自動拉取 Java JDK 鏡像文件,這個過程會比較長,Java JDK 還是比較大的。

拉取之後,會一步步執行 dockerfile 裏面的命令,最後會啓動一個 docker 容器。

3.4 測試

我們來測試下 Java 程序是否正常運行。還是用 curl 命令訪問 Restful API。

curl http://localhost:9600/test

咦?居然訪問不通,這是爲啥??

我們來排查下。先看下容器日誌,執行命令 docker logs <容器 id>,可以看到 Java 應用程序正常啓動,也沒有報錯日誌。

那說明可能是網絡問題,比如容器的端口和我們本機的端口沒有映射。果不其然。這裏端口是否沒有映射的,如下圖所示。

那說明通過這種方式雖然能正常啓動程序,但是程序不能提供服務,那就換一種方式。上面的方式是通過 Dockerfile 創建了一個鏡像文件,然後 IDEA 工具幫我們啓動了一個 Docker 容器,但是這種容器還缺少一些參數,比如端口映射沒有做。要不我們就自己來啓動一個容器看看?自己啓動就是通過 docker run 命令即可,不過也可以通過創建一個 IDEA container 配置來啓動一個容器。

3.5 IDEA 自定義容器

如下圖所示,自定義一個容器跑配置。因爲上面的步驟我們已經創建了鏡像了,所以可以直接用這個鏡像即可。

話不多說,直接運行起來看下。

再來看下端口映射,這次就映射好了,完美!

再來測試下是否能訪問 API。還是用 curl 命令,返回結果如下,這次就成功了。

passjava,悟空聊架構

四、部署到服務器

4.1 部署思路

不過這都是在我們本地玩的,如何把它弄到服務器上呢??步驟如下:

如下圖,和文章最開始看到的圖相比,做了一些簡化,思路是一致的。

4.2 部署

先在本地把 docker 鏡像打成一個 tar 包。

docker save passjava-docker-demo-23.02 -o D:\passjava-demo.tar

然後把這個 tar 包拷貝到 Linux 服務器。

將鏡像拷貝到服務器

接着將 tar 加載爲 docker 鏡像

docker load -i passjava-demo.tar

passjava-demo 鏡像包

然後就可以通過命令來啓動容器了。命令裏面包含了掛載的目錄卷,端口映射,啓動方式等。

docker run --name passjava-demo -d \
-v /nfs-data/service:/nfs-data/service \
-v /nfs-data/service/apps:/apps \
-v /nfs-data/service/logs:/nfs-data/service/logs \
--restart=always \
-p 9600:9600 \
passjava-docker-demo-23.02

咦,啓動容器又報錯了,查看日誌提示找不到 jar 包。

啓動報錯,找不到 jar 包

哦,想起來了,掛載上面的 apps 目錄後,容器會從容器裏面的 apps 目錄找 JAR 包,發現沒有這個 jar 包,當然報錯了呀!

運行命令

而這個 apps 目錄正好是和宿主服務器的 /nfs-data/service/apps 目錄做了映射的,這個目錄沒有 jar 包,容器裏面的 apps 目錄也就沒有 jar 包。所以我們可以把 jar 包拷貝到這個目錄就好了。

等等,爲什麼用 IDEA 啓動容器時沒有問題?因爲當時沒有 IDEA 做目錄的映射。

啓動完成後,我們來測試下部署的服務是否正常。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/MSS5KfnNLjBeVlc_9JnB_g