详解docker部署SpringBoot及替换jar包的⽅法
⽬录
⼯程⽬录
Dockerfile⽂件
⽂件部署
⽣成镜像
启动容器
访问WEB
jar包映射部署
脚本部署
查看docker⽇志
遇到的问题
关于docker的安装和使⽤,可以看看之前这两篇⽂章。和。这篇⽂章主要介绍如何在docker上部署springboot项⽬。关于如何创建springboot项⽬可以看看这篇⽂章
本⽂主要介绍docker部署springboot的三种⽅式,分别是:⼊门⽅式、jar包替换部署的⽅式和脚本部署⽅式,⼀步步来⼿把⼿教程。注意这三种⽅式的命名是我⾃创⾮官⽅的。
⼯程⽬录
Dockerfile⽂件
创建Dockerfile⽂件,后⾯会⽤到。
# Docker image for springboot file run
# VERSION 0.0.1
# Author: toutou
# 基础镜像使⽤java
FROM java:8
# VOLUME 指定了临时⽂件⽬录为/tmp。
# 其效果是在主机 /var/lib/docker ⽬录下创建了⼀个临时⽂件,并链接到容器的/tmp
# VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar
ADD learn-web-0.0.1-SNAPSHOT.jar app.jar
# 运⾏jar包
maven打包本地jar包RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]
###声明启动端⼝号
#EXPOSE 8301
⽂件部署
在服务器新建/data/docker/hellolearn⽂件夹(⽂件路径可⾃定义),将maven打包好的jar包和上⽂中创建的Dockerfile⽂件复制到服务器新建的⽂件夹(/data/docker/hellolearn)。
⽣成镜像
docker build -t hellolearn .
docker build -t 镜像名称:标签 Dockerfile的相对位置,点号代表当前⽬录,不写tag默认是latest。
启动容器
docker run -d -p 8301:8301 --name hellolearn hellolearn
docker start hellolearn
-d参数是让容器后台运⾏;--name为指定容器的名称;-p 是做端⼝映射,此时将服务器中的8301(冒号前的端⼝)端⼝映射到容器中的8301(冒号后的端⼝)端⼝(application.properties配置的是8301)
访问WEB
jar包映射部署
按照上⽂的步骤已⾜可以轻松应对docker部署springboot的全流程。但是这样在启动容器后,每次需更新jar包时,都得重新制作镜像,再重新制作容器。流程及其繁琐,效率极低。那如何在不更新镜像或者容器的前提下直接更新jar包完成部署呢?
5.1 更新Dockerfile
# Docker image for springboot file run
# VERSION 0.0.1
# Author: toutou
# 基础镜像使⽤java
FROM java:8
EXPOSE 8301
ENTRYPOINT ["java","-jar","/data/learn-web-0.0.1-SNAPSHOT.jar"]
最后⼀⾏ ENTRYPOINT ["java","-jar","/data/learn-web-0.0.1-SNAPSHOT.jar"] 会运⾏容器⾥/data⽬录下的learn-web-0.0.1-SNAPSHOT.jar⽂件。
5.2 使⽤docker build命令构建镜像
docker build -t hellolearn .
5.3 创建&启动容器
docker run --name hellolearn -it -v /data/docker/newhellolearn/package:/data -d -p 8301:8301 hellolearn
-v 宿主机⽬录关联容器⽬录。这样宿主机的/data/docker/newhellolearn/package⽬录就与docker的/da
ta⽬录进⾏映射。
这样的话,当jar包发⽣变动时,直接更新宿主机的/data/docker/newhellolearn/package⽬录下的jar包即可,更新jar包之后需要将容器重启⼀下。
脚本部署
通过jar包部署⽅式引起⼀个问题,若jar包名字发⽣变化,⽐如版本号变化(learn-web-0.0.1-SNAPSHOT.jar-->>learn-web-1.0.1-SNAPSHOT.jar)。需要怎么处理呢?下⾯就介绍第三种通过脚本部署的⽅式。
6.1 创建hellolearn.sh⽂件
java -jar /data/learn-web-0.0.1-SNAPSHOT.jar
将hellolearn.sh上传到/data/docker/hellolearn/scriptdeploy/package,这个⽂件夹路径可以⾃定义,记住这个⽂件夹路径,后⾯还会⽤到。
6.2 添加脚本执⾏权限
chmod +x hellolearn.sh
6.3 创建Dockerfile
# Docker image for springboot file run
# VERSION 0.0.1
# Author: toutou
# 基础镜像使⽤java
FROM java:8
EXPOSE 8301
CMD ["sh","-c","/data/hellolearn.sh"]
CMD ["sh","-c","/data/hellolearn.sh"] 表⽰在容器启动时启动6.1中创建的hellolearn.sh脚本。
注意最后⼀条命令上⽂中都是ENTRYPOINT,在脚本部署中改成了CMD,⾄于ENTRYPOINT和CMD的具体区别感兴趣的可以。
6.4 上传jar包
将jar包放⼊hellolearn.sh的同⼀个⽂件夹⽬录,即/data/docker/hellolearn/scriptdeploy/package,创建容器时再将该⽬录(宿主机⽬录)与容器的/data⽬录进⾏映射。。
6.5 ⽂件⽬录结构图
这⾥的⽬录结构不知道⼤家晕不晕,上传⼀张我这宿主机的⽬录结构图,⼀⽬了然。
6.6 创建镜像
docker build -t hellolearn-script .
末尾的点号代表当前⽬录,所以⽣成镜像的命令需要在Dockerfile所在的⽬录执⾏。
6.7 创建&启动容器
docker run --name hellolearn-script -it -v /data/docker/hellolearn/scriptdeploy/package:/data -d -p 8302:8301 hellolearn-script docker start hellolearn-script
将宿主机的/data/docker/hellolearn/scriptdeploy/package⽬录与容器的/data⽬录映射关联。这样的话,当jar包发⽣变动时,直接更新宿主机⽬录下的jar包即可。即使jar包名字发⽣变化,也需要再更新⼀下hellolearn.sh脚本。更新之后重启容器。
6.8 web测试效果
查看docker⽇志
docker logs [OPTIONS] CONTAINER ID
OPTIONS说明:
-f : 跟踪⽇志输出
--since :显⽰某个开始时间的所有⽇志
-t : 显⽰时间戳
-
-tail :仅列出最新N条容器⽇志
7.1 查看指定时间后的⽇志,只显⽰最后100⾏:
docker logs -f -t --since="2020-10-01" --tail=100 CONTAINER ID
7.2 查个指定时间区段的⽇志
docker logs -t --since="2020-10-01T19:00:00" --until "2020-10-01T19:00:00" CONTAINER ID
7.3 查看指定时间后⾯的⽇志:
docker logs -t --since="2020-10-01T19:00:00" CONTAINER ID
7.4 查看最近5分钟的⽇志:
docker logs --since 5m CONTAINER ID
7.5 通过 exec 命令对指定的容器执⾏ bash:
docker exec hellolearn -it /bin/bash 或者 docker exec -it hellolearn bash
7.6 查看docker IP
docker inspect --format='{{.NetworkSettings.IPAddress}}' hellolearn
遇到的问题
问题描述:Error response from daemon: driver failed programming external connectivity on endpoint flamboyant_leavitt (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8301 -j DNAT --to-destination 172.17.0.2:8301 ! -i docker0: iptables: No
chain/target/match by that name.
解决⽅案:重启docker。 systemctl restart docker

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。