Docker系列教程12-使用Maven插件构建Docker镜像

简介: 原文:http://www.itmuch.com/docker/12-docker-maven/我们知道,Maven是一个强大的项目管理与构建工具。

原文:http://www.itmuch.com/docker/12-docker-maven/

我们知道,Maven是一个强大的项目管理与构建工具。如果可以使用Maven构建Docker镜像,那么我们的工作就能得到进一步的简化。

经过调研,以下几款Maven的Docker插件进入笔者视野,如表13-1所示。

插件名称 官方地址
docker-maven-plugin https://github.com/spotify/docker-maven-plugin
docker-maven-plugin https://github.com/fabric8io/docker-maven-plugin
docker-maven-plugin https://github.com/bibryam/docker-maven-plugin

表13-1 Maven的Docker插件列表

笔者从各项目的功能性、文档易用性、更新频率、社区活跃度、Stars等几个纬度考虑,选用了第一款。这是一款由Spotify公司开发的Maven插件。

下面我们来详细探讨如何使用Maven插件构建Docker镜像。

快速入门

以项目microservice-discovery-eureka 为例。

(1) 在pom.xml中添加Maven的Docker插件。

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>0.4.13</version>
  <configuration>
    <imageName>itmuch/microservice-discovery-eureka:0.0.1</imageName>
    <baseImage>java</baseImage>
    <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
    <resources>
      <resource>
        <targetPath>/</targetPath>
        <directory>${project.build.directory}</directory>
        <include>${project.build.finalName}.jar</include>
      </resource>
    </resources>
  </configuration>
</plugin>

简要说明一下插件的配置:

① imageName:用于指定镜像名称,其中itmuch是仓库名称,microservice-discovery-eureka是镜像名称,0.0.1是标签名称。

② baseImage:用于指定基础镜像,类似于Dockerfile中的FROM指令。

③ entrypoint:类似于Dockerfile的ENTRYPOINT指令。

④ resources.resource.directory:用于指定需要复制的根目录,${project.build.directory}表示target目录。

⑤ resources.resource.include:用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。

(2) 执行以下命令,构建Docker镜像。

mvn clean package docker:build

我们会发现终端输出类似于如下的内容:

[INFO] Building image itmuch/microservice-discovery-eureka:0.0.1
Step 1 : FROM java
 ---> 861e95c114d6
Step 2 : ADD /microservice-discovery-eureka-0.0.1-SNAPSHOT.jar //
 ---> 035a03f5b389
Removing intermediate container 2b0e70056f1d
Step 3 : ENTRYPOINT java -jar /microservice-discovery-eureka-0.0.1-SNAPSHOT.jar
 ---> Running in a0149704b949
 ---> eb96ca1402aa
Removing intermediate container a0149704b949
Successfully built eb96ca1402aa

由以上日志可知,我们已成功构建了一个Docker镜像。

(3)执行 docker images 命令,即可查看刚刚构建的镜像。

REPOSITORY                             TAG        IMAGE ID          CREATED             SIZE
itmuch/microservice-discovery-eureka   0.0.1      eb96ca1402aa      39 seconds ago      685 MB

(4) 启动镜像

docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.1

我们会发现该Docker镜像会很快地启动

(5) 访问测试

访问http://Docker宿主机IP:8761 ,能够看到Eureka Server的首页。

插件读取Dockerfile进行构建

之前的示例,我们直接在pom.xml中设置了一些构建的参数。很多场景下,我们希望使用Dockerfile更精确、有可读性地构建镜像。

(1) 首先我们在/microservice-discovery-eureka/src/main/docker 目录下,新建一个Dockerfile文件,例如:

FROM java:8
VOLUME /tmp
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

(2) 修改pom.xml

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>0.4.13</version>
  <configuration>
    <imageName>itmuch/microservice-discovery-eureka:0.0.2</imageName>
    <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
    <resources>
      <resource>
        <targetPath>/</targetPath>
        <directory>${project.build.directory}</directory>
        <include>${project.build.finalName}.jar</include>
      </resource>
    </resources>
  </configuration>
</plugin>

可以看到,我们不再指定baseImage和entrypoint,而是使用dockerDirectory指定Dockerfile所在的路径。这样,我们就可以使用Dockerfile构建Docker镜像了。

将插件绑定在某个phase执行

很多场景下,我们有这样的需求,执行例如mvn clean package 时,插件就自动为我们构建Docker镜像。要想实现这点,我们只需将插件的goal绑定在某个phase即可。

