maven构建docker镜像三部曲之三:推送到远程仓库(内网和阿里云)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 把docker-maven-plugin插件的推送功能也用上,编译构建后自动推送到内网私有仓库或者阿里云镜像仓库

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos

本篇概览

源码和环境

  • 本次实战的java web工程源码和环境都沿用上一章的,源码我已经上传到github上,地址是:git@github.com:zq2599/blog_demos.git ,浏览器访问地址是:https://github.com/zq2599/blog_demos , 这里面有多个工程,本次实战用到的是mavendockerplugindemo,如下图红框所示:

image

把构建的镜像推送到哪里去

  • 本次实战有以下两个地方可以存放镜像,我们每个都要试试:
  1. 内网中,自己搭建的docker私有仓库;
  2. 阿里云的镜像仓库;
  • 接下来我们分别推送到上述两个仓库,先推送到内网的私有仓库吧。

如何搭建内网的私有仓库

  1. 在内网搭建和使用私有仓库的详细步骤,请看《docker私有仓库搭建与使用实战》,就不在此赘述了;
  2. 用于编译和构建镜像的虚拟机上,记得配置/etc/default/docker/lib/systemd/system/docker.service文件,使docker服务可以在http协议下工作,否则无法推送到内网私有仓库;

pom配置信息

  • 用SecureCRT登录虚拟机,在工程的目录下新建一个pom_3_inner_server.xml文件,内容和pom_1_by_param.xml文件的一模一样,然后对pom_3_inner_server.xml文件做下列修改:
  • 新增registryUrl节点,内容是私有仓库地址和端口,如下:
<registryUrl>192.168.119.148:5000</registryUrl>
  • 新增pushImage节点,内容如下:
<pushImage>true</pushImage>
  • 修改imageName节点的内容,改为私有仓库地址和端口,再加上镜像id和TAG,如下:
<imageName>192.168.119.148:5000/${project.artifactId}:${project.version}</imageName>
  • 执行以下命令开始构建:
mvn -f pom_3_inner_server.xml clean package -DskipTests docker:build
  • 构建完毕后发现输出了报错信息,如下:
[INFO] Building image 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
Step 1/3 : FROM java:8u111-jdk
 ---> d23bdf5b1b1b
Step 2/3 : ADD /mavendockerplugindemo-0.0.1-SNAPSHOT.jar //
 ---> 634afbb47de5
Removing intermediate container 8c165fad6a2c
Step 3/3 : ENTRYPOINT java -jar /mavendockerplugindemo-0.0.1-SNAPSHOT.jar
 ---> Running in 1840b6345566
 ---> ff415c0f2d72
Removing intermediate container 1840b6345566
Successfully built ff415c0f2d72
[INFO] Built 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
[INFO] Tagging 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT with 0.0.1-SNAPSHOT
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
[WARNING] Failed to push 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT, retrying in 10 seconds (1/5).
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
[WARNING] Failed to push 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT, retrying in 10 seconds (2/5).
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
[WARNING] Failed to push 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT, retrying in 10 seconds (3/5).
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
[WARNING] Failed to push 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT, retrying in 10 seconds (4/5).
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
[WARNING] Failed to push 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT, retrying in 10 seconds (5/5).
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:00 min
[INFO] Finished at: 2017-12-28T17:26:46-08:00
[INFO] Final Memory: 32M/90M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:0.4.12:build (default-cli) on project mavendockerplugindemo: Exception caught: Put http://192.168.119.148:5000/v1/repositories/mavendockerplugindemo/: dial tcp 192.168.119.148:5000: getsockopt: connection refused -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
  • 错误信息中有这么一句:Failed to push ......,看起来是连不上私有仓库,登录到私有仓库的机器上去看了以下,果然,docker容器没有启动呢.....
  • 执行命令docker start docker-registry将私有仓库的服务容器启动,再回到构建服务的机器上,再执行一次构建命令,这次成功了,如下:
[INFO] Building image 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
Step 1/3 : FROM java:8u111-jdk
 ---> d23bdf5b1b1b
Step 2/3 : ADD /mavendockerplugindemo-0.0.1-SNAPSHOT.jar //
 ---> a033c632d0b0
Removing intermediate container 1d702736fae4
Step 3/3 : ENTRYPOINT java -jar /mavendockerplugindemo-0.0.1-SNAPSHOT.jar
 ---> Running in c3e4a2a41936
 ---> 649774e8dc21
