docker部署java应用,docker部署go应用
一、如何设置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
二、docker可以部署哪些项目
Docker是一种容器化技术,可以用于部署各种类型的项目。以下是一些常见的项目类型,可以使用Docker进行部署:
1.Web应用程序:无论是基于Java、Python、Node.js还是其他语言的Web应用程序,都可以使用Docker容器进行部署。通过将应用程序和其依赖项打包到容器中,可以实现快速部署和可移植性。
2.数据库系统:常见的数据库系统如MySQL、PostgreSQL、MongoDB等都可以在Docker容器中进行部署。使用Docker容器可以方便地创建、管理和迁移数据库实例。
3.微服务架构:微服务架构将应用程序拆分为多个独立的服务,每个服务运行在自己的容器中。使用Docker可以轻松地部署和扩展微服务架构,提高应用程序的可伸缩性和灵活性。
4.数据处理和分析:使用Docker可以方便地部署数据处理和分析工具,如ApacheSpark、Hadoop、Elasticsearch等。通过将这些工具打包到容器中,可以快速搭建数据处理和分析环境。?容器编排平台:5.Docker本身提供了基本的容器管理功能,但对于大规模部署和管理容器化应用程序,可以使用容器编排平台如Kubernetes、DockerSwarm等。这些平台可以帮助您自动化部署、扩展和管理容器化应用程序。?总的来说,几乎任何类型的项目都可以使用Docker进行部署。Docker的灵活性和可移植性使其成为现代应用程序开发和部署的重要工具之一。
三、docker部署什么类型项目
您好,Docker可以部署各种类型的项目,包括但不限于以下几种:
1.Web应用程序:可以使用Docker容器来部署各种Web应用程序,如Java、Node.js、Python等。通过将应用程序和其依赖项打包到一个容器中,可以轻松地在不同环境中部署和运行。
2.数据库:可以使用Docker容器来部署各种数据库,如MySQL、PostgreSQL、MongoDB等。通过使用容器化的数据库,可以简化数据库的安装和配置,并且可以方便地在不同环境中进行迁移和复制。
3.消息队列和中间件:可以使用Docker容器来部署各种消息队列和中间件,如RabbitMQ、Kafka、Redis等。通过使用容器化的消息队列和中间件,可以方便地进行消息传递和异步处理。
4.大数据和分布式系统:可以使用Docker容器来部署各种大数据和分布式系统,如Hadoop、Spark、Elasticsearch等。通过使用容器化的大数据和分布式系统,可以简化集群的管理和部署,并且可以方便地进行横向扩展和故障恢复。
5.容器化的微服务架构:可以使用Docker容器来部署和管理微服务架构。通过将不同的微服务打包到不同的容器中,并使用容器编排工具(如DockerCompose、Kubernetes等)来管理容器之间的依赖关系和通信,可以实现高度可扩展和灵活的微服务架构。
总之,Docker可以部署几乎任何类型的项目,只要能将项目的依赖项打包到一个容器中,并且能够通过容器运行时来管理和运行。