当前位置:首页 > 科技 > 正文

dockerfile java docker运维java项目

dockerfile java docker运维java项目

大家好,感谢邀请,今天来为大家分享一下dockerfile的问题,以及和docker运维java项目的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分...

大家好,感谢邀请,今天来为大家分享一下dockerfile的问题,以及和docker运维java项目的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

如何设置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

如何才能成为java架构师我为大家来分析一下

一:编程基础

不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的数据结构和算法基础还是要有的。下面几篇文章从思想到实现,为你梳理出常用的数据结构和经典算法。

1-1常用数据结构

数组、链表、堆、栈、队列、Hash表、二叉树等

1-2算法思想

算法时间复杂度和空间复杂度的分析计算

算法思想:递推、递归、穷举、贪心、分治、动态规划、迭代、分枝界限

1-3经典算法

经典排序:插入排序、冒泡排序、快排(分划交换排序)、直接选择排序、堆排序、合并排序

经典查找:顺序查找、二分查找、二叉排序树查找

1-4高级数据结构

B+/B-数、红黑树、图等

1-5高级算法

图的深度优先搜索、图的广度优先搜索、拓扑排序、Dijkstra算法(单源最短路径)、霍夫曼编码、辗转相除法、最小生成树等

二:Java语言基础

诞生不过二十余年的Java语言凭借其跨平台、面向对象、适合于分布式计算的特性,广泛应用于Web网站、移动设备、桌面应用中,并且已经连续多年稳居TOBIE编程语言排行榜前列,最近更是登上冠军宝座。Java有哪些优秀而又与众不同的地方首先一定要清楚。

2-1基础语法

Java语法格式,常量和变量,变量的作用域,方法和方法的重载,运算符,程序流程控制,各种基本数据类型及包装类

2-2重要:集合类

Collection以及各种List、Set、Queue、Map的实现以及集成关系,实现原理

Collections和Arrays

2-3其他JavaAPI

String和StringBuffer,System和Runtime类,Date和DateFomat类

java.lang包

java.util包(集合类体系、规则表达式、zip,以及时间、随机数、属性、资源和Timer等)

java.math包

java.net包

java.text包(各种格式化类等)

java.security包

2-4面向对象、面向接口

对象的三大特性:封装、继承和多态,优缺点

如何设计类,类的设计原则

this关键字,final关键字,static关键字

对象的实例化过程

方法的重写和重载;方法和方法的参数传递过程

构造函数

内部类,抽象类,接口

对象的多态性(子类和父类之间的转换、父类纸箱子类的引用),抽象类和接口在多态中的应用

2-5JVM内存模型、垃圾回收

2-6关于异常

Throwable/Error/Exception,CheckedExceptionvs.UncheckedException,异常的捕捉和抛出,异常捕捉的原则,finally的使用

2-7多线程

线程和进程的概念

如何在程序中创建多线程,线程安全问题,线程之间的通讯

线程的同步

死锁问题的剖析

线程池

2-8IO

java.io包,理解IO体系的基于管道模型的设计思路以及常用IO类的特性和使用场合。

File及相关类,字节流InputStream和OutputStream,字符流Reader和Writer,以及相应缓冲流和管道流,字节和字符的转化流,包装流,以及常用包装类使用

分析IO性能

2-9XML

熟悉SAX、DOM以及JDOM的优缺点并且能够使用其中的一种完成XML的解析及内容处理;这几种解析方法的原理

2-10一些高级特性

反射、代理、泛型、枚举、Java正则表达式

2-11网络编程

网络通信协议原理及适用场景,Socket编程,WEB服务器的工作原理

2-11JDK1.5、JDK1.6、JDK1.7、JDK1.8每个版本都比前面一个版本添加了哪些新特性,进行了哪些提升

三:数据库相关

前面说到了数据结构,数据库简单来说就像是电子化的档案柜,是按照一定的数据结构来组织、存储和管理数据的仓库。

3-1理论基础

数据库设计原则和范式

事务(ACID、工作原理、事务的隔离级别、锁、事务的传播机制)

3-2各种数据库优缺点、使用场景分析

MySQL/SQLServer/Oracle以及各种NoSQL(Redis、MongoDB、Memcached、HBase、CouchDB等)

3-2SQL语句

数据库创建,权限分配,表的创建,增删改查,连接,子查询

触发器、存储过程、事务控制

3-3优化

索引原理及适用,大表查询优化,多表连接查询优化,子查询优化等

3-4分库、分表、备份、迁移

导入、导出,分库、分表,冷备热备,主从备份、双机热备、纵向扩展、横向扩展

3-5JDBC

JDBCConnection、Statement、PreparedStatement、CallableStatement、ResultSet等不同类的使用

连接池(配置使用、实现原理)

ORM,DAO

四:JavaWeb核心技术(包括部分前端)

Html5/Css/JS原生/jQuery

Ajax(跨域等)