Removing intermediate container c3e4a2a41936
Successfully built 649774e8dc21
[INFO] Built 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
[INFO] Tagging 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT with 0.0.1-SNAPSHOT
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
7b4f222745df: Pushed 
35c20f26d188: Layer already exists 
c3fe59dd9556: Layer already exists 
6ed1a81ba5b6: Layer already exists 
a3483ce177ce: Layer already exists 
ce6c8756685b: Layer already exists 
30339f20ced0: Layer already exists 
0eb22bfb707d: Layer already exists 
a2ae92ffcd29: Layer already exists 
0.0.1-SNAPSHOT: digest: sha256:4c8d5489bcb99ec1c0884adfdeeb25e5706de8f940c406c5a560243681b01831 size: 2212
null: null 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.760 s
[INFO] Finished at: 2017-12-28T17:36:25-08:00
[INFO] Final Memory: 32M/88M
[INFO] ------------------------------------------------------------------------
  • 在用于构建镜像的虚拟机和作为镜像仓库的虚拟机上,分别执行curl -X GET http://192.168.119.148:5000/v2/_catalog,查看私有仓库的镜像信息(192.168.119.148是私有仓库虚拟机的IP),都能见到镜像mavendockerplugindemo,如下图:

这里写图片描述

  • 推送到内网私有仓库的实战已经完成,接下来我们试试推送到阿里云镜像仓库吧;

注册和登录阿里云

  • 使用阿里云镜像仓库前,需要在阿里云网站注册一个账号,请您自行完成注册登录,此处不赘述了;

创建命名空间和镜像仓库

  • 在阿里云首页的”产品”菜单下,找到"容器镜像服务",然后点击跳转,如下图:

这里写图片描述

  • 新的页面中,点击"管理控制台",如下图:

这里写图片描述

  • 在控制台页面中,按照下图操作,创建一个命名空间bolingcavalry:

这里写图片描述

  • 在控制台页面中,按照下图操作,选一个近的仓库,再点击"创建镜像仓库"按钮开始创建镜像仓库:

这里写图片描述

  • 参考下图的步骤填写表单,创建一个仓库:

这里写图片描述

  • 如下图,创建完毕后就能在列表页面看见了,注意红框所示,一定要选择和创建时一样的地区,否则在列表中看不见刚刚创建的仓库:

这里写图片描述

  • 从列表中我们可以看见,仓库地址是 registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo,记下来后面会用到的;

修改maven的配置文件

  • 回到虚拟机上,打开文件/opt/apache-maven-3.3.3/conf/settings.xml,找到<servers>节点,在里面添加一个server节点,内容如下:
    <server>
      <!--maven的pom中可以根据这个id找到这个server节点的配置-->  
      <id>docker-aliyun</id>
      <!--这里是在阿里云注册的账号-->
      <username>12345678@qq.com</username>
      <!--这里是在阿里云注册的密码-->
      <password>abcdef</password>
      <configuration>
            <!--这是在阿里云注册时填写的邮箱-->
            <email>12345678@qq.com</email>
      </configuration>
    </server>
  • 请参照注释的提示,将您在阿里云上的账号密码都填写到对应位置;

pom配置信息

  • 在java web工程的目录下新建一个pom_4_ali_server.xml文件,内容和pom_1_by_param.xml文件的一模一样,然后再对pom_4_ali_server.xml文件做以下修改:
  • 阿里云镜像仓库列表页面中,我们创建的镜像仓库的地址是"registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo",现在把这个字符串拆成三部分,将前面两部分作为两个属性放入pom文件的<properties>节点中,属性名分别是docker.repostorydocker.registry.name,此时properties节点的内容如下:
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <docker.repostory>registry.cn-shenzhen.aliyuncs.com</docker.repostory>
    <docker.registry.name>bolingcavalry</docker.registry.name>
</properties>
  • 新增serverId节点,内容是之前修改的maven配置文件中,server节点的id,如下:
<serverId>docker-aliyun</serverId>
  • 新增registryUrl节点,内容是私有仓库地址,如下:
<registryUrl>${docker.repostory}</registryUrl>
  • 新增pushImage节点,内容如下:
<pushImage>true</pushImage>
  • 修改imageName节点的内容,改为私有仓库地址和端口,再加上镜像id和TAG,如下:
${docker.repostory}/${docker.registry.name}/${project.artifactId}:${project.version}

构建并推送到阿里云镜像仓库

  • 执行以下命令开始构建:
mvn -f pom_4_ali_server.xml clean package -DskipTests docker:build
  • 构建完成后的输出信息如下,表示推送成功了:
[INFO] Building image registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT
Step 1/3 : FROM java:8u111-jdk
 ---> d23bdf5b1b1b
Step 2/3 : ADD /mavendockerplugindemo-0.0.1-SNAPSHOT.jar //
 ---> f912a6c9134c
Removing intermediate container a05fb50d6235
Step 3/3 : ENTRYPOINT java -jar /mavendockerplugindemo-0.0.1-SNAPSHOT.jar
 ---> Running in 1c71545bdd60
 ---> fa4eee94dae6
