文档章节

一个Docker的maven插件

翟志军
 翟志军
发布于 2014/04/02 15:45
字数 571
阅读 3.9K
收藏 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.

© 著作权归作者所有

翟志军

翟志军

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

评论(9)

翟志军
翟志军 博主

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

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

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

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

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

aoho
2017/11/03
0
0
docker与Spring boot的集成:docker-maven-plugin使用

使用Spring Boot编写了一个微服务后,如何将构建应用并打包成docker镜像,推送到docker仓库,以供测试环境测试。 docker-maven-plugin插件可以完成这项任务。 最近使用了docker-maven-plugin...

osc_cnd9jz7d
01/07
35
0
spring-boot项目的docker集成化部署

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

weir_will
2018/10/06
0
0
SpringBoot中使用Maven插件,上传docker镜像

开启docker远程端口 我上一篇里面写了,这里暴露的路径: 简单构建 配置文件 在properties中增加一行指定远程主机的位置 增加一个plugin 或者就用一个整个,dockerHost配置设置在插件里面: ...

osc_iprq7rwl
2019/09/18
4
0

没有更多内容

加载失败,请刷新页面

加载更多

程序远自我修养

详见: https://leohxj.gitbooks.io/a-programmer-prepares/content/pm/good-product-manager.html

郭恩洲_OSC博客
41分钟前
15
0
使用git clone命令克隆文件出现error: RPC failed相关错误

使用git clone命令克隆文件出现error: RPC failed; curl 18 transfer closed with outstanding read data remain问题 笔者最近在使用git clone命令从github克隆源码到电脑时出现了以下问题 ...

独钓渔
今天
22
0
Java中JNI的使用详解第三篇:JNIEnv类型中方法的使用

在来看一下C++代码: #include<iostream.h> #include "com_jni_demo_JNIDemo.h" JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj) { //获取obj中对象......

天王盖地虎626
今天
21
0
直播撬动618变局:抖快凶猛、商家清醒

  文/鸿键   来源:深响(ID:deep-echo)   核心要点   直播带货热潮持续升温,今年的传统电商大促节 618 成了第一个“全民直播”的 618,直播带货不仅为电商带来增量,同时也搅动着行...

计算无敌
今天
30
0
《一天一模式》— 观察者模式

一、观察者模式的概念 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题...

XuePeng77
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部