dockerfile tomcat?tomcat webapps
- 开发语言
- 2023-09-05
- 50
大家好,今天小编来为大家解答dockerfile tomcat这个问题,tomcat webapps很多人还不知道,现在让我们一起来看看吧!如何实现docker的数据持...
大家好,今天小编来为大家解答dockerfile tomcat这个问题,tomcat webapps很多人还不知道,现在让我们一起来看看吧!
如何实现docker的数据持久化
讲容器内的文件或目录monut到宿主机的硬盘上比如dockerrun-d-v/var/log:/usr/local/tomcat/logstomcat:9表示tomcat容器中的/usr/local/tomcat/logs会挂载到宿主机的/var/log这样即使容器删除,宿主机的/var/log目录仍会保存下来
docker中部署tomcat需要交jdk吗
tomcat运行需要JDKA,所以需要先装JDK
虚拟机centos上的docker启动tomcat无法访问
1.看看自己的虚拟机的网络模式
2.宿主机ping下虚拟机看能否ping通。如果用宿主机访问虚拟机,宿主机里面虚拟机的网关段来ping虚拟机。
3.另外确定自己的防火墙没有打开,如果打开了防火墙没开授信访问不了也是应该的。
如何设置Docker容器中Java应用的内存限制
如果使用官方的Java镜像,或者基于Java镜像构建的Docker镜像,都可以通过传递JAVA_OPTS环境变量来轻松地设置JVM的内存参数。比如,对于官方Tomcat镜像,我们可以执行下面命令来启动一个最大内存为512M的tomcat实例
dockerrun--rm-eJAVA_OPTS='-Xmx512m'tomcat:8
在日志中,我们可以清楚地发现设置已经生效“Commandlineargument:-Xmx512m”
02-Apr-201612:46:26.970INFO[main]org.apache.catalina.startup.VersionLoggerListener.logServerversion:ApacheTomcat/8.0.32
02-Apr-201612:46:26.974INFO[main]org.apache.catalina.startup.VersionLoggerListener.logServerbuilt:Feb2201619:34:53UTC
02-Apr-201612:46:26.975INFO[main]org.apache.catalina.startup.VersionLoggerListener.logServernumber:8.0.32.0
02-Apr-201612:46:26.975INFO[main]org.apache.catalina.startup.VersionLoggerListener.logOSName:Linux
02-Apr-201612:46:26.975INFO[main]org.apache.catalina.startup.VersionLoggerListener.logOSVersion:4.1.19-boot2docker
02-Apr-201612:46:26.975INFO[main]org.apache.catalina.startup.VersionLoggerListener.logArchitecture:amd64
02-Apr-201612:46:26.975INFO[main]org.apache.catalina.startup.VersionLoggerListener.logJavaHome:/usr/lib/jvm/java-7-openjdk-amd64/jre
02-Apr-201612:46:26.976INFO[main]org.apache.catalina.startup.VersionLoggerListener.logJVMVersion:1.7.0_95-b00
02-Apr-201612:46:26.976INFO[main]org.apache.catalina.startup.VersionLoggerListener.logJVMVendor:OracleCorporation
02-Apr-201612:46:26.977INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCATALINA_BASE:/usr/local/tomcat
02-Apr-201612:46:26.977INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCATALINA_HOME:/usr/local/tomcat
02-Apr-201612:46:26.978INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCommandlineargument:-Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
02-Apr-201612:46:26.978INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCommandlineargument:-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
02-Apr-201612:46:26.978INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCommandlineargument:-Xmx512m
...
然而在Docker集群上部署运行Java容器应用的时候,仅仅对JVM的heap参数设置是不够的,我们还需要对Docker容器的内存资源进行限制:
1.限制容器使用的内存的最大量,防止对系统或其他应用造成伤害
2.能够将Docker容器调度到拥有足够空余的内存的节点,从而保证应用的所需运行资源
关于容器的资源分配约束,Docker提供了相应的启动参数
对内存而言,最基本的就是通过-m参数来约束容器使用内存的大小
-m,--memory=""
Memorylimit(format:<number>[<unit>]).Numberisapositiveinteger.Unitcanbeoneofb,k,m,org.Minimumis4M.
那么问题就来了,为了正确设置Docker容器内存的大小,难道我们需要同时传递容器的内存限制和JAVA_OPTS环境变量吗?如下所示:
dockerrun--rm-m512m-eJAVA_OPTS='-Xmx512m'tomcat:8
这个方法有两个问题
1.需要管理员保证容器内存和JVM内存设置匹配,否则可能引发错误
2.当对容器内存限制调整时,环境变量也需要重新设定,这就需要重建一个新的容器
是否有一个方法,可以让容器内部的JVM自动适配容器的内存限制?这样可以采用更加统一的方法来进行资源管理,简化配置工作。
大家知道Docker是通过CGroup来实现资源约束的,自从1.7版本之后,Docker把容器的localcgroups以只读方式挂载到容器内部的文件系统上,这样我们就可以在容器内部,通过cgroups信息来获取系统对当前容器的资源限制了。
我创建了一个示例镜像registry.aliyuncs.com/denverdino/tomcat:8-autoheap
,其源代码可以从Github获得。它基于Docker官方Tomcat镜像创建,它的启动脚本会检查CGroup中内存限置,并计算JVM最大Heapsize来传递给Tomcat。其代码如下
#!/bin/bash
limit_in_bytes=$(cat/sys/fs/cgroup/memory/memory.limit_in_bytes)
#Ifnotdefaultlimit_in_bytesincgroup
if["$limit_in_bytes"-ne"9223372036854771712"]
then
limit_in_megabytes=$(expr$limit_in_bytes\/1048576)
heap_size=$(expr$limit_in_megabytes-$RESERVED_MEGABYTES)
exportJAVA_OPTS="-Xmx${heap_size}m$JAVA_OPTS"
echoJAVA_OPTS=$JAVA_OPTS
fi
execcatalina.shrun
说明:
为了监控,故障排查等场景,我们预留了部分内存(缺省64M),其余容器内存我们都分配给JVM的堆。
这里没有对边界情况做进一步处理。在生产系统中需要根据情况做相应的设定,比如最大的堆大小等等。
现在我们启动一个tomcat运行在512兆的容器中
dockerrun-d--nametest-m512mregistry.aliyuncs.com/denverdino/tomcat:8-autoheap
通过下列命令,从日志中我们可以检测到相应的JVM参数已经被设置成448MB(512-64)
dockerlogstest
...
02-Apr-201614:18:09.870INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCommandlineargument:-Xmx448m
...
我们也可以方便的调整Java应用的内存.
Docker1.10提供了对容器资源限制的动态修改能力。但是由于JVM无法感知容器资源修改,我们依然需要重启tomcat来变更JVM的内存设置,例如,我们可以通过下面命令把容器内存限制调整到1GB
dockerupdate-m1024mtest
dockerrestarttest
再次检查日志,相应的JVMHeapSize最大值已被设置为960MB
dockerlogstest
...
02-Apr-201614:21:07.644INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCommandlineargument:-Xmx960m
springBoot项目如何部署
SpringBoot项目可以生成两种部署包:一种是jar包,一种是War包
jar包(官方推荐)
jar包方式启动,也就是使用springboot内置的tomcat运行。服务器上面只要你配置了jdk1.8及以上,就ok。不需要外置tomcat
1.打成jar包
2.将jar包放到任意目录,执行下面的命令
$nohupjava-jartest.jar>temp.txt&
//这种方法会把日志文件输入到你指定的文件中,没有则会自动创建。进程会在后台运行。
war包
传统的部署方式:将项目打成war包,放入tomcat的webapps目录下面,启动tomcat,即可访问。
对于打包,到项目根路径:执行mvncleanpackage就OK
docker容器与虚拟机有什么区别
谢邀~
我们单位最近在推docker,已经在开发测试环境使用(稍显落后),下面我就谈谈自己的Docker的理解,以及Docker和虚拟机的区别。
虚拟机先说说什么是虚拟机:在一台物理机器上,利用虚拟化技术,虚拟出来多个操作系统,每个操作系统之间是隔离的。
说起来有些绕,那么我们看看虚拟机的架构图,就容易理解了。例如我们要在一台物理机器运行三个Java项目,彼此之间隔离。
从下往上看,解释起来其实很简单:
最下面的一层就是物理机,可以是服务器,设置是一台个人电脑;
电脑上需要安装操作系统,比如我们安装了win10的操作系统;
再往上就是虚拟机软件了,比如我们常用的VirtualBox、VMWare,它们的作用是模拟计算机硬件;
继续向上,就是虚拟机模拟出来的操作系统了;
在虚拟的操作系统中,安装所需的软件、组件等。比如我们需要在虚拟操作系统中安装JDK、Tomcat等;
最后就是具体的应用了,例如部署到Tomcat中。
Docker再说说什么是Docker,找了一句官方的解释:Docker是开源的应用容器引擎。是不是又一头雾水?我们还是先看看Docker的架构图。
依然从下往上看:
最下面两层,概念同上。
往上,可以看做Docker容器的管理器。
依赖和应用都被打包成了Docker镜像。例如,JDK、Tomcat、应用都被打包在了一起,运行在Docker容器里,容器和容器间是隔离的。
这里提示:Linux支持Docker,Windows和MacOS的话,不直接支持(win10专业版好像可以直接支持,不过我都是安装Linux的虚拟机,在上面跑Docker)。
Docker和虚拟机的区别从两者的架构图上看,虚拟机是在硬件级别进行虚拟化,模拟硬件搭建操作系统;而Docker是在操作系统的层面虚拟化,复用操作系统,运行Docker容器。
Docker的速度很快,秒级,而虚拟机的速度通常要按分钟计算。
Docker所用的资源更少,性能更高。同样一个物理机器,Docker运行的镜像数量远多于虚拟机的数量。
虚拟机实现了操作系统之间的隔离,Docker算是进程之间的隔离,虚拟机隔离级别更高、安全性方面也更强。
虚拟机和Docker各有优势,不存在谁替代掉谁的问题,很多企业都采用物理机上做虚拟机,虚拟机中跑Docker的方式。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。关于dockerfile tomcat的内容到此结束,希望对大家有所帮助。
本文链接:http://www.xinin56.com/kaifa/15940.html