JSP/JavaBean/Servlet/EL/JSTL/TabLib

JSF

JSON

EJB

序列化和反序列化

规则引擎

搜索引擎

模板引擎

缓存

身份认证

测试

集群

持久化

生成静态页技术

高性能

安全

事务JTA

其他需要了解的,如:管理JMX、安全JCCA/JAAS、集成JCA、通信JNDI/JMS/JavaMain/JAF、SSI技术

五、主流框架及工具

Struts1/Struts2

Spring(IoC、AOP等),SpringMVC

持久化:Hibernate/MyBatis

日志:Log4j

单元测试:JUnit

消息队列:ActiveMQ、RabbitMQ等

负载均衡:Nginx/HaProxy

Web服务器:Tomcat、JBoss、Jetty、Resin、WebLogic、WebSphere等

通信:WebService(cxf的soap、restful协议)

缓存:Redis、Memcached

工作流:Activity、JBPM

搜索引擎:lucene,基于lucene封装的solr

模板引擎:Velocity、FreeMaker

大数据:Hadoop(HDFS和MapReduce)

构建工具:Ant/Maven

六、JavaWeb系统设计与架构

Java设计模式

JAVA与UML建模

面向服务架构:SOA/SCA/ESB/OSGI/EAI,微服务

K8S和Docker到底啥关系为什么K8S彻底放弃Docker底层

K8S在Docker上层,是利用Docker做容器管理的。而K8S目标是做分布式的容器集群,叫servicemesh。Docker本身只支持单机,集群工具叫Swarm,没有K8S流行。

K8S是最开始是谷歌主导的开源项目,现在在CNCF基金会运作。Docker是另一家同名商业公司运作。从上面描述得知,CNCF的K8S和Docker公司的Swarm是有竞争关系的。可能影响了K8S继续依赖Docker的信心。

但是Docker公司把容器核心containerd开源出来了。K8S本来就是只想要个核心容器管理工具而已,这样一来,就只需要依赖containerd,不需要Docker了。

你有关于详细的Docker入门书籍推荐吗

首先,单纯的只学docker我认为意义不大,docker只是整个devops体系中的一个基本单元,没有容器的编排管理,没有资源监控,没有从代码的开发到构建应用的一条龙服务,单个容器学习没有太多意义。建议先掌握简单的容器命令,了解基本原理,实际操作体验明白实际用法。

然后可以研究研究devops,例如openshift整个工作机制。

详细可参考我最近的OCP学习笔记:https://blog.csdn.net/yingwei13mei/article/details/93627641

docker部署的前端包需要替换哪些东西

如果您需要使用Docker部署前端,您需要将以下文件替换为真实的值:

-Dockerfile文件:需要替换为您自己的Dockerfile文件,指定Docker镜像的构建规则。

-nginx.conf文件:需要为您的项目修改相应的Nginx配置文件,确保前端项目能够被正确的反向代理。

-package.json文件:需要将您的前端项目的依赖加入到该文件中,确保Docker在构建镜像时能够安装所需的依赖包。

-build目录(或者其他您构建应用程序的目录):需要将您的前端项目的代码替换为真实的代码,确保Docker镜像能够正确地构建出最终应用程序。

请根据您的实际情况,修改这些文件,以确保您的前端项目能够在Docker中顺利的部署和运行。

linux怎么把jdk放进docker

要将JDK放入Docker容器中,可以按照以下步骤进行操作:

首先,确保您已经安装了Docker,并且可以在终端中运行docker命令。

下载适用于Linux的JDK安装包(例如tar.gz格式)。您可以从Oracle官方网站或其他可信来源下载。

将JDK安装包复制到您的Docker项目目录中。假设您的项目目录为/myproject。

创建一个Dockerfile,该文件包含构建Docker镜像所需的指令。在/myproject目录下创建一个名为Dockerfile的文本文件,并添加以下内容:

FROMubuntu:latest

COPYjdk-xxx.tar.gz/usr/local/

RUNtar-zxvf/usr/local/jdk-xxx.tar.gz-C/usr/local/

ENVJAVA_HOME/usr/local/jdk-xxx

ENVPATH$JAVA_HOME/bin:$PATH

请将"jdk-xxx.tar.gz"替换为您下载的JDK安装包的实际文件名,并根据需要调整版本号和安装路径。

使用以下命令在Docker中构建镜像:

dockerbuild-tmyimage:tag/myproject

请将"myimage"替换为您想要给该镜像起的名称,将"tag"替换为您希望的标签。

构建完成后,您可以使用以下命令创建并运行一个基于该镜像的容器:

dockerrun-it--namemycontainermyimage:tag

将"mycontainer"替换为您希望给容器起的名称,将"myimage:tag"替换为您之前构建的镜像的名称和标签。

这样,您就可以将JDK成功放入Docker容器中,并在容器中运行Java应用程序。

dockerfile和docker运维java项目的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

最新文章