美文网首页
dockerfile-maven-plugin实战

dockerfile-maven-plugin实战

作者: david161 | 来源:发表于2022-03-04 13:41 被阅读0次

简介

越来越多的项目开始了docker容器化部署的进化,在容器化之前我们部署一个项目,可能由源代码产出一个jar或者war即可直接发布了,启动之后是一个java进程;容器化之后,由源代码产出的是一个docker镜像,而启动的是一个容器。多了这么多步骤是为了容器化之后的运维便利性,从现在来看,容器化是势不可挡的趋势。为了实现的我们CI/CD的终极目标:一键发布,这里介绍一个maven plugin(输入源代码,输出docker镜像)。
作为一个Docker项目,都绕不过Dockerfile文件构建、打标签和发布等操作。如果能够将对Dockerfile文件的这些操作包含进Maven的生命周期管理中,将极大简化Docker项目的构建发布过程。Dockerfile Maven是Spotify公司提供的一款Maven插件(还包含一个Maven扩展),用以辅助Docker项目(借助于Maven管理)进行Dockerfile文件构建、标签和发布。
在实施CI/CD的过程中,实现一键发布用的最多的工具就是Jenkins了,在Jenkins上通过配置将每一个步骤串联起来,现在出现了pipeline让这个过程更简单了,一般的持续集成的流程是:

  1. 从代码仓库下载代码(git或者svn)
  2. 通过工具(maven或者gradle)编译出可执行程序包(jar或者war)
  3. 使用dockerfile配置build出docker镜像
  4. 将docker镜像发布至镜像仓库
  5. 将镜像部署到云平台
  6. 多环境分发镜像
    上述流程在工具齐全的情况下,是相当灵活好用的,公司一般都是这么使用的,而且也能将职责明确。但是当工具不够齐全的时候,或者说个人单打独斗的时候,会使用的工具有限,就寄希望于一个工具能够搞定更多的事情。dockerfile-maven-plugin 就是这样一个maven工具的插件。

设计目标

这是一个将Docker与Maven无缝集成的Maven插件,可以方便地使用Maven打包Docker image。在dockerfile-maven-plugin插件出现之前,还有一个maven插件是docker-maven-plugin,是由同一个作者创造,作者明确表示推荐使用dockerfile-maven-plugin,并会持续升级;而docker-maven-plugin不在添加任何新功能,只接受修复bug。两个插件的设计思想是有差别的,前者需要独立编写Dockerfile文件,后者允许没有Dockerfile文件,所有的docker相关配置都写在pom文件的plugin中,这样使maven插件显得很笨重,并且如果脱离了这个maven插件还得重写编写Dockerfile,不够灵活。
1)不要试图做任何事情。 这个插件使用Dockerfiles构建Docker项目的而且是强制性的。
2)将Docker构建过程集成到Maven构建过程中。如果绑定默认phases,那么当你键入mvn package时,你会得到一个Docker镜像。 当你键入mvn deploy时,你的图像被push。
3)让goals记住你在做什么。 你可以输入 mvn dockerfile:build及后面的 mvn dockerfile:build和mvn dockerfile:push 都没有问题。这也消除了之前像 mvn dockerfile:build -DalsoPush这样的命令;相反,你可以只使用 mvn dockerfile:build dockerfile:push。
与Maven build reactor集成。你可以在一个项目中依赖另一个项目所构建的Docker image,Maven将按照正确的顺序构建项目。当你想要运行涉及多个服务的集成测试时,这非常有用。

版本说明

老版本
插件名称: 
docker-maven-plugin 

github官网地址: 
https://github.com/spotify/docker-maven-plugin
最新版本
<dependency> 
    <groupId>com.spotify</groupId> 
    <artifactId>docker-maven-plugin</artifactId> 
    <version>1.2.2</version> 
</dependency>
新版本

该插件需要Java 7或更高版本以及Apache Maven 3或更高版本。要运行集成测试或在开发中使用该插件,需要有一个能正常工作的Docker。Docker已经允许远程连接访问。dockerfile-maven-plugin要求用户必须提供Dockerfile用于构建镜像,从而将Docker镜像的构建依据统一到Dockerfile上,这与过时的docker-maven-plugin是不同的。

插件名称: 
dockerfile-maven-plugin github

官网地址: 
https://github.com/spotify/dockerfile-maven
最新版本
官网很久没有更新新版本 
<dependency> 
    <groupId>com.spotify</groupId> 
    <artifactId>dockerfile-maven-plugin</artifactId> 
    <version>1.4.13</version> 
</dependency>

docker-maven-plugin插件

