一、背景
1、優(yōu)化前:
目前構(gòu)建docker鏡像都是先執(zhí)行mvn clean package打包之后,將target目錄下的jar包放到服務(wù)器上,再通過Dockerfile去build成鏡像,步驟多,而且每次都需要登錄服務(wù)器進(jìn)行操作,十分麻煩。
2、優(yōu)化后:
在Spring Boot項(xiàng)目中引入docker-maven-plugin進(jìn)行相關(guān)配置,之后就可以在項(xiàng)目根目錄下執(zhí)行mvn clean package docker:build -DpushImage,就可以在服務(wù)器上的docker生成鏡像,并且推送到遠(yuǎn)程倉庫上,十分方便,不用每次都登錄服務(wù)器進(jìn)行操作。
在進(jìn)行項(xiàng)目引入docker-maven-plugin之前,先進(jìn)行docker的配置,使我們能夠通過2375端口訪問到docker。
二、配置docker,開放2375端口
Docker的2375端口是默認(rèn)關(guān)閉的,如果我們要使用到它,就需要進(jìn)行以下的配置:
1、安裝有docker的服務(wù)器,修改docker.service文件:
vi /etc/systemd/system/docker.service
具體文件所在地,得看你安裝docker的位置,如果不知道自己安裝在哪里了,執(zhí)行以下指令去查找:
sudo find / -name docker.service
2、修改docker.service
找到文件以下內(nèi)容:
ExecStart=/usr/bin/dockerd
修改為:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
3、重啟docker服務(wù)
systemctl daemon-reload
systemctl restart docker
4、查看端口是否開啟
netstat -anp | grep 2375
如果沒有被占用,就什么都不顯示
5、如果通過以上配置,發(fā)現(xiàn)2375沒有開啟的話,那么請(qǐng)嘗試修改daemon.json文件:
vi /etc/docker/daemon.json
具體文件所在地,得看你安裝docker的位置,如果不知道自己安裝在哪里了,執(zhí)行以下指令去查找:
sudo find / -name daemon.json
在配置文件添加上hosts項(xiàng):
{
"insecure-registries":["xx.xx.xx.xx:5000"],
? "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
通過以上操作,基本可以打開2375端口,并且可以通過該端口連接上docker,如果還是不行,那么請(qǐng)通過網(wǎng)絡(luò)查找原因及解決方法了哈。
注意:以上開發(fā)的2375端口訪問docker的方式是不安全的,如果想要安全的訪問,請(qǐng)自行百度了解。
三、搭建docker registry,鏡像推送的倉庫
一般我們的鏡像除了放在docker上,還可以將其推送到docker registry上,其他服務(wù)器上的docker就可以在該docker registry上拉取鏡像。
關(guān)于docker registry的安裝及配置,請(qǐng)參考我的另外一篇博客,這里就不重復(fù)去寫了:
https://blog.csdn.net/Staba/article/details/124550444?spm=1001.2014.3001.5502
四、項(xiàng)目配置docker-maven-plugin
在父工程pom.xml配置如下,如果你不愿意將插件在父工程的pom.xml中進(jìn)行管理與配置,那么就將以下配置去掉pluginManagemt標(biāo)簽,然后放在子工程中的pom.xml中即可
<!--你的其他配置-->
<profiles>
<profile>
<!--默認(rèn)激活配置-->
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<imageVersion>${project.version}</imageVersion>
<tag.suffix>dev</tag.suffix>
<docker.host>http://開發(fā)環(huán)境服務(wù)器ip:2375</docker.host>
<docker.registry>開發(fā)環(huán)境docker registry服務(wù)器ip:5000</docker.registry>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<imageVersion>${project.version}</imageVersion>
<tag.suffix>test</tag.suffix>
<docker.host>http://測(cè)試環(huán)境服務(wù)器ip:2375</docker.host>
<docker.registry>測(cè)試環(huán)境docker registry服務(wù)器ip:5000</docker.registry>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<imageVersion>${project.version}</imageVersion>
<tag.suffix>prod</tag.suffix>
<docker.host>http://生產(chǎn)環(huán)境服務(wù)器ip:2375</docker.host>
<docker.registry>生產(chǎn)環(huán)境docker registry服務(wù)器ip:5000</docker.registry>
</properties>
</profile>
</profiles>
<build>
? ? <pluginManagement>
? ? <plugins>
? ? ? ? ? ? <!—如果是springboot項(xiàng)目,引入這個(gè),否則打的jar包大小不正確-->
? ? ? ? ? ? <plugin>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-maven-plugin</artifactId>
? ? ? ? ? ? <version>${spring-boot.version}</version>
? ? ? ? ? ? </plugin>
? ?
? ? <plugin>
? ? <groupId>com.spotify</groupId>
? ? <artifactId>docker-maven-plugin</artifactId>
? ? <version>1.2.2</version>
? ? <!--有需求就綁定,不綁定就更加靈活點(diǎn)-->
? ? <!--<executions>
? ? <!– 當(dāng)mvn執(zhí)行install操作的時(shí)候,執(zhí)行docker的build和push –>
? ? <execution>
? ? <id>buildAndPush</id>
? ? <phase>install</phase>
? ? <goals>
? ? <goal>build</goal>
? ? <!– <goal>push</goal>–>
? ? </goals>
? ? </execution>
? ? </executions>-->
? ? <configuration>
? ? <!--docker build 開始-->
? ? <!-- 連接到 帶docker環(huán)境的linux服務(wù)器 編譯image -->
? ? <dockerHost>${docker.host}</dockerHost>
? ?
? ? <!-- 指定tag版本,可不加,在imageName上指定-->
? ? <!-- <imageTags>-->
? ? <!-- <imageTag>${project.version}</imageTag>-->
? ? <!-- </imageTags>-->
? ? <!-- build 時(shí)強(qiáng)制覆蓋 tag,配合 imageTags 使用 -->
? ? <!--<forceTags>true</forceTags>-->
? ?
? ? <!--
? ? 格式:私有倉庫/鏡像名稱:版本號(hào), 如果要執(zhí)行push操作, 那么鏡像名稱必須為私有倉庫為前綴,且后綴為版本號(hào),不然無效
? ? 注意:鏡像名稱不加:tag, build時(shí)會(huì)生成latest和你指定版本的兩個(gè)鏡像,加上只生成一個(gè)tag為你指定版本的鏡像
? ? -->
? ? <imageName>${docker.registry}/${project.artifactId}:${imageVersion}-${tag.suffix}</imageName>
? ?
? ? <!--指定dockerfile文件路徑-->
? ? <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
? ?
? ? <!-- 用于指定需要復(fù)制的文件,需要包含jar包 -->
? ? <resources>
? ? <resource>
? ? <targetPath>/</targetPath>
? ? <directory>${project.build.directory}</directory>
? ? <include>${project.build.finalName}.jar</include>
? ? </resource>
? ? </resources>
? ? <!--docker build 結(jié)束-->
? ?
? ?
? ? <!-- push到 docker hub/registry 開始 -->
? ? <!--serverId 這個(gè)是配置在maven的setting.xml中hub/registry的登錄賬戶信息,無密碼登錄則無需配置-->
? ? <!--<serverId>docker-registry</serverId>-->
? ? <!--docker hub/registry地址-->
? ? <registryUrl>${docker.registry}</registryUrl>
? ? <!--重試推送次數(shù)-->
? ? <retryPushCount>3</retryPushCount>
? ? <!--推送超時(shí)時(shí)間-->
? ? <retryPushTimeout>2000</retryPushTimeout>
? ? <!--是否自動(dòng)推送到Registry Server, 建議手動(dòng)推送,開啟后build之后就會(huì)push,執(zhí)行mvn時(shí)就無需加上-DpushImage -->
? ? <!--<pushImage>true</pushImage>-->
? ? <!-- push到 docker hub 結(jié)束 -->
? ? </configuration>
? ? </plugin>
? ? </plugins>
? ? </pluginManagement>
</build>
如果指定了<serverId>xxx</serverId>,那么請(qǐng)?jiān)趍aven的setting.xml中配置以下信息:
<server>
<id>xxx</id>
<username>your username</username>
<password>your password</password>
<configuration>
<email>you email</email>
</configuration>
</server>
2、子工程引入插件,因?yàn)閐ocker相關(guān)配置都在父工程中寫好了,子工程中無須重復(fù)寫,只需引入插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3、在<dockerDirectory>標(biāo)簽中指定的路徑下創(chuàng)建Dockerfile文件,內(nèi)容如下:
FROM 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"]
4、在子項(xiàng)目根路徑上執(zhí)行mvn clean package -P dev -DimageVersion='1.0.9' docker:build –DpushImage指令,即可將target目錄下的jar包構(gòu)建成鏡像,并且推送到docker registry上。
參數(shù)解析:
-P dev -> 由于我們?cè)赑rofile標(biāo)簽中指定了不同環(huán)境中使用不同服務(wù)器上的docker,所有由該參數(shù)指定我們哪個(gè)環(huán)境的配置生效,默認(rèn)是dev生效(配置了)。
-DimageVersion='1.0.9' -> 在配置中我們這個(gè)屬性默認(rèn)值是當(dāng)前項(xiàng)目版本,通過該參數(shù)指定我們打包鏡像的tag最終版本,因?yàn)閼械拿看稳ジ膒om中的version標(biāo)簽,于是自定義一個(gè)屬性,通過命令行傳入版本
docker:build -> 打包完jar之后就會(huì)指定docker build指令,將jar包構(gòu)建成鏡像
–DpushImage –> 構(gòu)建完鏡像之后就會(huì)將鏡像推送到docker registry倉庫上
-DpushImageTag -> 如果在<imageTags>中指定了tag,且在<imageName>中沒有:tag信息,使用pushImageTag去推送標(biāo)簽指定的tags鏡像
當(dāng)然,如果你懶的去敲docker相關(guān)的指令,可以與maven插件的各執(zhí)行周期綁定,那么就請(qǐng)?jiān)趀xecutions中進(jìn)行綁定配置。文章來源:http://www.zghlxwxcb.cn/news/detail-554724.html
通過執(zhí)行以上的指令,就可以在控制臺(tái)上看到鏡像build的過程以及推送的過程。文章來源地址http://www.zghlxwxcb.cn/news/detail-554724.html
到了這里,關(guān)于Spring?Boot配置docker-maven-plugin實(shí)現(xiàn)構(gòu)建與推送鏡像的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!