dockerfile-maven-plugin实战
简介
越来越多的项目开始了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让这个过程更简单了,一般的持续集成的流程是:
- 从代码仓库下载代码(git或者svn)
- 通过工具(maven或者gradle)编译出可执行程序包(jar或者war)
- 使用dockerfile配置build出docker镜像
- 将docker镜像发布至镜像仓库
- 将镜像部署到云平台
- 多环境分发镜像
上述流程在工具齐全的情况下,是相当灵活好用的,公司一般都是这么使用的,而且也能将职责明确。但是当工具不够齐全的时候,或者说个人单打独斗的时候,会使用的工具有限,就寄希望于一个工具能够搞定更多的事情。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集成插件生成容器。