文档章节

一个Docker的maven插件

翟志军
 翟志军
发布于 2014/04/02 15:45
字数 571
阅读 3830
收藏 65

什么是Docker

Docker最近在业内非常火。如果你现在还不知道Docker是什么,你可要小心喽。今后,你会发现自己正在以某种方式使用它。本文假设你已经有了Docker的基础。如果你现在对它还不是很熟悉,我确定你以后还会来读这篇文章。

Docker用于集成测试、复杂分布式系统演示,非常理想。甚至可以用于运行生产环境下的系统。它是一个开源的软件容器。你可以把它想像成一个非常轻的超级快的虚拟机。

例子

得到"Integration testing with Maven and Docker"文章和Docker Java API项目的启发,我写了一个简单的可以管理Docker容器maven插件,Docker Maven Plugin。这个插件将会根据你的配置,在构建时启动容器,构建结束时停止容器并删除,如果本地找不到镜像,Docker会自动去中央仓库下载。

以下与Apache Camel的集成测试是被忽略的,因为测试需要一个Redis实例才可以执行:

	package org.apache.camel.component.redis;
	 
	import org.apache.camel.impl.JndiRegistry;
	import org.junit.Ignore;
	import org.junit.Test;
	import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
	import org.springframework.data.redis.core.RedisTemplate;
	 
	@Ignore
	public class RedisProducerIntegrationTest extends RedisTestSupport {
		private static final JedisConnectionFactory CONNECTION_FACTORY = new JedisConnectionFactory();
	 
		static {
			CONNECTION_FACTORY.afterPropertiesSet();
		}
	 
		@Override
		protected JndiRegistry createRegistry() throws Exception {
			JndiRegistry registry = super.createRegistry();
			redisTemplate = new RedisTemplate();
			redisTemplate.setConnectionFactory(CONNECTION_FACTORY);
			redisTemplate.afterPropertiesSet();
	 
			registry.bind("redisTemplate", redisTemplate);
			return registry;
		}
	 
		@Test
		public void shouldSetAString() throws Exception {
			sendHeaders(
			        RedisConstants.COMMAND, "SET",
			        RedisConstants.KEY, "key1",
			        RedisConstants.VALUE, "value");
	 
			assertEquals("value", redisTemplate.opsForValue().get("key1"));
		}
	 
		@Test
		public void shouldGetAString() throws Exception {
			redisTemplate.opsForValue().set("key2", "value");
			Object result = sendHeaders(RedisConstants.KEY, "key2", RedisConstants.COMMAND, "GET");
	 
			assertEquals("value", result);
		}
	}

我们配置docker-maven-plugin使用一个Redis镜像同时让主机的6379端口映射到容器的6379端口:

	<plugin>
		<groupId>com.ofbizian</groupId>
		<artifactId>docker-maven-plugin</artifactId>
		<version>1.0.0</version>
		<configuration>
			<images>
			    <image>
			        <name>dockerfile/redis</name>
			        <hostConfig>
			            <![CDATA[
			                {
			                    "PortBindings": {
			                        "6379/tcp": [
			                            {
			                                "HostIp": "0.0.0.0",
			                                "HostPort": "6379"
			                            }
			                        ]
			                    }
			                }
			        ]]>
			        </hostConfig>
			    </image>
			</images>
		</configuration>
		<executions>
			<execution>
			    <id>start-docker</id>
			    <phase>pre-integration-test</phase>
			    <goals>
			        <goal>start</goal>
			    </goals>
			</execution>
			<execution>
			    <id>stop-docker</id>
			    <phase>post-integration-test</phase>
			    <goals>
			        <goal>stop</goal>
			    </goals>
			</execution>
		</executions>
	</plugin>

插件在编译期启动一个Docker容器,然后在集成测试结束期关闭容器。

这是一个非常简单的例子,但是这个插件支持更多的场景,如多镜像不同配置;将启动/关闭容器动作定义在不同的maven构建期间。Enjoy.

© 著作权归作者所有

共有 人打赏支持
翟志军

翟志军

粉丝 348
博文 76
码字总数 79851
作品 2
深圳
程序员
私信 提问
加载中

评论(9)

翟志军
翟志军

引用来自“新人王”的评论

小翟,我来支持一下!!!
soga
新人王
新人王
小翟,我来支持一下!!!
hotdancing
hotdancing
不明觉厉
izee
izee
不明觉厉
盈耳
盈耳
不明觉厉
Leon_wy
Leon_wy
不觉明厉0
snowdream
snowdream
不明觉厉,顺便写个gradle的插件呗
puras
puras
不明觉厉
快速构建docker镜像:maven插件

越来越多的项目开始了docker容器化部署的进化,在容器化之前我们部署一个项目,可能由源代码产出一个jar或者war即可直接发布了,启动之后是一个java进程;容器化之后,由源代码产出的是一个d...

rabbitGYK
04/15
0
0
微服务部署之Maven插件构建Docker镜像

1.背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上。单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非...

aoho
2017/11/03
0
0
spring-boot项目的docker集成化部署

spring-boot项目的docker集成化部署 [toc] 前言 据说流行的微服务和docker一起,更配哦!接下来,使用简单spring-boot项目演示docker的集成化部署的案例,在看过微笑的博客觉得不过瘾,自己动...

weir_will
10/06
0
0
实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署

最初在tomcat上部署web应用的方式,是通过maven的maven-compiler-plugin插件先打成war包,再将war包复制到tomcat的webapps目录下,后来用上了tomcat7-maven-plugin插件,可以直接在maven上编...

boling_cavalry
2017/04/15
0
0
为 Java 应用构建容器镜像 - Jib

Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库,以 Maven 和 Gradle 插件形式提供。 通过 Jib,Java 开发者可以使用他们熟悉的 Java 工具来构建容器。Jib 是一个快...

匿名
07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue + Vue-CLI + Mint-UI 移动端开发新手示例实战 - by dogstar

Vue + Vue-CLI + Mint-UI 移动端开发新手示例实战 - by dogstar 项目源代码,在码云上:https://gitee.com/dogstar/a-vue-mint-demo 快速使用 # 安装依赖npm install# 本地开发调试 lo...

暗夜在火星
28分钟前
1
0
Docker 的 Web 管理工具 DockerFly

Dockerfly是基于 Docker1.12+ (Docker API 1.24+) 开发出Docker 管理工具,提供里最基本的基于 Docker 的管理功能,目的是能够方便广大Docker初学者以及 Docker 管理员能够快速的进行Docker 容...

linuxprobe16
30分钟前
2
0
java.util.concurrent.atomic.AtomicBoolean 源码

类图: 源码: package java.util.concurrent.atomic;import sun.misc.Unsafe;public class AtomicBoolean implements java.io.Serializable { private static final long ser......

狼王黄师傅
34分钟前
2
0
msql创建视图笔录

由于之前写视图都没有记录,这次客户公司要求我写三张视图,却发现自己忘了咋写的!于是有去百度了下,分分钟搞定了。但是,个人还是做个笔录吧!以后不用去看别人的写法咯。 #车辆会员查询...

em_aaron
44分钟前
3
0
年终回顾,为你汇总一份「后端架构技术清单」

2018年马上就要过去了说说我这一年的感想吧 很多人做Java开发3,4年后,都会感觉自己遇到瓶颈。什么都会又什么都不会,如何改变困境,为什么很多人写了7,8年代码还是一个码农,工作中太多被动...

James-
46分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部