使用Maven来构建Docker镜像并上传到私服仓库

使用Maven来构建Docker镜像并上传到私服仓库

    maven是一个强大的项目管理与构建工具,使用maven来构建docker镜像,并自动上传到私服仓库,那么就大大简化了工作。

看到网上大部分都是使用的Spotify公司的插件,这里我也选则此插件进行学习。

一 pom.xml中添加docker的插件

   
   
  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>com.spotify </groupId>
  5. <artifactId>docker-maven-plugin </artifactId>
  6. <version>0.4.13 </version>
  7. <configuration>
  8. <forceTags>true </forceTags>     <!--覆盖相同标签镜像-->
  9. <imageName>my/eureka:0.0.1 </imageName> <!--指定镜像名称 仓库/镜像名:标签-->
  10. <baseImage>lwieske/java-8 </baseImage>     <!--指定基础镜像,相当于dockerFile中的FROM<image> -->
  11. <dockerHost>http://192.168.10.72:2375 </dockerHost> <!-- 指定仓库地址 -->
  12. <entryPoint>["java","-jar","/${project.build.finalName}.jar"] </entryPoint> <!-- 容器启动执行的命令,相当于dockerFile的ENTRYPOINT -->
  13. <resources>
  14. <resource>                                              <!-- 指定资源文件 -->
  15. <targetPath>/ </targetPath>                          <!-- 指定要复制的目录路径,这里是当前目录 -->
  16. <directory>${project.build.directory} </directory> <!-- 指定要复制的根目录,这里是target目录 -->
  17. <include>${project.build.finalName}.jar </include> <!-- 指定需要拷贝的文件,这里指最后生成的jar包 -->
  18. </resource>
  19. </resources>
  20. </configuration>
  21. </plugin>
  22. </plugins>
  23. </build>
二 docker开启远程api端口

修改 /etc/sysconfig/docker文件

vi /etc/sysconfig/docker
   
   

在最下面添加一行

DOCKER_OPTS='-H unix:///var/run/docker.sock -H 0.0.0.0:2375'
   
   

再修改 /usr/systemd/system/docker.service

vi /usr/systemd/system/docker.service
   
   
在ExecStart后面添加 $DOCKER_OPTS \

重新加载配置文件

systemctl daemon-reload 
   
   

重启docker

systemctl restart docker
   
   

三 开启防火墙端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent    (--permanent永久生效,没有此参数重启后失效)
   
   

重新载入配置

irewall-cmd --reload
   
   

四 执行mvn命令来构建docker镜像


运行命令


查看服务器上镜像列表


运行镜像


查看结果


可以看到我们的项目已经成功启动了,并且在主机可以直接访问,这说明docker自动帮我们开启了防火墙的端口访问。

如果要使用dockerfile构建镜像



   
   
  1. FROM lwieske/java-8
  2. VOLUME /tmp
  3. ADD discovery-1.0-SNAPSHOT.jar discovery.jar
  4. EXPOSE 8002
  5. CMD ["java","-Djava.security.egd=file:/dev/./urandom","-jar","discovery.jar"]

   
   
  1. <plugin>
  2. <groupId>com.spotify </groupId>
  3. <artifactId>docker-maven-plugin </artifactId>
  4. <version>0.4.13 </version>
  5. <configuration>
  6. <forceTags>true </forceTags> <!--覆盖相同标签镜像-->
  7. <imageName>my/eureka:0.0.2 </imageName> <!--指定镜像名称 仓库/镜像名:标签-->
  8. <dockerHost>http://192.168.10.73:2375 </dockerHost> <!-- 指定仓库地址 -->
  9. <dockerDirectory>${project.basedir}/src/main/docker </dockerDirectory> <!--dockerfile文件路径-->
  10. <resources>
  11. <resource> <!-- 指定资源文件 -->
  12. <targetPath>/ </targetPath> <!-- 指定要复制的目录路径,这里是当前目录 -->
  13. <directory>${project.build.directory} </directory> <!-- 指定要复制的根目录,这里是target目录 -->
  14. <include>${project.build.finalName}.jar </include> <!-- 指定需要拷贝的文件,这里指最后生成的jar包 -->
  15. </resource>
  16. </resources>
  17. </configuration>
  18. </plugin>



测试运行dockerfile构建的镜像




五 将docker绑定到mvn其它命令执行

比如我们想在项目mvn package的时候同时构建docker上传到服务器。


   
   
  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>com.spotify </groupId>
  5. <artifactId>docker-maven-plugin </artifactId>
  6. <version>0.4.13 </version>
  7.                  <executions>
  8. <execution>
  9. <id>build-image </id> <!--定义一个执行命令的id-->
  10. <phase>package </phase> <!--绑定mvn的哪个命令-->
  11. <goals>
  12. <goal>build </goal> <!--要执行的命令 -->
  13. </goals>
  14. </execution>
  15. </executions>
  16.                  <configuration>
  17. <forceTags>true </forceTags> <!--覆盖相同标签镜像-->
  18. <imageName>my/eureka:0.0.1 </imageName> <!--指定镜像名称 仓库/镜像名:标签-->
  19. <baseImage>lwieske/java-8 </baseImage> <!--指定基础镜像,相当于dockerFile中的FROM<image> -->
  20. <dockerHost>http://192.168.10.72:2375 </dockerHost> <!-- 指定仓库地址 -->
  21. <entryPoint>["java","-jar","/${project.build.finalName}.jar"] </entryPoint> <!-- 容器启动执行的命令,相当于dockerFile的ENTRYPOINT -->
  22. <resources>
  23. <resource> <!-- 指定资源文件 -->
  24. <targetPath>/ </targetPath> <!-- 指定要复制的目录路径,这里是当前目录 -->
  25. <directory>${project.build.directory} </directory> <!-- 指定要复制的根目录,这里是target目录 -->
  26. <include>${project.build.finalName}.jar </include> <!-- 指定需要拷贝的文件,这里指最后生成的jar包 -->
  27. </resource>
  28. </resources>
  29. </configuration>
  30. </plugin>
  31. </plugins>
  32. </build>