推荐大家在学习之前对jenkinsmater-153、jenkinsagent-154、gitlab-152三台服务器进行快照保存操作。

idea集成docker

idea安装docker插件。Dockerfile、docker-compose.yml文件大部分内容会有提示信息。方便开发人员编写配置文件。

官网地址: https://plugins.jetbrains.com/plugin/7724-docker/versions
jenkinsagent-154配置

修改jenkinsagent-154服务器docker.service服务信息,允许其他主机远程访问154服务器的docker。

vi /usr/lib/systemd/system/docker.service 
在ExecStart行最后增加,开放远程主机访问权限。 
-H tcp://0.0.0.0:2375 

最后增加修改内容如下: 
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375

重启docker 
systemctl daemon-reload
systemctl restart docker 

查看docker进程,发现docker守护进程在已经监听2375的tcp端口 
ps -ef|grep docker 

查看系统的网络端口,检查tcp的2375端口,docker的守护进程是否监听 
netstat -tulp

配置idea

配置插件
settings->build execution...->docker->点击"+"按钮,新增jenkinsagent-154服务器docker 
配置信息 

配置内容如下: 
name:jenkinsagent-154 
TCP Socket: 
    Engine API URL:tcp://192.168.198.154:2375 
配置成功后,会在下方显示connection successful
image.png
操作docker

配置成功后,会在idea开发工具下方窗口"8.services"里显示信息,右键点击connect。连接成功可以查看到container和images等信息。可以对container和images进行各种相关操作。


image.png

新建微服项目

新增jenkinsdemo1工程。

pom.xml文件
<build> 
    <finalName>${project.artifactId}</finalName> 
    <plugins> 
        <plugin> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-maven-plugin</artifactId> 
        </plugin> 

        <plugin> 
            <groupId>com.spotify</groupId> 
            <artifactId>docker-maven-plugin</artifactId> 
            <version>1.2.2</version> 
            <configuration> 
                 <!--修改imageName节点的内容,改为私有仓库地址和端口,再加上镜像id和 TAG,我们要直接传到私服-->
                 <!--配置最后生成的镜像名,docker images里的,我们这边取项目名:版本--> 
                <imageName>${project.build.finalName}:${project.version}</imageName>
                <!--也可以通过以下方式定义image的tag信息。 
                <imageTags> 
                    <imageTag>1.0</imageTag>
                </imageTags> --> 
                <!--来指明Dockerfile文件的所在目录--> 
                <dockerDirectory>${project.basedir}</dockerDirectory> 
                <dockerHost>http://192.168.198.154:2375</dockerHost>
                <!--入口点,project.build.finalName就是project标签下的build标签下 的filename标签内容,testDocker--> 
                <!--相当于启动容器后,会自动执行java-jar/testDocker.jar-->
                <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
               <!--是否推送到docker私有仓库,旧版本插件要配置maven的settings文件。 小伙伴们可以自行查阅资料研究一下。 
               <pushImage>true</pushImage>
               <registryUrl>192.168.198.155:5000/lagouedu</registryUrl> --> <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
               <resources> 
                   <resource> 
                       <targetPath>/</targetPath> 
                       <directory>${project.build.directory}</directory> 
                       <!--把哪个文件上传到docker,相当于Dockerfile里的add app.jar /--> 
                       <include>${project.build.finalName}.jar</include> 
                   </resource> 
                </resources> 
             </configuration> 
          </plugin> 
       </plugins> 
</build>
Dockerfile
FROM openjdk:8-alpine3.9 
# 作者信息 
MAINTAINER laosiji Docker springboot "laosiji@lagou.com" 
# 修改源 
RUN echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > 
/etc/apk/repositories && \ 
     echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >> 
/etc/apk/repositories 

# 安装需要的软件,解决时区问题 
RUN apk --update add curl bash tzdata && \ 
    rm -rf /var/cache/apk/* 
#修改镜像为东八区时间 
ENV TZ Asia/Shanghai 
ADD /target/jenkinsdemo1.jar app.jar 
EXPOSE 8080 
ENTRYPOINT ["java","-jar","/app.jar"]
controller
@RestController 
public class JenkinsDemoController { 
    @GetMapping("/") 
    public String hello() { 
        return "idea docker docker-maven-plugin hello!!!"; 
    } 
}
打包部署
idea在ternimal窗口中运行如下命令 
mvn clean package -Dmavn.test.skip=true docker:build
在idea中运行容器
使用idea与docker集成插件生成容器。

相关文章

网友评论

      本文标题:dockerfile-maven-plugin实战

      本文链接:https://www.haomeiwen.com/subject/fnbyrrtx.html