天天看點

Docker 一鍵打包微服務

Docker 一鍵打包微服務
現在的微服務時代,你的代碼沒個微服務、分布式人家都會覺得低端,當然!對于我們開發人員來說,掌握這些技術意味着漲薪。

我們項目中用到了多個微服務,我們上一節課程打包用的是手動上傳,但是很麻煩,有沒有更好的方式呢,是有的,我們可以直接通過idea将我們的微服務打包成Docker鏡像,并推送到Docker倉庫中

這裡我們采用jib-maven-plugin 來進行來建構容器化的spring boot應用程式,Jib可以讓不寫Dockerfile就能實作Docker打包

什麼是Jib

Jib 是 Google 開發的可以直接建構 Java 應用的 Docker 和 OCI 鏡像的類庫,以 Maven 和 Gradle 插件形式提供。

Jib帶來的是,它允許您通過簡單地将插件添加到您選擇的建構工具(Maven或Gradle)來建立容器,沒有額外的檔案,隻需幾行配置,它處理将應用程式打包到容器映像的所有步驟。

Jib是來自Google的開源Java容器,它允許Java開發人員使用他們所知道的Java工具建構容器,它不需要您編寫Dockerfile或安裝了docker,它直接內建到Maven和Gradle中。

和傳統的插件差別

Docker 建構流程
在“傳統”Java到Docker映像建構流程中,我們需要安裝Dockerfile和docker守護程序,在Jib建構流程中,您隻需要插件項目的建構檔案。
Docker 一鍵打包微服務
Jib建構流程

通過 Jib,Java 開發者可以使用他們熟悉的 Java 工具來建構容器。Jib 是一個快速而簡單的容器鏡像建構工具,它負責處理将應用程式打包到容器鏡像中所需的所有步驟。它不需要你編寫 Dockerfile 或安裝 Docker,而且可以直接內建到 Maven 和 Gradle中 —— 隻需要将插件添加到建構中,就可以立即将 Java 應用程式容器化。

準備工作

設定Horbor使用者權限
我們要将idea的微服務推送到Harbor,并且用

itcast

的使用者,所有我們要設定我們的

itcast

使用者是開發者
Docker 一鍵打包微服務

pom檔案配置jib

對于應用程式的基本本地存儲鏡像,請在pom.xml以下内容中配置jib-maven-plugin
公共屬性配置
在properties中配置

harbor

的共有配置
 <properties>
     <!--harbor 倉庫位址-->
     <docker.registry.url>itcastharbor.com</docker.registry.url>
     <!--harbor 的項目名稱-->
     <docker.registry.name>library</docker.registry.name>
     <!--harbor賬号-->
     <docker.registry.username>itcast</docker.registry.username>
     <!--harbor密碼-->
     <docker.registry.password>Qwert123</docker.registry.password>
 </properties>
           
