详解docker部署SpringBoot及如何替换jar包
关于docker的安装和使用,可以看看之前这两篇文章。Docker从安装部署到Hello World和Docker容器的使用和连接。这篇文章主要介绍如何在docker上部署springboot项目。关于如何创建springboot项目可以看看这篇文章SpringBoot入门教程(一)详解intellij idea搭建SpringBoot
本文主要介绍docker部署springboot的三种方式,分别是:入门方式、jar包替换部署的方式和脚本部署方式,一步步来手把手教程。注意这三种方式的命名是我自创非官方的。
v工程目录
vDockerfile文件
创建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包 RUN bash -c 'touch /app.jar' ENTRYPOINT ["java","-jar","/app.jar"] ###声明启动端口号 #EXPOSE 8301
v文件部署
在服务器新建/data/docker/hellolearn文件夹(文件路径可自定义),将maven打包好的jar包和上文中创建的Dockerfile文件复制到服务器新建的文件夹(/data/docker/hellolearn)。
v生成镜像
docker build -t hellolearn .
docker build -t 镜像名称:标签 Dockerfile的相对位置,点号代表当前目录,不写tag默认是latest。
v启动容器
docker run -d -p 8301:8301 --name hellolearn hellolearn
docker start hellolearn
-d参数是让容器后台运行;--name为指定容器的名称;-p 是做端口映射,此时将服务器中的8301(冒号前的端口)端口映射到容器中的8301(冒号后的端口)端口(application.properties配置的是8301)
v访问WEB
vjar包映射部署
按照上文的步骤已足可以轻松应对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/newhellole ad8 arn/package目录就与docker的/data目录进行映射。
这样的话,当jar包发生变动时,直接更新宿主机的/data/docker/newhellolearn/package目录下的jar包即可,更新jar包之后需要将容器重启一下。
v脚本部署
通过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测试效果
v查看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
v遇到的问题
问题描述:Error response from daemon: ad8 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
具体问题相关信息详见Error response from daemon: driver failed programming external connectivity on endpoint mysql3308 (
v源码地址
https://github.com/toutouge/javademosecond/tree/master/hellolearn
作 者:请叫我头头哥
出 处:http://www.cnblogs.com/toutou/
关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
- springboot docker jenkins 自动化部署并上传镜像的步骤详解
- 详解springboot中的jar包部署步骤
- SpringBoot通过jar包方式centos后台部署,如何做到退出控制台,链接访问有效
- 详解Spring Boot 部署jar和war的区别
- Springboot中如何导入本地jar包,并通过maven把项目成功打包成jar包部署
- springboot如何用jar包的形式部署到服务器上
- java web项目 maven springboot 框架 以jar方式如何部署到服务器上
- Springboot中如何引入本地jar包,并通过maven把项目成功打包成jar包部署
- 在Docker中部署Spring Boot项目过程详解
- java通过Idea远程一键部署springboot到Docker详解
- springboot项目如何部署到服务器-jar方式
- Spring Boot 如何进行部署与服务配置的详解
- 2019年··· Windows10下--Docker部署SpringBoot项目(java项目)(超详细教程)Docker上运行jar包,外部可访问。
- Docker部署jar包(SpringBoot项目容器运行)
- SpringBoot项目如何进行打包部署-jar包
- 如何快速使用 Docker 部署 Spring Boot 项目?
- Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo
- SpringBoot+Docker实现项目的Maven打包&镜像构建&容器中运行==简单自动化部署
- docker 部署springboot应用
- 详解基于docker 如何部署surging分布式微服务引擎