phase和goal可以这样理解:maven命令格式是:mvn phase:goal ,例如mvn package docker:build 。那么,package和docker都是phase,build则是goal 。示例:

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>0.4.13</version>
  <executions>
    <execution>
      <id>build-image</id>
      <phase>package</phase>
      <goals>
        <goal>build</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <imageName>itmuch/microservice-discovery-eureka:0.0.3</imageName>
    <baseImage>java</baseImage>
    <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
    <resources>
      <resource>
        <targetPath>/</targetPath>
        <directory>${project.build.directory}</directory>
        <include>${project.build.finalName}.jar</include>
      </resource>
    </resources>
  </configuration>
</plugin>

由配置可知,我们只需添加如下配置:

<executions>
  <execution>
    <id>build-image</id>
    <phase>package</phase>
    <goals>
      <goal>build</goal>
    </goals>
  </execution>
</executions>

就可将插件绑定在package这个phase上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build 。当然,读者也可按照需求,将插件绑定到其他的phase。

推送镜像

前文我们使用docker push 命令实现了镜像的推送,我们也可使用Maven插件推送镜像。我们不妨使用Maven插件推送一个Docker镜像到Docker Hub。

(1) 修改Maven的全局配置文件setttings.xml,在其中添加以下内容,配置Docker Hub的用户信息。

<server>
  <id>docker-hub</id>
  <username>你的DockerHub用户名</username>
  <password>你的DockerHub密码</password>
  <configuration>
    <email>你的DockerHub邮箱</email>
  </configuration>
</server>

(2) 修改pom.xml,示例:

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>0.4.13</version>
  <configuration>
    <imageName>itmuch/microservice-discovery-eureka:0.0.4</imageName>
    <baseImage>java</baseImage>
    <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
    <resources>
      <resource>
        <targetPath>/</targetPath>
        <directory>${project.build.directory}</directory>
        <include>${project.build.finalName}.jar</include>
      </resource>
    </resources>

    <!-- 与maven配置文件settings.xml中配置的server.id一致,用于推送镜像 -->
    <serverId>docker-hub</serverId>
  </configuration>
</plugin>

如上,添加serverId段落,并引用settings.xml中的server的id即可。

(3) 执行以下命令,添加pushImage的标识,表示推送镜像。

mvn clean package docker:build  -DpushImage

经过一段时间的等待,我们会发现Docker镜像已经被push到Docker Hub了。同理,我们也可推送镜像到私有仓库,只需要将imageName指定成类似于如下的形式即可:

<imageName>localhost:5000/itmuch/microservice-discovery-eureka:0.0.4</imageName>

TIPS

(1) 以上示例中,我们是通过imageName指定镜像名称和标签的,例如:

<imageName>itmuch/microservice-discovery-eureka:0.0.4</imageName>

我们也可借助imageTags元素更为灵活地指定镜像名称和标签,例如:

<configuration>
  <imageName>itmuch/microservice-discovery-eureka</imageName>
  <imageTags>
    <imageTag>0.0.5</imageTag>
    <imageTag>latest</imageTag>
  </imageTags>
  ...
<configuration>

这样就可为同一个镜像指定两个标签。

(2) 我们也可在执行构建命令时,使用dockerImageTags参数指定标签名称,例如:

mvn clean package docker:build -DpushImageTags -DdockerImageTags=latest -DdockerImageTags=another-tag

(3) 如需重复构建相同标签名称的镜像,可将forceTags设为true,这样就会覆盖构建相同标签的镜像。

<configuration>
  <!-- optionally overwrite tags every time image is built with docker:build -->
  <forceTags>true</forceTags>
<configuration>

拓展阅读

(1) Spotify是全球最大的正版流媒体音乐服务平台。

目录
相关文章
|
27天前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
1月前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
1239 29
|
27天前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
1月前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
126 2
|
1月前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
104 1
|
1月前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
62 6
|
1月前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
1月前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
29 4
|
1月前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
69 1
|
27天前
|
API Docker 容器
【赵渝强老师】构建Docker Swarm集群
本文介绍了如何使用三台虚拟主机构建Docker Swarm集群。首先在master节点上初始化集群,然后通过特定命令将node1和node2作为worker节点加入集群。最后,在master节点上查看集群的节点信息,确认集群构建成功。文中还提供了相关图片和视频教程,帮助读者更好地理解和操作。