編譯配置插件配置
 <build>
     <resources>
         <resource>
             <directory>src/main/java</directory>
             <includes>
                 <include>**/*.xml</include>
             </includes>
         </resource>
         <resource>
             <directory>src/main/resources</directory>
             <filtering>true</filtering>
         </resource>
     </resources>
     <plugins>
 ​
         <plugin>
             <groupId>com.google.cloud.tools</groupId>
             <artifactId>jib-maven-plugin</artifactId>
             <version>2.8.0</version>
             <configuration>
                 <allowInsecureRegistries>true</allowInsecureRegistries>
                 <!--from節點用來設定鏡像的基礎鏡像,相當于Docerkfile中的FROM關鍵字-->
                 <from>
                     <!--使用openjdk官方鏡像,tag是:8-jdk-alpine,表示鏡像的作業系統是alpine,裝好了jdk8-->
                     <image>openjdk:8-jdk-alpine</image>
                 </from>
                 <to>
                     <!--鏡像名稱和tag,使用了mvn内置變量${project.version},表示目前工程的version-->
                     <image>${docker.registry.url}/${docker.registry.name}/${project.artifactId}:${project.version}
                     </image>
                     <tags>
                         <!--版本号-->
                         <tag>${project.version}</tag>
                     </tags>
                     <!--harbor的認證資訊-->
                     <auth>
                         <username>${docker.registry.username}</username>
                         <password>${docker.registry.password}</password>
                     </auth>
                 </to>
                 <!--容器相關的屬性-->
                 <container>
 ​
                     <jvmFlags>
                         <!--一些啟動參數-->
                         <jvmFlag>-Djava.security.edg=file:/dev/./urandom</jvmFlag>
                     </jvmFlags>
                     <!--挂載volume的配置-->
                     <volumes>
                         <volume>/tmp</volume>
                         <volume>/logs</volume>
                     </volumes>
                     <ports>
                         <!--暴漏端口号-->
                         <port>8080</port>
                     </ports>
                     <!--微服務的啟動類-->
                     <mainClass>com.heima.test.Application</mainClass>
                     <format>OCI</format>
                     <!--使用該參數将鏡像的建立時間與系統時間對其-->
                     <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
                 </container>
             </configuration>
             <executions>
                 <!--執行打包配置-->
                 <execution>
                     <id>jib-maven-plugin</id>
                     <phase>package</phase>
                     <goals>
                         <goal>build</goal>
                     </goals>
                 </execution>
             </executions>
         </plugin>
         <!-- Docker maven plugin -->
     </plugins>
 </build>
           

執行建構

然後在項目根目錄執行

mvn clean compile jib:build

就可以了
Docker 一鍵打包微服務
我們看到已經推送成功了

harbor倉庫中檢視

通過域名通路harbor,我們看我們的

library

裡面的鏡像倉庫
Docker 一鍵打包微服務
點進去就可以看到我們剛剛推送的鏡像
Docker 一鍵打包微服務
以及鏡像的詳細資訊
Docker 一鍵打包微服務

其他的微服務上傳

微服務打包
這裡我們也将其他微服務上傳到倉庫,步驟同上
Docker 一鍵打包微服務
倉庫中檢視鏡像
在我們的倉庫中檢視鏡像,我們看到鏡像都已經上傳到倉庫中了
Docker 一鍵打包微服務

harbor 測試

删除本地鏡像
可以通過

docker rmi 鏡像ID

删除本地鏡像
 docker rm -f learn-docker-storage
 docker rmi  192.168.64.153/library/learn-docker-storage:0.0.3
           
Docker 一鍵打包微服務
運作harbor 中的鏡像
我們把我們的所有微服務都上傳到了倉庫中,我們以一個完整的項目運作docker
Docker 一鍵打包微服務

運作learn-docker-storage服務

執行運作指令
 docker run -d \
 -v /tmp/data/logs:/logs \
 --name learn-docker-storage \
 --network=learn-docker-network \
 manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-storage:1.0-SNAPSHOT
           
因為我們是基于内部網絡通路 不需要暴漏接口了
Docker 一鍵打包微服務
通路微服務測試
 curl http://192.168.64.152:8080/userinfo/10001 | python -m json.tool
           
Docker 一鍵打包微服務

運作learn-docker-web服務

執行運作指令
 docker run -d \
 --name learn-docker-web \
 --network=learn-docker-network \
 manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-web:1.0-SNAPSHOT
           
該微服務也是内部服務不需要暴漏端口,并且沒有配置日志輸出所有不挂載日志路徑
Docker 一鍵打包微服務

運作learn-docker-gateway服務

執行運作指令
 docker run -d \
 -p 8888:8888 \
 --name learn-docker-gateway \
 --network=learn-docker-network \
 manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-gateway:1.0-SNAPSHOT
           
因為網關對外需要暴漏端口,所有需要開放

8888

端口
Docker 一鍵打包微服務

檢視nacos注冊的微服務

我們發現我們的三個服務都已經注冊進去了

通路測試微服務

 curl http://192.168.64.153:8888/employeapi/find/10001| python -m json.tool