Docker Desktop配合WSL和IDEA進行Java服務的打包+鏡像構建+容器運行測試

  在Windows10 22H2+的版本可以使用WSL了(Windows Subsystem for Linux 或叫 Windows Support Linux,即Windows內置的Linux子系統)!它對於在Windows下工作的容器化微服務開發人員是非常有用的!有了它你就可以直接在Windows本地構建Linux平臺的鏡像並運行容器進行測試(當然WSL還得配合Docker Desktop來使用)。關於WSL的說明見微軟官網(https://learn.microsoft.com/zh-cn/windows/wsl/),關於Docker Desktop的說明見Docker官網(https://docs.docker.com/desktop/install/windows-install/),這裏假設你都已經安裝好了這兩個東東!

  首先,我們先來配置一下Docker Desktop裏的Docker Engine:

  國內加速的公有鏡像庫地址如下(私有的是我自己本地的):

  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://registry.aliyuncs.com",
    "https://registry.docker-cn.com"
  ]

  修改好後,點右下角的 【Apply & restart】,等左下角的【鯨魚託集裝箱】狀態欄重新變成綠色就好了!

  接着我們用IDEA準備一個HelloWorld級別的Web後端應用(確保應用運行正常),並用Maven打包一下,然在該應用工程根目錄下創建好一個Dockerfile文件:

  以下是完整的Dockerfile文件內容:

#指明製作當前鏡像將基於的基礎鏡像
FROM master1:80/library/alpinejdk:1.8.0_201
#指定所製作鏡像的維護者和聯繫方式
MAINTAINER xurm "[email protected]"
#定義鏡像構建過程中的臨時變量(build命令完成後該變量會刪除,所以不能直接用於鏡像構建後執行的命令裏,比如容器啓動和運行階段的命令)
#可在構建鏡像時用-build-arg傳入覆蓋(例 docker build --build-arg app_name_arg="myapp" -t master1:80/library/helloworld:0.1)
ARG app_name_arg="apps"
ARG java_opts_arg="-server -Xms512m -Xmx512m"
#定義環境變量(變量會永久保存在鏡像裏,還會從FROM的基礎鏡像繼承其他環境變量)
ENV APP_NAME=$app_name_arg
ENV JAVA_OPTS=$java_opts_arg
#指定啓動當前鏡像的容器時分配給容器的存儲卷(一般用於存儲容器啓動後工作過程中產生的需要持久保存的數據,不隨容器退出而丟失,比如日誌)
VOLUME /data
#指定容器運行時的默認工作目錄(沒有會自動創建),不指定則會使用FROM基礎鏡像指定的默認工作目錄
WORKDIR /data/$APP_NAME
#設置時區(和普通操作系統一樣需要對齊服務器時區,跑在上面的應用拿到的時間纔不會亂)
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
#從鏡像構建上下文目錄裏添加需要的文件到容器鏡像的指定目錄,添加分ADD和COPY兩種,ADD會複製並解壓,
#(這裏添加的文件將影響鏡像的大小,多文件COPY目的目錄要以/結尾)第一個是jar包的原始名,第二個是重命令(這對自動化部署腳本的編寫有用)
ADD target/*.jar /opt/$APP_NAME/app.jar
#容器將暴露的端口
EXPOSE 8080
#指定容器啓動時需要執行的命令
ENTRYPOINT java $JAVA_OPTS -Dfile.encoding=UTF-8 -jar /opt/$APP_NAME/app.jar

  確保Docker Desktop運行正常的情況下(主界面左下角的【鯨魚託集裝箱】狀態欄成綠色),啓動Windows的WSL子系統,例如我的是Oracle Linux 7.9(就像一個普通的Windows應用一樣在啓動菜單裏),啓動後如下圖所示:

  在WSL子系統裏,你可以像在對應版本的Linux一樣上執命令!這裏重點講一下WSL子系統的文件系統和Windows文件系統目錄打通的地方:那就是WSL子系統將所宿主Windows系統的盤符目錄,全部以小寫字符的形式掛到了 /mnt 目錄下(這樣我們就可以直接在WSL和Windows系統的目錄之間相互切換了):

  因此,我們可以在WSL上利用Docker直接使用工程目錄下的Dockerfile文件和Maven Package打出來的jar包進行鏡像構建,運行和維護等操作,就像在Linux上一樣:

  主要用到的命令如下:

#構建鏡像(對應Dockerfile裏傳了一個參數app_name_arg,最後的點 . 不要漏了!)
docker build --build-arg app_name_arg="myhelloworld" -t master1:80/library/helloworld:0.0.1 .

#使用新構建的鏡像以守護進程模式(-d)啓動容器,(-p)綁定宿主機80端口,映射容器內8080端口
docker run -d -p 80:8080 master1:80/library/helloworld:0.0.1

  此時我們轉到Docker Desktop上也能看到鏡像和容器,並且容器處於運行狀態,還提供了容器訪問入口和其他控制操作入口:

  我們直接點訪問入口:

  以上就是全部內容!

  最後提一點,其實IDEA很早就直接集成了Docker的相關操作,只是少了直接在Window本地運行Linux環境來檢驗鏡像包的能力,見下截圖(詳細用法就自己去找資料了):

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章