Docker也瘋狂,微服務(wù)一鍵打包部署

微服務(wù)Docker打包

現(xiàn)在的微服務(wù)時(shí)代,你的代碼沒(méi)個(gè)微服務(wù)、分布式人家都會(huì)覺(jué)得低端,當(dāng)然!對(duì)于我們開(kāi)發(fā)人員來(lái)說(shuō),掌握這些技術(shù)意味著漲薪。

    我們項(xiàng)目中用到了多個(gè)微服務(wù),我們上一節(jié)課程打包用的是手動(dòng)上傳,但是很麻煩,有沒(méi)有更好的方式呢,是有的,我們可以直接通過(guò)idea將我們的微服務(wù)打包成Docker鏡像,并推送到Docker倉(cāng)庫(kù)中

    這里我們采用[jib-maven-plugin](https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin) 來(lái)進(jìn)行來(lái)構(gòu)建容器化的spring boot應(yīng)用程序,Jib可以讓不寫(xiě)Dockerfile就能實(shí)現(xiàn)Docker打包

什么是Jib

Jib 是 Google 開(kāi)發(fā)的可以直接構(gòu)建 Java 應(yīng)用的 Docker 和 OCI 鏡像的類(lèi)庫(kù),以 Maven 和 Gradle 插件形式提供。

    Jib帶來(lái)的是,它允許您通過(guò)簡(jiǎn)單地將插件添加到您選擇的構(gòu)建工具(Maven或Gradle)來(lái)創(chuàng)建容器,沒(méi)有額外的文件,只需幾行配置,它處理將應(yīng)用程序打包到容器映像的所有步驟。

    Jib是來(lái)自Google的開(kāi)源Java容器,它允許Java開(kāi)發(fā)人員使用他們所知道的Java工具構(gòu)建容器,它不需要您編寫(xiě)Dockerfile或安裝了docker,它直接集成到[Maven](https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin)和[Gradle中](https://github.com/GoogleContainerTools/jib/tree/master/jib-gradle-plugin)。

和傳統(tǒng)的插件區(qū)別

Docker 構(gòu)建流程

在“傳統(tǒng)”Java到Docker映像構(gòu)建流程中,我們需要安裝Dockerfile和docker守護(hù)進(jìn)程,在Jib構(gòu)建流程中,您只需要插件項(xiàng)目的構(gòu)建文件。

file
Jib構(gòu)建流程
通過(guò) Jib,Java 開(kāi)發(fā)者可以使用他們熟悉的 Java 工具來(lái)構(gòu)建容器。Jib 是一個(gè)快速而簡(jiǎn)單的容器鏡像構(gòu)建工具,它負(fù)責(zé)處理將應(yīng)用程序打包到容器鏡像中所需的所有步驟。它不需要你編寫(xiě) Dockerfile 或安裝 Docker,而且可以直接集成到 Maven 和 Gradle中 —— 只需要將插件添加到構(gòu)建中,就可以立即將 Java 應(yīng)用程序容器化。
file

準(zhǔn)備工作

設(shè)置Horbor用戶(hù)權(quán)限

我們要將idea的微服務(wù)推送到Harbor,并且用itcast的用戶(hù),所有我們要設(shè)置我們的itcast用戶(hù)是開(kāi)發(fā)者

file

pom文件配置jib

對(duì)于應(yīng)用程序的基本本地存儲(chǔ)鏡像,請(qǐng)?jiān)趐om.xml以下內(nèi)容中配置jib-maven-plugin

公共屬性配置

在properties中配置harbor的共有配置

<properties>
    <!--harbor 倉(cāng)庫(kù)地址-->
    <docker.registry.url>itcastharbor.com</docker.registry.url>
    <!--harbor 的項(xiàng)目名稱(chēng)-->
    <docker.registry.name>library</docker.registry.name>
    <!--harbor賬號(hào)-->
    <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節(jié)點(diǎn)用來(lái)設(shè)置鏡像的基礎(chǔ)鏡像,相當(dāng)于Docerkfile中的FROM關(guān)鍵字-->
                <from>
                    <!--使用openjdk官方鏡像,tag是:8-jdk-alpine,表示鏡像的操作系統(tǒng)是alpine,裝好了jdk8-->
                    <image>openjdk:8-jdk-alpine</image>
                </from>
                <to>
                    <!--鏡像名稱(chēng)和tag,使用了mvn內(nèi)置變量${project.version},表示當(dāng)前工程的version-->
                    <image>${docker.registry.url}/${docker.registry.name}/${project.artifactId}:${project.version}
                    </image>
                    <tags>
                        <!--版本號(hào)-->
                        <tag>${project.version}</tag>
                    </tags>
                    <!--harbor的認(rèn)證信息-->
                    <auth>
                        <username>${docker.registry.username}</username>
                        <password>${docker.registry.password}</password>
                    </auth>
                </to>
                <!--容器相關(guān)的屬性-->
                <container>

                    <jvmFlags>
                        <!--一些啟動(dòng)參數(shù)-->
                        <jvmFlag>-Djava.security.edg=file:/dev/./urandom</jvmFlag>
                    </jvmFlags>
                    <!--掛載volume的配置-->
                    <volumes>
                        <volume>/tmp</volume>
                        <volume>/logs</volume>
                    </volumes>
                    <ports>
                        <!--暴漏端口號(hào)-->
                        <port>8080</port>
                    </ports>
                    <!--微服務(wù)的啟動(dòng)類(lèi)-->
                    <mainClass>com.heima.test.Application</mainClass>
                    <format>OCI</format>
                    <!--使用該參數(shù)將鏡像的創(chuàng)建時(shí)間與系統(tǒng)時(shí)間對(duì)其-->
                    <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
                </container>
            </configuration>
            <executions>
                <!--執(zhí)行打包配置-->
                <execution>
                    <id>jib-maven-plugin</id>
                    <phase>package</phase>
                    <goals>
                        <goal>build</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!-- Docker maven plugin -->
    </plugins>
</build>

執(zhí)行構(gòu)建

然后在項(xiàng)目根目錄執(zhí)行mvn clean compile jib:build就可以了

file

我們看到已經(jīng)推送成功了

harbor倉(cāng)庫(kù)中查看

通過(guò)域名訪(fǎng)問(wèn)harbor,我們看我們的library里面的鏡像倉(cāng)庫(kù)

file

點(diǎn)進(jìn)去就可以看到我們剛剛推送的鏡像

file

以及鏡像的詳細(xì)信息

file

其他的微服務(wù)上傳

微服務(wù)打包

這里我們也將其他微服務(wù)上傳到倉(cāng)庫(kù),步驟同上

file
倉(cāng)庫(kù)中查看鏡像

在我們的倉(cāng)庫(kù)中查看鏡像,我們看到鏡像都已經(jīng)上傳到倉(cāng)庫(kù)中了

file

harbor 測(cè)試

刪除本地鏡像

可以通過(guò)docker rmi 鏡像ID刪除本地鏡像

docker rm -f learn-docker-storage
docker rmi  192.168.64.153/library/learn-docker-storage:0.0.3
file
運(yùn)行harbor 中的鏡像

我們把我們的所有微服務(wù)都上傳到了倉(cāng)庫(kù)中,我們以一個(gè)完整的項(xiàng)目運(yùn)行docker

file
運(yùn)行l(wèi)earn-docker-storage服務(wù)

執(zhí)行運(yùn)行命令

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

因?yàn)槲覀兪腔趦?nèi)部網(wǎng)絡(luò)訪(fǎng)問(wèn) 不需要暴漏接口了

file

訪(fǎng)問(wèn)微服務(wù)測(cè)試

curl http://192.168.64.152:8080/userinfo/10001 | python -m json.tool
file
運(yùn)行l(wèi)earn-docker-web服務(wù)

執(zhí)行運(yùn)行命令

docker run -d \
--name learn-docker-web \
--network=learn-docker-network \
manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-web:1.0-SNAPSHOT

該微服務(wù)也是內(nèi)部服務(wù)不需要暴漏端口,并且沒(méi)有配置日志輸出所有不掛載日志路徑

file
運(yùn)行l(wèi)earn-docker-gateway服務(wù)

執(zhí)行運(yùn)行命令

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

因?yàn)榫W(wǎng)關(guān)對(duì)外需要暴漏端口,所有需要開(kāi)放8888端口

file

查看nacos注冊(cè)的微服務(wù)

我們發(fā)現(xiàn)我們的三個(gè)服務(wù)都已經(jīng)注冊(cè)進(jìn)去了

file
訪(fǎng)問(wèn)測(cè)試微服務(wù)

因?yàn)槲覀兇鎯?chǔ)服務(wù)的8003端口沒(méi)有暴漏出來(lái),無(wú)法訪(fǎng)問(wèn),我們需要通過(guò)網(wǎng)關(guān)進(jìn)行訪(fǎng)問(wèn)

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

本文由育博學(xué)谷狂野架構(gòu)師發(fā)布
如果本文對(duì)您有幫助,歡迎關(guān)注和點(diǎn)贊;如果您有任何建議也可留言評(píng)論或私信,您的支持是我堅(jiān)持創(chuàng)作的動(dòng)力
轉(zhuǎn)載請(qǐng)注明出處!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容