Removing intermediate container 1c71545bdd60
Successfully built fa4eee94dae6
[INFO] Built registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT
[INFO] Tagging registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT with 0.0.1-SNAPSHOT
[INFO] Pushing registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo]
1efab0de4a7d: Pushed 
35c20f26d188: Pushed 
c3fe59dd9556: Pushed 
6ed1a81ba5b6: Pushed 
a3483ce177ce: Pushed 
ce6c8756685b: Pushed 
30339f20ced0: Pushed 
0eb22bfb707d: Pushed 
a2ae92ffcd29: Pushed 
0.0.1-SNAPSHOT: digest: sha256:89062f267fe22df3acc5d6ca7405140162e43076aeda5f7584dbf80fcdc0c58b size: 2212
null: null 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:28 min
[INFO] Finished at: 2017-12-29T02:45:05-08:00
[INFO] Final Memory: 34M/83M
[INFO] ------------------------------------------------------------------------

在阿里云网页查看

  • 打开阿里云镜像仓库管理页面,如下图:

这里写图片描述

  • 点击"镜像版本",在列表中可以看到该镜像的版本,以及最后的上传时间,和我们的构建结果都是一致的,如下图:

这里写图片描述

下载并验证镜像

  • 在虚拟机上用docker rmi 镜像名称:镜像版本命令将所有的镜像删除干净,如果有容器还未删除,就要先删除容器再删除镜像,查看容器的命令是docker ps -a,删除容器的命令是docker rm 容器名
  • 如下图,在管理页面点击“基本信息”,可以看见登录阿里云镜像仓库和下载镜像的命令,在虚拟机上先执行登录命令,会要求输入密码,输入后登录成功:

这里写图片描述

  • 执行下载镜像的命令,如下,将我们之前上传的镜像下载下来:
docker pull registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT
  • 输出信息如下,表示下载成功:
root@docker-app:/usr/local/work/mavendockerplugindemo# docker pull registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT
0.0.1-SNAPSHOT: Pulling from bolingcavalry/mavendockerplugindemo
e12c678537ae: Already exists 
8d9ed335b7db: Already exists 
3318dd58ae60: Already exists 
624ba6156166: Already exists 
c7a02d193df7: Already exists 
813b62320378: Already exists 
81cf5426393a: Already exists 
0a2b7222259b: Already exists 
fadb940064b4: Pull complete 
Digest: sha256:89062f267fe22df3acc5d6ca7405140162e43076aeda5f7584dbf80fcdc0c58b
Status: Downloaded newer image for registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT
  • 执行如下命令,用下载的镜像创建一个容器:
docker run --name demo003 -p 8080:8080 registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT
  • 输出信息会提示启动成功,这时候在当前电脑上打开浏览器,输入"http://192.168.119.155:8080/" ,可以看见web工程的controller的返回信息了,如下图:

这里写图片描述

结束

  • 至此,maven构建docker镜像的三部曲就全部结束了,希望对您熟悉和使用docker-maven-plugin插件有所帮助,另外,本文中用到的pom_3_inner_server.xml和pom_4_ali_server.xml文件,我已上传到git上本次实战的web工程中,地址是:git@github.com:zq2599/blog_demos.git ,浏览器访问地址是:https://github.com/zq2599/blog_demos , 这里面有多个工程,本次实战用到的是mavendockerplugindemo,如下图红框所示:

image

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。 &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
12天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
390 28
|
9天前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
14天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
84 2
|
16天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
29 1
|
17天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
22天前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
35 1
|
8天前
|
缓存 JavaScript 安全
深入理解Docker镜像构建过程
深入理解Docker镜像构建过程
25 0
|
9天前
|
Java Maven
maven项目的pom.xml文件常用标签使用介绍
第四届人文,智慧教育与服务管理国际学术会议(HWESM 2025) 2025 4th International Conference on Humanities, Wisdom Education and Service Management
59 8
|
7天前
|
Java 应用服务中间件 Maven
Maven的三种项目打包方式——pom,jar,war的区别
Maven 提供了多种打包方式,分别适用于不同类型的项目。pom 用于父项目或聚合项目,便于项目的结构和依赖管理;jar 用于Java类库或可执行的Java应用程序;war 则专用于Java Web应用程序的部署。理解这些打包方式的用途和特点,可以帮助开发者更好地配置和管理Maven项目,确保构建和部署过程的顺利进行。无论是单模块项目还是多模块项目,选择合适的打包方式对于项目的成功至关重要。
19 3
|
1月前
|
Java 关系型数据库 MySQL
Maven——创建 Spring Boot项目
Maven 是一个项目管理工具,通过配置 `pom.xml` 文件自动获取所需的 jar 包,简化了项目的构建和管理过程。其核心功能包括项目构建和依赖管理,支持创建、编译、测试、打包和发布项目。Maven 仓库分为本地仓库和远程仓库,远程仓库包括中央仓库、私服和其他公共库。此外,文档还介绍了如何创建第一个 SpringBoot 项目并实现简单的 HTTP 请求响应。
117 1
Maven——创建 Spring Boot项目