详解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/newhellolearn/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: 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/
关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
#comment_body_3242240 { display: none }
详解docker部署SpringBoot及如何替换jar包的更多相关文章
- 使用Docker部署Spring-Boot+Vue博客系统
在今年年初的时候,完成了自己的个Fame博客系统的实现,当时也做了一篇博文Spring-boot+Vue = Fame 写blog的一次小结作为记录和介绍.从完成实现到现在,也断断续续的根据实际的使用 ...
- 转 使用Docker部署 spring-boot maven应用
转自:https://blog.csdn.net/u011699931/article/details/70226504/ 使用Docker部署 spring-boot maven应用 部署过程分为以 ...
- Mac下 Docker部署SpringBoot应用
一.安装Docker环境 使用 Homebrew 安装 macOS 我们可以使用 Homebrew 来安装 Docker. Homebrew 的 Cask 已经支持 Docker for Mac,因此 ...
- 超简单的 Docker部署 SpringBoot项目 步骤
很久之前就用过,一直没有好好写篇博客,今天就总结一下 创建一个 SpringBoot项目 创建一个SpringBoot项目并打成jar包,结构如图 编写 Dockerfile文件 FROM java: ...
- 详解Docker 端口映射与容器互联
详解Docker 端口映射与容器互联 1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行 ...
- SpringBoot快速引入第三方jar包
工作中,我们常会用到第三方jar包,而这些jar包往往在maven仓库是搜不到的,下面推荐一种简单.快速的引入第三方依赖的方法: 比如第三方jar包在lib文件夹下,对pom.xml的配置如下: &l ...
- 通过jarjar.jar来替换jar包名的详细介绍
有时候我们根据一些场景 需要替换第三方jar包的包名,比如Android广告平台sdk,更换他们jar包包名的话,可以防止市场检测到有广告插件,所以,今天就介绍一下如何使用jarjar.jar工具来替 ...
- 替换Jar包内的文件
要替换Jar包内的文件可以用以下命令实现: jar uvf myjar.jar com/test/myclass.class 这里值得注意的是 myclass.class 必须放在com/test ...
- maven将自己的springboot项目打包成jar包后,作为工具包引入其他项目,找不到jar中的类
将springboot项目打包成jar包,作为工具包导入项目后,找不到jar中的类. 原因是:springboot项目使用了自动的打包插件. 原先的插件配置: <build> <pl ...
随机推荐
- 【转】Key Presses
FROM:http://lazyfoo.net/tutorials/SDL/04_key_presses/index.php Key Presses Last Updated 6/11/19 Xing ...
- 走在深夜的小码农 Third Day
Css3 Third Day writer:late at night codepeasant css简介 CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称. ...
- SourceTree安装及卸载
一.安装步骤 下载地址: 链接:https://pan.baidu.com/s/1K5ImZASuThJZoGLz6Ay_4g 提取码:hqkp 1. 点击安装包,点击下一步 2. 出现账户注册的页面 ...
- 03 . Gin+Vue开发一个线上外卖应用(用户数据创建,插入,跨域处理)
功能和背景介绍 在项目的登录功能中,如果在登录时发现用户名和密码在用户表中不存在,会自动将用户名和密码保存在用户表中,创建一个新的用户. 因此,除了使用手机号和验证码登录以外,还支持使用用户名.密码进 ...
- Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道
Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道 背景 上一讲我们介绍了创建子进程的方式.我们都知道,创建子进程是为了与父进程协作(或者是为了执行新的程序,参考 Linux ...
- Python爬虫练习(requests模块)
Python爬虫练习(requests模块) 关注公众号"轻松学编程"了解更多. 一.使用正则表达式解析页面和提取数据 1.爬取动态数据(js格式) 爬取http://fund.e ...
- Simulink中封装子系统
学习目的: 使用simulink封装一个子系统,并将封装子系统放入到自定义的库中,可供建模时重复使用 功能:封装一个能够检测输入信号下降沿跳变的边沿检测模块,该模块可支持双击时修改内部参数.封装完成后 ...
- 教你如何 分析 Android ANR 问题
ANR介绍 ANR 的全称是 Application No Responding,即应用程序无响应,具体是一些特定的 Message (Key Dispatch.Broadcast.Service) ...
- 服务器性能监控神器nmon使用介绍
介绍 Nmon (Nigel's Monitor)是由IBM 提供.免费监控 AIX 系统与 Linux 系统资源的工具.该工具可将服务器系统资源耗用情况收集起来并输出一个特定的文件,并可利用 exc ...
- 9个JavaScript日常开发小技巧
1.生成指定范围的数字 在某些情况下,我们会创建一个处在两个数之间的数组.假设我们要判断某人的生日是否在某个范围的年份内,那么下面是实现它的一个很简单的方法 1 2 3 4 5 6 let start ...