使用Maven打包構(gòu)建Docker鏡像并推送到倉(cāng)庫(kù)
對(duì)于開(kāi)發(fā)完成的服務(wù)要發(fā)布至服務(wù)器Docker時(shí),我剛學(xué)習(xí)了解Docker時(shí)構(gòu)建鏡像方式是將我的本地服務(wù)先通過(guò)maven打包稱為jar包,然后再上傳至我的服務(wù)器上,通過(guò)Dockerfile將其構(gòu)建成為鏡像。
后來(lái)才了解了直接通過(guò)maven命令直接打包構(gòu)建的方式,以下是完成這一操作的步驟。
一,服務(wù)器Docker配置
修改daemon.json文件,開(kāi)放端口2375
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
我的文件如下所示:
{
? ?? ?"insecure-registries":["10.xx.xx.xx:5000"],
?? ?"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
{
"graph":"/Data/docker"
}二,本地項(xiàng)目maven配置
2.1 pom.xml
在項(xiàng)目的pom文件引入docker-maven-plugin插件
<plugin>
? ? ? ? ? ? ? ? <!-- https://mvnrepository.com/artifact/com.spotify/docker-maven-plugin -->
? ? ? ? ? ? ? ? <groupId>com.spotify</groupId>
? ? ? ? ? ? ? ? <artifactId>docker-maven-plugin</artifactId>
? ? ? ? ? ? ? ? <version>1.2.2</version>
? ? ? ? ? ? ? ? <executions>
? ? ? ? ? ? ? ? ? ? <!-- 當(dāng)mvn執(zhí)行install操作的時(shí)候,執(zhí)行docker的build和push -->
? ? ? ? ? ? ? ? ? ? <execution>
? ? ? ? ? ? ? ? ? ? ? ? <id>build</id>
? ? ? ? ? ? ? ? ? ? ? ? <phase>install</phase>
? ? ? ? ? ? ? ? ? ? ? ? <goals>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <goal>build</goal>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <!-- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<goal>push</goal>-->
? ? ? ? ? ? ? ? ? ? ? ? </goals>
? ? ? ? ? ? ? ? ? ? </execution>
? ? ? ? ? ? ? ? </executions>
? ? ? ? ? ? ? ? <configuration>
? ? ? ? ? ? ? ? ? ? <!-- 連接到 帶docker環(huán)境的linux服務(wù)器 編譯image -->
? ? ? ? ? ? ? ? ? ? <dockerHost>http://10.xx.xx.xx:2375</dockerHost>
? ? ? ? ? ? ? ? ? ? <!--格式:私有倉(cāng)庫(kù)/鏡像名稱:版本號(hào), 如果要執(zhí)行push操作, 那么鏡像名稱必須為私有倉(cāng)庫(kù)為前綴,不然無(wú)效。-->
? ? ? ? ? ? ? ? ? ? <imageName>10.xx.xx.xx:5000/${project.artifactId}:${docker.tag}</imageName>
? ? ? ? ? ? ? ? ? ? <!--指定dockerfile文件路徑-->
? ? ? ? ? ? ? ? ? ? <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
? ? ? ? ? ? ? ? ? ? <!-- 指定jar包路徑,這里對(duì)應(yīng)Dockerfile中復(fù)制 jar 包到 docker 容器指定目錄配置,也可以寫(xiě)到 Docokerfile 中 -->
? ? ? ? ? ? ? ? ? ? <resources>
? ? ? ? ? ? ? ? ? ? ? ? <resource>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <targetPath>/</targetPath>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <directory>${project.build.directory}</directory>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <include>${project.build.finalName}.jar</include>
? ? ? ? ? ? ? ? ? ? ? ? </resource>
? ? ? ? ? ? ? ? ? ? </resources>
? ? ? ? ? ? ? ? ? ? <!--跳過(guò)測(cè)試-->
? ? ? ? ? ? ? ? ? ? <!-- push到 docker hub 開(kāi)始 -->
? ? ? ? ? ? ? ? ? ? <!-- serverId 這個(gè)是配置在maven的setting.xml中私服的登錄賬戶信息-->
? ? ? ? ? ? ? ? ? ? <!-- ? ? ? ? ? ? ? ? ? ?<serverId>docker-hub</serverId>-->
? ? ? ? ? ? ? ? ? ? <retryPushCount>3</retryPushCount>
? ? ? ? ? ? ? ? ? ? <retryPushTimeout>2000</retryPushTimeout>
? ? ? ? ? ? ? ? ? ? <registryUrl>10.xx.xx.xx:5000</registryUrl>
? ? ? ? ? ? ? ? ? ? <!-- 是否自動(dòng)推送到Registry Server, 建議手動(dòng)推送 -->
? ? ? ? ? ? ? ? ? ? <pushImage>${docker.push}</pushImage>
? ? ? ? ? ? ? ? ? ? <!-- push到 docker hub 結(jié)束 -->
? ? ? ? ? ? ? ? </configuration>
? ? ? ? ? ? </plugin>重要配置解釋:
dockerHost:docker所在服務(wù)器的ip和開(kāi)放的端口imageName:最終構(gòu)建的鏡像名稱dockerDirectory:本地dockerfile文件存放路徑targetPath:本地jar包生成位置registryUrl:服務(wù)器docker的倉(cāng)庫(kù)地址pushImage:是否在構(gòu)建鏡像后同時(shí)推送到Docker倉(cāng)庫(kù)
2.2 dockerfile
在本地項(xiàng)目的src/main下創(chuàng)建docker目錄,在docker目錄下創(chuàng)建dockerfile文件
FROM 10.xx.xx.xx:5000/java VOLUME /tmp ENV LANG C.UTF-8 COPY *.jar app.jar RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime? RUN echo "Asia/Shanghai" > /etc/timezone? ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-Djava.util.Arrays.useLegacyMergeSort=true", "-jar","app.jar"]
2.3 驗(yàn)證
此時(shí),對(duì)該項(xiàng)目進(jìn)行mvn install時(shí),相當(dāng)于會(huì)同時(shí)進(jìn)行docker:build的動(dòng)作,將本地項(xiàng)目jar包構(gòu)建成鏡像到服務(wù)器中
2.4 統(tǒng)一dockerfile
如果每個(gè)服務(wù)的鏡像構(gòu)建沒(méi)有差異,可以將dockerfile從子項(xiàng)目中抽出來(lái),就不需要在每一個(gè)項(xiàng)目模塊中都創(chuàng)建相同的文件,直接放在項(xiàng)目根路徑下就可以進(jìn)行通用,同時(shí)修改pom配置
<!--指定dockerfile文件路徑-->
<dockerDirectory>${project.parent.basedir}/docker</dockerDirectory>此時(shí)的dockerfile存儲(chǔ)位置為項(xiàng)目父級(jí)目錄的docker文件夾下。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker?搭建?ElasticSearch過(guò)程解析
這篇文章主要介紹了docker搭建ElasticSearch的過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,,需要的朋友可以參考下2023-08-08
Docker搭建簡(jiǎn)單的應(yīng)用棧與容器Hello World訪問(wèn)詳解
這篇文章主要介紹了Docker搭建簡(jiǎn)單的應(yīng)用棧與容器Hello World訪問(wèn),結(jié)合實(shí)例形式詳細(xì)分析了Docker應(yīng)用容器棧的獲取、互聯(lián)、啟動(dòng)、配置以及應(yīng)用訪問(wèn)測(cè)試相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
Docker部署rabbitmq遇到的兩個(gè)問(wèn)題
當(dāng)使用docker部署rabbitmq時(shí)遇到兩個(gè)問(wèn)題,訪問(wèn)交換機(jī)時(shí)報(bào)錯(cuò),另一種是訪問(wèn)channel時(shí)報(bào)錯(cuò),本文給大家分享解決方案,感興趣的朋友跟隨小編一起看看吧2021-07-07
詳解Docker數(shù)據(jù)管理(數(shù)據(jù)卷&數(shù)據(jù)卷容器)
容器中管理數(shù)據(jù)主要有兩種方式,這篇文章主要介紹了詳解Docker數(shù)據(jù)管理(數(shù)據(jù)卷&數(shù)據(jù)卷容器) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
docker容器分配固定ip的實(shí)現(xiàn)示例
如果不固定ip,每次主機(jī)重啟后,docker會(huì)動(dòng)態(tài)給容器分配ip,導(dǎo)致redis容器的IP自動(dòng)換了 ,然后還得去改配置就很煩,本文主要介紹了docker容器分配固定ip的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12

