前言
如下所示,建議使用 Dockerfile Maven 插件,但該插件也停止維護(hù)更新了。因此先暫時(shí)使用docker-maven-plugin插件。
一、開啟Docker服務(wù)器的遠(yuǎn)程訪問
1.1 開啟2375遠(yuǎn)程訪問
默認(rèn)的dokcer是不支持遠(yuǎn)程訪問的,需要加點(diǎn)配置,開啟Docker的遠(yuǎn)程訪問
# 首先查看docker配置文件所在位置
systemctl status docker
# 會(huì)輸出如下內(nèi)容:
● docker.service - Docker Application Container Engine
Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-12-17 14:22:23 CST; 18min ago
Docs: http://docs.docker.com
Main PID: 25113 (dockerd)
確定docker配置文件位置在:/etc/systemd/system/docker.service
然后編輯修改docker配置文件:
vi /lib/systemd/system/docker.service
找到包含ExecStart的這行,添加如下內(nèi)容:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \
其中,2375端口為docker遠(yuǎn)程服務(wù)端口,包含了docker可視化工具portainer,以及遠(yuǎn)程上傳鏡像的功能。
1.2 添加harbor鏡像配置
編輯docker的配置文件:
vi /etc/docker/daemon.json
# 添加harbor鏡像地址
{
"insecure-registries": ["192.168.0.20:81"]
}
1.3 重啟docker服務(wù)
# 后臺(tái)配置重新加載
systemctl daemon-reload
# 重啟docker服務(wù)
systemctl restart docker.service
# 此處可能會(huì)出現(xiàn)docker無(wú)法啟動(dòng)情況,可能是由于docker.service配置文件修改錯(cuò)誤,重新修改一次然后重新執(zhí)行上述命令即可
#查看配置的端口號(hào)(2375)是否開啟(非必要)
netstat -nlpt
1.4 驗(yàn)證是否開啟成功
查看端口是否開啟
#如果找不到netstat命令,使用yum install net-tools安裝
[root@administrator ~]# netstat -antp | grep dockerd
tcp6 0 0 :::2375 :::* LISTEN 4514/dockerd
直接curl看是否生效,測(cè)試通過localhost是否能使用Docker Engine API
curl http://127.0.0.1:2375/info
?curl http://localhost:2375/version
訪問:http://ip:2375/version測(cè)試遠(yuǎn)程能否通過主機(jī)IP使用Docker Engine API
二、IDEA-Maven打包鏡像
2.1 修改maven的配置文件settings.xml
在maven的配置文件中,添加harbor私服的用戶名及密碼:
<servers>
<server>
<id>harbor</id>
<username>harbor</username>
<password>123456</password>
<configuration>
<email>123456@aliyun.com</email>
</configuration>
</server>
</servers>
2.2 修改SpringBoot項(xiàng)目中的pom.xml
添加屬性配置,屬性配置,在后面的插件配置里有引用這個(gè):
- docker.repostory 是docker私服地址,harbor配置完默認(rèn)端口就是80,可以不帶端口號(hào)。但是我將之改成81了
- docker.registry.name 即是在harbor中配置的鏡像倉(cāng)庫(kù)名,必須一致!這里我配的是test,因?yàn)閔arbor中配置的鏡像倉(cāng)庫(kù)名也是test。
<properties>
<!--docker插件-->
<!-- docker私服地址,Harbor配置完默認(rèn)地址就是80,默認(rèn)不帶端口號(hào)。但是我這里是81 -->
<docker.repostory>192.168.10.11:81</docker.repostory>
<!--項(xiàng)目名,需要和Harbor中的項(xiàng)目名稱保持一致 -->
<docker.registry.name>test</docker.registry.name>
</properties>
3.3 docker-maven-plugin插件配置
- serverId 指定之前在maven的settings.xml中配置的server節(jié)點(diǎn),這樣maven會(huì)去找其中配置的用戶名密碼和郵箱
- registryUrl 指定上面配置的properties屬性,即是harbor私服的訪問url,注意我設(shè)置的使用81端口,默認(rèn)是80端口
- imageName 指定上傳harbor私服的鏡像名,必須和harbor上的url、鏡像倉(cāng)庫(kù)名保持一致。其中的docker.registry.name就是上面配置的properties屬性
3.3.1 方式一:純插件操作方式構(gòu)建鏡像
<build>
<plugins>
<!-- 解決資源文件的編碼問題 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- maven打source包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<!--<phase>verify</phase>-->
<goals>
<!--jar, jar-no-fork-->
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- spring Boot在編譯的時(shí)候, 是有默認(rèn)JDK版本的, 這里自定義指定JDK版本 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!--拷貝依賴jar到指定的目錄-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!-- maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分內(nèi)容, -->
<addClasspath>true</addClasspath>
<!-- 指定依賴包所在目錄。 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- 指定MANIFEST.MF中的Main-Class, -->
<mainClass>org.fiend.SpringBootDockerApp</mainClass>
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
<excludes>
<!--<exclude>*.properties</exclude>-->
<!--<exclude>*.yml</exclude>-->
<!--<exclude>*.xml</exclude>-->
<!--<exclude>org/fiend/controller/HomeController.class</exclude>-->
</excludes>
</configuration>
</plugin>
<!-- ===================================== docker ================================== -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<executions>
<execution>
<id>build-image</id>
<!--用戶只需執(zhí)行mvn package, 就會(huì)自動(dòng)執(zhí)行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--
maven的 settings.xml文件添加如下配置:
<server>
<id>harbor</id>
<username>admin</username>
<password>admin123</password>
<configuration>
<email>admin@example.org</email>
</configuration>
</server>
-->
<serverId>harbor</serverId>
<registryUrl>http://${docker.repostory}</registryUrl>
<!--必須配置dockerHost標(biāo)簽(除非配置系統(tǒng)環(huán)境變量DOCKER_HOST)-->
<dockerHost>http://192.168.31.133:2375</dockerHost>
<!--指定基礎(chǔ)鏡像jdk1.8-->
<!--<baseImage>jdk:1.8</baseImage>-->
<baseImage>k8s-harbor:10001/my-project/openjdk11:jre-11.0.12_7-alpine</baseImage>
<!--Building image 192.168.0.20/demo1-->
<imageName>${docker.repostory}/${docker.registry.name}/${project.artifactId}:${project.version}</imageName>
<!--指定標(biāo)簽 這里指定的是鏡像的版本,默認(rèn)版本是latest-->
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<!-- 指定 Dockerfile 路徑-->
<!--鏡像制作人本人信息 -->
<!--<maintainer>1090239782@qq.com</maintainer>-->
<!--切換到工作目錄-->
<workdir>/home</workdir>
<!--執(zhí)行容器運(yùn)行的命令,添加如下指令, 打包成鏡像后會(huì)自動(dòng)啟動(dòng)容器-->
<!--<runs>-->
<!-- <run>sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories</run>-->
<!-- <run>apk update</run>-->
<!-- <run>apk add tzdata</run>-->
<!-- <run>cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime</run>-->
<!-- <run>echo "Asia/Shanghai" > /etc/timezone</run>-->
<!--</runs>-->
<cmd>["java", "-version"]</cmd>
<!--${project.build.finalName}.jar是打包后生成的jar包的名字-->
<entryPoint>["java", "-jar", "-Xms896m", "-Xmx896m", "${project.build.finalName}.jar"]</entryPoint>
<!--<exposes>-->
<!-- <!– 指定容器內(nèi)部端口, 可以不寫, 不寫默認(rèn)是項(xiàng)目中pom文件的端口 –>-->
<!-- <expose>8080</expose>-->
<!--</exposes>-->
<!-- jar包位置-->
<resources>
<resource>
<targetPath>/home</targetPath>
<!-- target目錄下-->
<directory>${project.build.directory}</directory>
<!--通過jar包名找到j(luò)ar包-->
<include>${project.build.finalName}.jar</include>
</resource>
<resource>
<targetPath>/home/lib</targetPath>
<!-- target目錄下-->
<directory>${project.build.directory}/lib</directory>
<!--<include>*.jar</include>-->
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
接下來(lái)只要先點(diǎn)擊clean清除之前的所有打包的文件,然后再點(diǎn)擊package打包文件即可完成鏡像的構(gòu)建,真正的一鍵部署
由于將 <phase>package</phase> 注釋掉了,因此需要執(zhí)行 docker:build 命令構(gòu)建鏡像:
如果要將鏡像推送至Harbor倉(cāng)庫(kù),執(zhí)行docker:push命令:
刪除docker鏡像命令(不是刪除Harbor中的鏡像), docker:removeImage:
重新構(gòu)建鏡像時(shí),記得先執(zhí)行此命令,刪除原來(lái)的鏡像。
到此鏡像構(gòu)建成功,接下來(lái)使用Idea的Docker插件,創(chuàng)建容器跑起來(lái)(或者去Docker機(jī)器執(zhí)行命令行)
通過ip訪問
此種方式,直接通過Maven的package命令,即可實(shí)現(xiàn)鏡像的制作,但是要推送鏡像到harbor私服,還需執(zhí)行docker:push,即:
點(diǎn)擊push,將鏡像推送到harbor私服中
3.3.2 方式二:結(jié)合Dockerfile文件構(gòu)建鏡像
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<serverId>my-hub</serverId>
<registryUrl>http://${docker.repostory}</registryUrl>
<!--必須配置dockerHost標(biāo)簽(除非配置系統(tǒng)環(huán)境變量DOCKER_HOST)-->
<dockerHost>http://192.168.10.11:2375</dockerHost>
<!--Building image 192.168.10.11/demo1-->
<imageName>${docker.repostory}/${docker.registry.name}/${project.artifactId}:${project.version}</imageName>
<!-- 指定 Dockerfile 路徑-->
<dockerDirectory>${basedir}/</dockerDirectory>
<!-- jar包位置-->
<resources>
<resource>
<targetPath>/ROOT</targetPath>
<!-- target目錄下-->
<directory>${project.build.directory}</directory>
<!--通過jar包名找到j(luò)ar包-->
<include>${pack-name}</include>
</resource>
</resources>
</configuration>
</plugin>
那么Dockerfile文件中的jar包名相應(yīng)需要修改:
FROM java:8
WORKDIR /ROOT
ADD /ROOT/demo1-2.jar /ROOT/
ENTRYPOINT ["java", "-jar", "demo1-2.jar"]
點(diǎn)擊pakage打包,target 上生成了springboot工程的jar包
完了之后,點(diǎn)擊docker bulid 構(gòu)建工程鏡像
然后點(diǎn)擊push,將鏡像推送到harbor私服中
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-664803.html
3.4 docker-maven-plugin操作容器
此部分內(nèi)容參考:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-664803.html
- 掘金:MacroZheng:還在手動(dòng)部署SpringBoot應(yīng)用?試試這個(gè)自動(dòng)化插件! - 掘金
-
docker-maven-plugin
不僅可以操作鏡像,還可以操作容器,比如我們以前需要使用如下Docker命令來(lái)運(yùn)行容器;
docker run -p 8080:8080 —name mall-tiny-fabric \
—link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/mall-tiny-fabric/logs:/var/logs \
-d 192.168.3.101:5000/mall-tiny/mall-tiny-fabric:0.0.1-SNAPSHOT
- 現(xiàn)在我們只需在插件中配置即可,在
<image>
節(jié)點(diǎn)下添加<run>
節(jié)點(diǎn)可以定義容器啟動(dòng)的行為:
<!--在<image>節(jié)點(diǎn)下添加<run>節(jié)點(diǎn)可以定義容器啟動(dòng)的行為, 該配置不會(huì)自動(dòng)啟動(dòng)打包后的鏡像-->
<image>
<!--定義容器啟動(dòng)行為-->
<run><!--設(shè)置容器名,可采用通配符-->
<containerNamePattern>${project.artifactId}</containerNamePattern>
<!--設(shè)置端口映射-->
<ports>
<port>8600:8600</port>
</ports>
<!--設(shè)置容器間連接-->
<!--<links>-->
<!-- <link>mysql:db</link>-->
<!--</links>-->
<!--設(shè)置容器和宿主機(jī)目錄掛載-->
<!--<volumes>-->
<!-- <bind>-->
<!-- <volume>/etc/localtime:/etc/localtime</volume>-->
<!-- <volume>/mydata/app/${project.artifactId}/logs:/var/logs</volume>-->
<!-- </bind>-->
<!--</volumes>-->
</run>
</image>
- 之后直接使用
docker:start
命令即可啟動(dòng)了;
# mvn docker:start
[root@linux-local mydata]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95ce77c0394b 192.168.3.101:5000/mall-tiny/mall-tiny-fabric:0.0.1-SNAPSHOT “java -jar /mall-tin…” 32 seconds ago Up 31 seconds 0.0.0.0:8080->8080/tcp mall-tiny-fabric
- 停止容器使用
docker:stop
命令即可;
mvn docker:stop
- 刪除容器使用
docker:remove
命令,是不是很方便!
mvn docker:remove
到了這里,關(guān)于使用docker-maven-plugin插件構(gòu)建鏡像并推送至私服Harbor的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!