maven 构建 docker 镜像三部曲之二:编码和构建镜像
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
在《maven构建docker镜像三部曲之一:准备环境》中,我们在 vmware 上准备好了 ubuntu16 虚拟机,并且装好了 docker、jdk8、maven 等必备工具,现在我们来开发一个 java web 工程,再用 docker-maven-plugin 插件来构建本地的 docker 镜像;
web 工程
我们采用 spring boot 的 web 工程作为实战的应用,这样的好处是简单快速的创建和部署项目,这只是个最简单的、基于 maven 构建的 spring boot web 工程,源码我已经上传到 github 上,地址是:git@github.com:zq2599/blog_demos.git,浏览器访问地址是:https://github.com/zq2599/blog_demos, 这里面有多个工程,本次实战用到的是 mavendockerplugindemo,如下图红框所示:
java 代码
mavendockerplugindemo 工程的代码非常简单,只有一个 controller,如下图:
pom.xml
整个工程的 pom.xml 也很简单,依赖 spring-boot-starter-web,构建的时候使用 spring-boot-maven-plugin 插件,如下:
正常情况下,工程运行起来后在浏览器访问 http://x.x.x.x:8080,就会显示如下信息(x.x.x.x 代表执行工程的机器 ip):
将工程复制到 linux 虚拟机上
在上一章在《maven构建docker镜像三部曲之一:准备环境》我们将虚拟机的 docker、jdk、maven 等环境都准备好了,现在将 spring boot 工程放到虚拟机上,然后就能用 maven 来构建了;
在 windows 电脑上,我将工程压缩成 mavendockerplugindemo.zip 文件,存放在 D:\blog 目录下;
在 linux 虚拟机新建目录**/usr/local/work**;
在 linux 虚拟机执行命令 apt-get install -y unzip,安装解压工具;
复制文件,推荐使用 SecureCRT 的 SFTP 工具,先用 SecureCRT 登录虚拟机,再建立 SFTP 连接,如下图红框所示:
在 SFTP 窗口执行以下命令:
这样就能将文件从 windows 电脑传到 linux 虚拟机上,如果想把 linux 虚拟机上的 xxx 文件下载到 windows 电脑,执行 get xxx 命令即可;
关闭 SFTP 窗口,在 ssh 窗口进入/usr/local/work/,执行命令 unzip mavendockerplugindemo.zip 将工程解压缩;
请注意:接下来的操作都在 linux 虚拟机上进行;;
镜像构建方式
docker-maven-plugin 插件构建 docker 镜像有两种方式:
指定参数,由 docker-maven-plugin 插件根据这些参数来制作镜像;
指定 Dockerfile,这和我们用 docker build 命令来构建镜像的过程一样,不过 docker-maven-plugin 帮我们把工程构建和镜像构建两件事串起来了;
接下来我们将上述两种方式都实践一下;
第一种构建方式:通过参数构建
在 mavendockerplugindemo 工程目录下新建文件 pom_1_by_param.xml,内容和 pom.xml 一样,然后我们再去<plugins>节点添加以下内容,放在原有的<plugin>节点后面,如下所示:
上面的每个参数都已加了注释,就不多说了,在此文件所在目录执行以下命令,指定 pom_1_by_param.xml 作为 pom 文件执行 maven 构建:
执行成功后输出以下信息:
执行 docker images 命令可以看到如下信息,新的镜像已经创建好了:
为什么会有两个名为 mavendockerplugindemo 的镜像呢?看一下 maven 的构建日志,有下面这么一句:
原来是以构建好的 latest 镜像的基础,按照我们的配置上做了一次 TAG 操作,本身镜像是同一个(IMAGE ID 相同);
验证第一种方式构建的镜像
执行以下命令,使用刚刚构建的镜像创建一个容器:
启动信息如下所示:
我这里 linux 虚拟机的 IP 是 192.168.119.155,所以在 windows 上打开浏览器,输入地址:192.168.119.155:8080,看到如下效果,web 项目正常启动:
第二种构建方式:指定 Dockerfile
这种方式要我们自己写 Dockerfile,好处是可以按照自己的需要在 Dockerfile 中添加更多内容,而不像第一种方式那样只能按照插件的参数规则来配置;
先把之前的容器停掉,现在虚拟机的控制台应该还是刚刚我们启动的容器的输出,键入“Ctrl + c”退出此容器,这样才会解除 8080 端口的占用;
在 mavendockerplugindemo 工程目录下新建文件 pom_2_by_dockerfile.xml,内容和 pom.xml 一样,然后我们再去<plugins>节点添加以下内容,放在原有的<plugin>节点后面,如下所示:
和之前的 pom_1_by_param.xml 相比有如下变动:
新增<dockerDirectory>节点用来表示自定义 Dockerfile 文件的位置;
<baseImage>和<entryPoint>节点用不上了,在此删掉;
为了和第一种构建结果区分开,把 pom_2_by_dockerfile.xml 中定义的工程版本号从 0.0.1-SNAPSHOT 改为 0.0.2-SNAPSHOT,如下所示:
在工程的 src/main/docker/目录下新建 Dockerfile 文件,如下图:
Dockerfile 的内容如下,就是将工程构建完毕后的 jar 包复制到 home 目录,然后构建镜像:
可以开始构建了,在 pom_2_by_dockerfile.xml 所在目录执行以下命令:
会看到如下输出信息:
输入 docker images 命令,看到的信息如下,镜像已经在本地了:
验证第二种方式构建的镜像
执行以下命令,使用刚刚构建的镜像创建一个容器:
再去 windows 的浏览器上访问 http://192.168.119.155:8080/, 可以看到和之前一样的信息,如果您不放心,也可以自己修改工程的 controller 源码,再构建验证是否生效;
至此,我们通过两种方式构建本地 docker 镜像的实战就结束了,但镜像停留在本地,只能手工 push 到公有或者私有仓库才能给其他人使用,在下一章我们就来体验 docker-maven-plugin 插件的推送能力,将本地镜像推送到私服,这样就能将项目编译构建、镜像构建、镜像推送等环节集成在一次构建中完成;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/46de68780568408f90ab29565】。文章转载请联系作者。
评论