使用Dockerfile依赖maven基础镜像部署springboot的程序案例

1、准备springboot Demo代码

  • 就一个controller层代码,返回当前时间及hello world

使用Dockerfile依赖maven基础镜像部署springboot的程序案例_第1张图片

2、项目根目录下,新建DockerFile文件

  • 注意,等本地配置完毕后,Dockerfile文件需要与项目helloworld同级,这里先放项目里面

使用Dockerfile依赖maven基础镜像部署springboot的程序案例_第2张图片

3、docker hub找mevn的linux镜像名称

官网地址:http://hub.docker.com

我打不开官网,用了这个:

Docker Maven镜像tag

4、编写DockerFile

  • 注意:执行Dockerfile时,该文件必须与项目helloworld在同一级目录
#请把DokcerFile 放至helloworld同级目录
#来源的基础镜像,这里不需要单独FROM JDK,因为maven镜像里面附带了JDK
FROM maven:alpine
#作者
LABEL authors="shuizhu"

#指定环境变量url为/usr/helloworld
ENV url /usr/helloworld

#指定容器的工作目录
WORKDIR ${url}

#复制helloworld下的所有文件到镜像中的/usr/helloworld目录中
COPY helloworld /usr/helloworld

#把maven镜像中的maven配置文件settings.xml,替换为自己的settings.xml,为了加快下载
COPY helloworld/settings.xml /usr/share/maven/conf/settings.xml

#MVN 打包
RUN ["mvn","package"]

#执行java -jar启动命令
ENTRYPOINT ["java", "-jar","target/helloworld-0.0.1-SNAPSHOT.jar"]

5、Dockerfile使用的参数详解

RUN
  • 镜像构建时,执行的命令,会生成新镜像层,一般用于:yum安装源、MVN构建、下载或配置,chmod授权
CMD
  • 容器启动时执行的命令,若容器run时(docker run),附带有启动参数,那么CMD不会执行
  • 当CMD与ENTRYPOINT共存时,CMD会当做参数,传递给ENTRYPOINT(相当于字符串,拼接到ENTRYPOINT后)
ENTRYPOINT
  • 容器启动时执行的命令,若容器run时(docker run),附带有启动参数,那么参数会拼接到ENTRYPOINT后面
RUN、CMD、ENTRYPOINT总结

1> dockerfile存在多个CMD或ENTRYPOINT时,只会执行最后一个CMD或ENTRYPOINT

2> RUN可以存在多个,且都会执行

3> 当CMD与ENTRYPOINT共存时,CMD会当做参数,传递给ENTRYPOINT(相当于字符串,拼接到ENTRYPOINT后),因此,不需要变动的参数我们一般写到ENTRYPOINT中,需要变动的参数一般写到CMD中,传递给ENTRYPOINT

4> 当docker  run时附带有启动参数,那么CMD不会执行,且启动参数会附带在ENTRYPOINT后面

5> 三种语法相同:

  • 方式一:RUN  ["值1","值2",...] ,推荐使用这种方式,该方式会被解析为JSON数组,必须使用双引号
  • 方式二:RUN  值1  值2  ....
COPY
  • 语法:COPY   目录或普通文件   路径
  • 当COPY的为目录时,不会复制目录本身,只会复制其内容
 ADD
  • 语法:ADD    目录或普通文件/压缩文件等特殊文件/链接 路径
  • 压缩文件CPOY后,镜像内会自动解压
  • 当为目录时,不会复制目录本身,只会复制其内容
COPY 与ADD总结
  1. docker都是根据上下文去构建容器的,因此第一个参数不能出现../(容器会找不到),可以出现 ./ 表示当前目录
  2. ADD是COPY的增强版

6、复制项目文件到linux

把项目文件helloworld上传到服务器任意目录

使用Dockerfile依赖maven基础镜像部署springboot的程序案例_第3张图片

7、移动Dockerfile

网上的教程都是直接上传jar文件的,Dockerfile里面直接去执行jar即可

我这需要对springboot项目进行打包,再运行,这个操作都是在docker容器中进行的,而Dockerfile在项目中,而我没办法在dockerfile  COPY时去操作上层目录helloworld,因此我在构建镜像前,把Dockerfile移到helloworld同一目录。

如下:

使用Dockerfile依赖maven基础镜像部署springboot的程序案例_第4张图片

8、构建镜像

  • 需要确保helloworld文件中有settings.xml文件,否则镜像构建时,会使用默认maven下载链接,构建会很久甚至失败

在Dockerfile目录中,执行:

docker build -t mydemo:v1.0 .

-t:tag标签,对构建的镜像打标签,格式:镜像名称:版本

ps:RUN  ["mvn" , "package"]:RUN是在镜像构建时执行的,因此在构建时,package动作会很久,正常的云环境中,这一步骤一般是交给jenkins实现的

构建用了201s,大部分时间花费在maven打包上,而且这还是在使用阿里maven仓库的基础上.....

使用Dockerfile依赖maven基础镜像部署springboot的程序案例_第5张图片

9、查看构成成功的镜像

docker images

使用Dockerfile依赖maven基础镜像部署springboot的程序案例_第6张图片

10、启动镜像

docker run -d -p 8080:8080 --name helloworld mydemo:v1.0

-d:后台运行

-p 8080:8080:docker容器中的8080端口与宿主机的8080端口映射

--name helloworld:给启动的镜像容器命名为helloworld

mydemo:v1.0:需要启动的镜像是哪个

执行后,使用 docker ps 查看正在运行的容器

使用Dockerfile依赖maven基础镜像部署springboot的程序案例_第7张图片

11、查看镜像启动日志

docker logs helloworld

 得知:镜像启动时(docker  run),执行了Dockerfile中的ENTRYPOINT命令,去启动了springboot项目

12、访问镜像

  • 我们springboot项目存在一个/hello接口
  • 需确保linux开放了8080端口,否则外部访问不到
  • 我这里使用的是腾讯云云服务器,直接通过  http://ip:8080/hello  访问即可

如下:

使用Dockerfile依赖maven基础镜像部署springboot的程序案例_第8张图片

访问成功

你可能感兴趣的:(云原生,docker,springboot,spring,boot,java,后端)