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

二. 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>-->
    <!--&lt;!&ndash;<goal>push</goal>&ndash;&gt;-->
    <!--</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
  • 遇到的坑
    1. 运行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去注册连接。这个准备放到下一篇文单独讲

猜你喜欢

转载自blog.csdn.net/liubingyu12345/article/details/79015966