您的位置:首页 > 运维架构 > Docker

二. Spring Boot使用DockerFile maven插件自动化部署

2018-01-09 18:19 1481 查看
二. Spring Boot使用DockerFile maven插件自动化部署

前置条件

服务器上Docker安装成功

Docker开启远程访问

客户机配置好DOCKER_HOST环境变量

上面三个步骤前文已介绍过。

插件介绍

Maven有个插件,叫dockerfile-maven-plugin,这是它的地址 ,它会连接远程Docker,只要一个命令就能把本地的jar包打成Docker镜像,命令执行完毕后,服务器上就会有刚打包好的镜像,此时再执行该镜像即可。

对了,它有个前生哥哥,叫docker-maven-plugin,同一个作者出品,同一个味道。百度“Spring Docker”除了Spring自家demo,其它大部分都是用这个老插件实现。这个老插件允许没有DockerFile,相关配置参数全部写在pom.xml中。后来作者觉得这样不好,很多人因此都不写DockerFile了,然后又搞的他更新这个插件很累,因为得时时同步DockerFile的新特性(他本人没说过后半句话,我臆测的-_-),所以作者废弃了它,重写了这个dockerfile-maven-plugin插件。

下面以部署EUREKA服务为例

配置步骤

pom文件配置

eureka项目下的pom.xml加上dockerfile插件,目前最新版本是1.3.7

<properties>

<docker.image.prefix>demo</docker.image.prefix> <!--镜像前缀,随便取-->

</properties>

<build>

<plugins>

<plugin>

<groupId>com.spotify</groupId>

<artifactId>dockerfile-maven-plugin</artifactId>

<version>1.3.7</version>

<!--放开这块注释,则运行mvn deploy命令就会打包镜像<executions>-->

<!--<execution>-->

<!--<id>default</id>-->

<!--<goals>-->

<!--<goal>build</goal>-->

<!--<!–<goal>push</goal>–>-->

<!--</goals>-->

<!--</execution>-->

<!--</executions>-->

<configuration>

<repository>${docker.image.prefix}/${project.artifactId}</repository>

<buildArgs>

<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>

</buildArgs>

</configuration>

</plugin>

</plugins>

</bulid>


DockerFile配置

在项目目录下添加一个DockerFile文件,镜像文件该打成什么样子的就是读取这个文件中的配置,位置如下:



DockerFile文件内容如下:

FROM java:8
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8800
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]


上面各个参数的含义,在这里有很权威的解释,我就不翻译了。

上面DockerFile中由于用了java:8的layer层,本身它就有600多M,所以打出来的镜像肯定是超600M的,如果想瘦身一点,可以替换成openjdk,参照spring 官网写的spring boot docker demo

打包镜像切到eureka项目目录下,执行如下命令:

mvn package -DskipTests
mvn dockerfile:build


第一条命令就是普通的打包命令,是个码农就会。

第二条命令就是这个插件提供的命令,连接远程Docker环境将本地jar包打成镜像文件。命令执行完后,镜像文件就会在服务端

镜像运行

登录Docker服务器,先查看刚才打的镜像是否存在

sudo docker images




java:8是我们镜像依赖的layer,是在执行mvn dockerfile:build命令的时候pull下来的。

执行运行镜像命令

sudo docker run --name discovery -p 8800:8800 -d --it 镜像名


启动参数解释:

–name: 指定容器名,可省略

-p: 容器端与宿主端口绑定,不可省略,否则容器外应用没法访问这个应用

-d: 后台运行

最后执行下面命令查看容器是否启动成功

sudo docker ps


遇到的坑

运行mvn dockerfile:build时会报错,ARG这个参数解析不了,原因是Docker engine版本太老了,重装个新的。可以用官方推荐的脚本安装

curl -fsSL get.docker.com -o get-docker.sh
./get-docker.sh


PS:使用Docker部署微服务过程中,最重要的一个问题还没讲,就是容器间的通信,本例用的是Eureka,如果部署的是需要注册到eureka的微服务,又或者是需要和zuul容器通信的各个微服务,如何处理通信,毕竟使用Docker后,容器间相互隔离,不能简单的用之前的方式ip:port去注册连接。这个准备放到下一篇文单独讲
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: