微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤为是在服务部署和服务监控上。单体应用是集中式的,就一个单体跑在一块儿,部署和管理的时候很是简单,而微服务是一个网状分布的,有不少服务须要维护和管理,对它进行部署和维护的时候则比较复杂。java
下面从Dev的角度来看一下Ops的工做。从Dev提交代码,到完成集成测试的一系列步骤以下:docker
整个过程都是自动的,这样就简化了本来复杂的集成工做,一天能够集成一次,甚至是屡次。微信
本文主要关注的第二步,做为Dev使用Maven插件构建Docker镜像。架构
笔者的电脑系统是MacOS,在进行下面的步骤以前,先具有一下条件:app
Maven 和JDK 就不用过多多了,必须具备的。Docker Registry是私有的hub,mac上装好docker以后,配置一下Docker Registry的地址,配置以下:运维
由于docker默认须要私服作https支持,我这边以前有个私服作了https支持,因此我这里就不须要配置了maven
pom文件中须要引入相应的插件。docker-maven-plugin有三款:spotify、fabric8io和bibryam。其中第一款最为流行,资料也多,因此坚决果断选择第一款。插件有两种使用方式,一种是在直接在pom配置中指定baseImage和entryPoint。另外一种适合于复杂的构建,使用dockerfile,只须要在配置中指定dockerfile的位置。前一种比较简单,此处略过,主要讲下第二种的配置微服务
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${maven.docker.version}</version>
<!--插件绑定到phase-->
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--配置变量,包括是否build、imageName、imageTag,很是灵活-->
<skipDocker>${docker.skip.build}</skipDocker>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<!--最后镜像产生了两个tag,版本和和最新的-->
<imageTags>
<imageTag>${project.version}</imageTag>
<imageTag>latest</imageTag>
</imageTags>
<forceTags>true</forceTags>
<env>
<TZ>Asia/Shanghai</TZ>
</env>
<!--时区配置-->
<runs>
<run>ln -snf /usr/share/zoneinfo/$TZ /etc/localtime</run>
<run>echo $TZ > /etc/timezone</run>
</runs>
<dockerDirectory>${project.basedir}</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!--push到私有的hub-->
<serverId>docker-registry</serverId>
</configuration>复制代码
</plugin>
复制代码
${maven.docker.version}
、${docker.skip.build}
、${docker.image.prefix}
都是可配置的变量。${project.basedir}
、${project.build.directory}
、${project.build.finalName}
、${project.version}
分别对应项目根目录、构建目录、打包后生成的结果名称、项目版本号。上面的pom插件配置,指定了dockerfile的位置和镜像的命名规则。并将docker的build目标,绑定在install这个phase上。测试
FROM java:8复制代码
COPY target/maven-docker-image-0.0.1-SNAPSHOT.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar" ,"/app.jar"]复制代码
在pom插件中,还有一个serverId的配置。这个配置是必要的,对于须要将image上传到私有hub上,在如上配置以后,只须要加上-DpushImage便可实现。serverId是与maven的配置文件setting.xml相对应,setting.xml中增长的配置:ui
<server>
<id>docker-registry</id>
<username>用户名</username>
<password>密码</password>
<configuration>
<email>邮箱</email>
</configuration>
</server>复制代码