小强哥博客

小强哥,小强哥博客,技术大咖

springboot in docker

现在docker越来越流行,似乎不管什么东西都想往docker里面放,像kafka in docker,mysql in docker,nginx in docker,这篇文章记录下springboot in docker。

文章内容需要你对docker容器技术有一定的了解,如docker pull、docker registry、docker build、docker run。

假设有那么一个场景,我在本地开发一个springboot程序,然后将代码提交到了git上,通过docker做将springboot程序成一个image,然后可以在任何一个带有docker引擎的机器上运行这个springboot程序。

我目前找到的有2种实现方式,方案A是spring官方提供的Spring Boot with Docker,方案B是自己编写dockerfile来构建docker image,后面会介绍这两种方式。

方案A

spring官方提供了Spring Boot with Docker方式可以制作docker image,如下是它的dockerfile,

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD gs-spring-boot-docker-0.1.0.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

从dockerfile可以看到它在制作image的时候是先将gs-spring-boot-docker-0.1.0.jar生成,然后通过add指令添加到image中,然后制作镜像,这种做法是官方提供的,详细的可以参考上面的文档。

方案B

自己编写dockerfile,包含git上拉取代码、maven打包、启动程序等,如下,

FROM centos
RUN yum -y update \
    && yum -y install git maven \
    && git http://xxx.git.com/xxx.git
RUN cd /xxx \
    && mvn clean package -Dmaven.test.skip=true
ENTRYPOINT java -jar /xxx.jar

dockerfile很简单,然后使用docker build,命令进行镜像制作。

总结,这两种方式最终的结果一样,都是能够成功的build出image,但是还是存在一定差异,

  1. 方案A需要在程序中配置一些docker相关的内容,并且引入一些jar,相比于方案B来说存在代码起侵入性。
  2. 由于使用了ADD指令,在执行方案A的dockerfile的时候始终需要保持gs-spring-boot-docker-0.1.0.jar的存在,相比于方案B来说完全是多余的。
  3. 假设我们的程序不是java程序了,不是springboot了,那么方案A就没法实施了,而方案B却依然可以继续实施,只是打包、启动的过程发生了变化。

基于以上几点分析我个人强烈推荐使用方案B。