可以看到,我们在原来的基础上只是新增了<executions/>标签内容,运行测试结果



六  mvn构建docker后并push到私服仓库

   
   
  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>com.spotify </groupId>
  5. <artifactId>docker-maven-plugin </artifactId>
  6. <version>0.4.13 </version>
  7. <executions>
  8. <execution>
  9. <id>build-image </id> <!--定义一个执行命令的id-->
  10. <phase>package </phase> <!--绑定mvn的哪个命令-->
  11. <goals>
  12. <goal>build </goal> <!--要执行的命令 -->
  13. </goals>
  14. </execution>
  15.                      <execution>
  16. <id>image-tag </id>
  17. <phase>package </phase>
  18. <goals>
  19. <goal>tag </goal> <!--tag命令,相当于docker的tag命令-->
  20. </goals>
  21. <configuration>
  22. <image>my/eureka:0.0.1 </image> <!--镜像名-->
  23. <newName>192.168.10.73:5000/my/eureka:0.0.1 </newName> <!--打的标签名-->
  24. </configuration>
  25. </execution>
  26. <execution>
  27. <id>package-push </id>
  28. <phase>package </phase>
  29. <goals>
  30. <goal>push </goal> <!--相当于docker的push命令-->
  31. </goals>
  32. <configuration>
  33. <imageName>192.168.10.73:5000/my/eureka:0.0.1 </imageName> <!--要push的镜像名-->
  34. </configuration>
  35. </execution>
  36. </executions>
  37. <configuration>
  38. <forceTags>true </forceTags> <!--覆盖相同标签镜像-->
  39. <imageName>my/eureka:0.0.1 </imageName> <!--指定镜像名称 仓库/镜像名:标签-->
  40. <baseImage>lwieske/java-8 </baseImage> <!--指定基础镜像,相当于dockerFile中的FROM<image> -->
  41. <dockerHost>http://192.168.10.73:2375 </dockerHost> <!-- 指定仓库地址 -->
  42. <entryPoint>["java","-jar","/${project.build.finalName}.jar"] </entryPoint> <!-- 容器启动执行的命令,相当于dockerFile的ENTRYPOINT -->
  43. <resources>
  44. <resource> <!-- 指定资源文件 -->
  45. <targetPath>/ </targetPath> <!-- 指定要复制的目录路径,这里是当前目录 -->
  46. <directory>${project.build.directory} </directory> <!-- 指定要复制的根目录,这里是target目录 -->
  47. <include>${project.build.finalName}.jar </include> <!-- 指定需要拷贝的文件,这里指最后生成的jar包 -->
  48. </resource>
  49. </resources>
  50. </configuration>
  51. </plugin>
  52. </plugins>
  53. </build>
可以看到,又绑定了两个命令,类似于在docker中先给镜像打标签后再push到仓库
   
   

测试运行

 将镜像推送到私有库,报协议错误
error:Get https://192.168.10.73:5000/v1/_ping: http: server gave HTTP response to HTTPS client
在/etc/docker下,创建daemon.json文件,写入:
{ "insecure-registries":["192.168.10.73:5000"]}  
或者
1.修改/etc/sysconfig/docker文件,在最后增加一行DOCKER_OPTS
DOCKER_OPTIONS="--insecure-registry 192.168.10.73:5000"
2.修改/usr/lib/systemd/system/docker.service
在[Service]的ExexStart=下面增加一行$DOCKER_OPTIONS 

注意:改成自己服务器ip地址

重启docker后,再次执行


push成功,我们看一下远程仓库是否有这个镜像



七 push镜像到docker hub 上

在maven的 settings.xml 中添加


   
   
  1. <servers>
  2. <server>
  3. <id>docker-hub </id>
  4. <username>DockerHub 的账号 </username>
  5. <password>DockerHub 的密码 </password>
  6. <configuration>
  7. <email>你的eamil </email>
  8. </configuration>
  9. </server>
  10. </servers>

pom.xml中修改如下


   
   
  1. <plugin>
  2. <groupId>com.spotify </groupId>
  3. <artifactId>docker-maven-plugin </artifactId>
  4. <version>0.4.13 </version>
  5. <configuration>
  6. <forceTags>true </forceTags> <!--覆盖相同标签镜像-->
  7. <imageName>my/eureka:0.0.2 </imageName> <!--指定镜像名称 仓库/镜像名:标签-->
  8. <dockerHost>http://192.168.10.73:2375 </dockerHost> <!-- 指定仓库地址 -->
  9. <dockerDirectory>${project.basedir}/src/main/docker </dockerDirectory> <!--dockerfile文件路径-->
  10. <resources>
  11. <resource> <!-- 指定资源文件 -->
  12. <targetPath>/ </targetPath> <!-- 指定要复制的目录路径,这里是当前目录 -->
  13. <directory>${project.build.directory} </directory> <!-- 指定要复制的根目录,这里是target目录 -->
  14. <include>${project.build.finalName}.jar </include> <!-- 指定需要拷贝的文件,这里指最后生成的jar包 -->
  15. </resource>
  16. </resources>
  17.                  <serverId>docker-hub </serverId> <!--mvn setting.xml配置的那个id-->
  18. </configuration>
  19. </plugin>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值