如何设置docker 容器 内存分配容器中Java应用的内存限制

如何控制Docker容器的内存,硬盘,CPU等参数
因为Docker和virtualbox这类硬件虚拟化不一样,所以,我始终不知道如何控制。或者说它根本没有这样的概念。
docker run 命令可以对cpu和内存限制,目前没有直接对磁盘限制
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container -c, --cpu-shares=0 CPU shares (relative weight) -m, --memory=&& Memory limit (format: &number&&optional unit&, where unit = b, k, m or g)
docker &只依赖于 Linux kernel 对 LXC 的支持,包括cgroup,namespace。
换句话说,只要系统的linux kernel 支持 LXC, 打包在 docker里的应用就可以跨Linux系统运行。
docker容器里的应用,就是一个文本文件。
引用来自“徐同乐”的评论跟VM 和XEN比起来他也许更轻量级,不过感觉多此一举,如果一台机器跑多个实例,跟用xen虚拟化群集比肯定不如xen,如果说一直,现有的高级语言如PHP JAVA PYTHON 等都是跨平台,没必要被这个容器在包装一下,感觉完全多此一举,另外他的APP底层也是经过包装的linux内核,我就不信他比原生的好!跨平台等于不需要部署开箱即用
--- 共有 2 条评论 ---
: 我去,写错了,应该是不等于开箱即用
开箱即用?!
可以的。docker容器基于linux container技术,LXC基于Linux内核cgroup机制,可以实现对内存、CPU的控制
跟VM 和XEN比起来他也许更轻量级,不过感觉多此一举,如果一台机器跑多个实例,跟用xen虚拟化群集比肯定不如xen,如果说一直,现有的高级语言如PHP JAVA PYTHON 等都是跨平台,没必要被这个容器在包装一下,感觉完全多此一举,另外他的APP底层也是经过包装的linux内核,我就不信他比原生的好!
--- 共有 2 条评论 ---
: 抱歉我没用过ruby,不做评论。
有些时候,我们必须同一台机器运行不同版本的ruby的应用。
好像不能控制.问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我分别用两种linux系统部署Docker0.8,都没法限制容器的内存大小。具体情况如下:
用CentOS6.5【内核为3.10.5-3.el6.x86_64】做主机,新建容器,得到结果如下:
# docker run -i -t -d -m 512m centos /bin/bash
WARNING: WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.
9229fe1baccbc5a11f3e0fa8bec95afd
该容器新建成功,但不能限制内存大小。
Ubuntu 12.04【内核为3.8.0-38-generic】做主机,并且修正/etc/default/grub,更改$ GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"之后,新建容器,得到结果如下:
# sudo docker run -i -t -m 512m -d ubuntu /bin/bash
89d629ed37d63b67b49ed8c4c11cab653d61d5b85227bdd10c8a9a0a718c686e
看似未报错,登陆该新建的容器里面查看内存【free命令】,发现并未限制。
大家手头的主机都是什么系统,有没有这种情况?如何解决?盼回复,谢谢!
来源: Docker 技术问答
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
container中的free命令,看的是Host上的内存。
要查看container的内存限制用这个:
cat /cgroup/memory/lxc/{full_container_id}/memory.limit_in_bytes
/cgroup/下还可以查看其它资源的限制:
ll /cgroup/
drwxr-xr-x 3 root root 0 3月
17 13:33 blkio
drwxr-xr-x 3 root root 0 3月
17 13:33 cpu
drwxr-xr-x 3 root root 0 3月
17 13:33 cpuacct
drwxr-xr-x 3 root root 0 3月
17 13:33 cpuset
drwxr-xr-x 3 root root 0 3月
17 13:33 devices
drwxr-xr-x 3 root root 0 3月
17 13:33 freezer
drwxr-xr-x 3 root root 0 3月
17 13:33 memory
drwxr-xr-x 3 root root 0 3月
17 13:33 net_cls
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
楼主,我用ubuntu虚拟机做实验的时候也遇到这个问题,请参照这里解决
以下是重点摘录
If you want to enable memory and swap accounting, you must add the following command-line parameters to your kernel:
$ cgroup_enable=memory swapaccount=1
On systems using GRUB (which is the default for Ubuntu), you can add those parameters by editing /etc/default/grub and extending GRUB_CMDLINE_LINUX. Look for the following line:
$ GRUB_CMDLINE_LINUX=""
And replace it by the following one:
$ GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
Then run sudo update-grub, and reboot.
These parameters will help you get rid of the following warnings:
WARNING: Your kernel does not support cgroup swap limit.
WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
有人知道Centos6下面这个问题怎么解决?
我的docker是1.6.2的, Centos是6.6,内核版本是3.10.81
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我是CentOS6.7 应该差不多
我是修改的/etc/grub.conf 在当前使用的内核的kernel项的最后加上cgroup_enable=memory swapaccount=1
然后 cat /proc/cmdline 就会发现,配置生效了
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App2742人阅读
Docker(22)
1.使用docker自带的-m操作进行内存限制时可能会由于内核限制所以出现以下提示
Your kernel does not support swap limit capabilities.memory limit without swap
必须通过修改grub文件/etc/default/grub 添加:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
之后更新grub并重启可以解决
$ sudo update-grub
$ sudo reboot
2.使用docker -m操作会使内存被限制为输入大小的两倍
$ sudo docker run -it --name test -m 100m ubuntu /bin/bash
此时内存被限制为200m
若想要限制为100m必须执行
$ sudo docker run -it --name test -m 100m --memory-swap=100m ubuntu /bin/bash
此时内存与swap都被限制为100m
3.内存压测工具stress
$ sudo apt-get install stress
$ sudo stress --vm 1 --vm-bytes 100M --vm-hang 0
若运行后现实在几秒内被杀死说明内存被限制为100M
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:33418次
排名:千里之外
原创:51篇
(3)(4)(5)(1)(2)(6)(11)(6)(21)  Docker现在很火,容器技术看上不无所不能,但这实际上是一种误解,不要被炒作出来的泡沫迷住双眼,本文抛去炒作,理性地从Java程序员的角度,列举出Docker目前的五大误区,帮助你更好地理解Docker的优势和问题。
  抛去那些媒体和厂商们的炒作,我们如何才能更好更理性的使用Docker?
  Docker最近备受关注,原因显而易见。如何成功交付代码一直困扰着大家。传统的容器技术在众多需求和模板中乱成一团。而Docker可以简单且重复的创建容器。相比其它容器,使用Docker可以更快、更自然的交付代码。Duang,Docker火了!随之而来也有一些误解和误区。不要太相信别人说Docker好用或者不好用。自己理性地全面思考一下Docker,会帮助你真正理解是否真的需要它。
  本文列举了从Java角度的五大Docker误读。不过首先介绍些背景知识。为了更好地理解Docker,我们咨询了的,他有丰富的Docker经验,也是DevOps Days会议的组织者。我们和他一起列举出了这些误解。
  主要误区
  1. Docker是轻量级虚拟机
  这是大家初学Docker时最主要的误解。这种误解倒也情有可原,Docker的确看上去有点像虚拟机。上甚至有人比较了Docker和虚拟机的区别。但是,Docker实际上不是轻量级虚拟机,而是改进了的Linux容器()。Docker和虚拟机是完全不一样的,如果你把Docker容器当成轻量级虚拟机来用,会遇到很多问题。
  在使用Docker之前,必须了解Docker容器和虚拟机有很多本质的区别。
  资源隔离:Docker达不到虚拟机所能提供的资源隔离水平。虚拟机的资源是高度隔离的,而Docker从设计之初就需要共享一些资源,这些资源是Docker无法隔离和保护的,比如页缓存和。(注:内核熵池很有趣,它收集并且存储系统操作生成的随机比特。机器在需要随机化时会使用这个池,比如密码相关。)如果Docker容器占用了这些共享资源,那么其它进程在这些资源被释放前只能等待。
  开销:大多数人都知道虚拟机的CPU和RAM能提供类似物理机的性能,但是有很多额外的IO开销。因为放弃了虚拟机的guest OS,Docker的package更小,比起虚拟机需要更少的存储开销。但这并不意味着Docker没有任何开销问题。Docker容器依然需要注意IO开销的问题,只不过没有虚拟机严重而已。
  内核使用:Docker容器和虚拟机在内核使用上完全不同。每个虚拟机使用一个内核。Docker容器则是在所有容器间共享内核。共享内核带来一些效率的提升,但是以高可用和冗余为代价。如果虚拟机发生了内核崩溃,只有这个内核上的虚拟机会受影响。而Docker容器如果内核崩溃了,所有的容器都会受影响。
  2. Docker使得应用可扩展
  因为Docker可以在很短的时间内在多个服务器上部署代码,自然有人会觉得Docker可以让应用自身变得可扩展。不幸的是,这是错误的。代码是应用的基石,而Docker并不会重写代码。应用的可扩展性依然取决于程序员。使用Docker并不会自动得让你的代码易于扩展,只是让这些代码更容易跨服务器部署而已。
  3. Docker在生产环境广为使用
  因为Docker势头正劲,很多人便认为Docker可以在生产环境上大规模使用。事实上,这是不对的。注意Docker还是很新的技术,还不成熟,正在成长,这意味着还有很多烦人的bug和待完善的功能。对新技术感兴趣这没错,但是最好要弄清楚新技术的正确使用场景和需要注意的地方。现在,Docker很容易应用到开发环境。使用Docker可以很容易地搭建出很多不同的环境(至少,给人的感觉是能够搭建出不同的环境),这对于开发很有用。
  而在生产环境中,Docker的不成熟和不完善也限制了使用场景。比如,Docker不直接支持对多机器的网络和资源的监控,这使得它几乎无法在生产环境中使用。当然也有很多有潜力的地方,比如可以将同一个package从开发环境直接部署到生产环境。还有一些Docker运行时特性对于生产环境也很有用。但是总的来说,在生产环境里,目前不足多于优势。这并不是说无法成功运用到生产环境,只是现在还不能指望它一下子成熟和完美。
  4. Docker是跨OS的
  另一个误解是Docker在任意操作系统和环境上都可以工作。这可能来自于装卸货物的集装箱的类比,但是软件和操作系统的关系可不像船位那么简单直接。
  实际上,Docker只是Linux上的技术。并且Docker依赖特定的内核特性,必须要有最新版本的内核才行。基于不同OS的差异性,跨OS时,如果使用的不是最底层通用的特性,会遇到很多麻烦的问题。这些问题可能只有1%的发生率,但是当你在多台服务器上部署时,1%也是致命的。
  虽然Docker只在Linux上运行,但是也可以在OS X或者Windows上使用Docker。使用会在OS X或Windows机器上运行一个Linux虚拟机,这样Docker可以在这个虚拟机里运行。
  5. Docker增强应用的安全性
  觉得Docker可以改进代码和交付代码过程的安全性,这也是误解。这也是真实的集装箱和软件上容器的差别。Docker是一种容器化技术,添加了编排方法。但是Linux的容器有一些安全漏洞可能会被攻击。Docker并没有为这些漏洞添加任何安全层或者补丁。它还不是能保护应用的铁布衫。
  从Java角度看
  一些Java开发人员已经开始使用Docker。Docker的某些特性让我们更容易构建可扩展的上下文环境。不像,Docker可以帮助你将所有的依赖(包括JVM)打包到一个随时可发布的镜像中。这也是Docker对于开发人员来说最迷人的地方。但是,这也会带来一些隐患。一般来说,程序员需要用不同的方式和代码交互 - 监控它,调试它,连接它,调优它....如果使用Docker,这些都会需要额外的工作。
  比如,我们想使用,它依赖于JMX功能,JMX因为要使用RMI又需要网络。使用Docker的话就不是很直接,需要去开启所需端口。我们最初发现这个问题是当我们想要构建的Docker应用,我们不得不在容器里JVM之外运行了一个后台程序。详细的解决方案在上。
  另外一个很严重的问题是Docker容器的性能调优相当困难。当使用容器时,你不知道每个容器到底会分配多少内存。如果你有20个容器,内存会以你不确定的方式分配给它们。如果你打算用参数-Xmx调优堆的大小,就很困难,因为对Docker容器内JVM的处理取决于能够自动得到该容器分配到的内存大小。如果都不知道分配了多少内存,性能调优几乎不可能。
  Docker是很有意思的技术,有一些真实有效的使用场景。作为一个新兴技术,还需要大量时间来解决缺失的功能和已知的bug。但是,现在这个领域的确有很多的炒作。不过记住哦,炒作可不是成功~
  原文链接:
加群密码:关注下方微信公众号,发送消息 mm 获取
提示:更多精彩内容关注微信公众号:全栈开发者中心(admin10000_com)
理智评论文明上网,拒绝恶意谩骂 发表评论 / 共1条评论
登录会员中心Docker使用之Java web应用部署 - 崛起中的邹鹰 - ITeye技术网站
博客分类:
此篇博客一部分内容有赖于上一篇博客中已经陈述过的信息,如需了解,请移步:
/blog/2365651
切入正题,上一篇中介绍了如何在Docker中部署Tomcat,接下来将详细说明如何在Docker的Tomcat容器中部署war包。
通常情况下,一个web应用都脱不开数据库操作,这里我们以MySQL为例来说明一个web应用Docker、一个MySQL数据库Docker构成的最基本的应用实例
首先获取MySQL的最新Docker:
docker pull daocloud.io/mysql:latest
下载后得到的image通过以下命令查看:
root@danlley-VirtualBox:/home/danlley# docker images
REPOSITORY
a32bca93f476
About an hour ago
2 hours ago
abbbfb1f232d
12 hours ago
daocloud.io/mysql
7666f75adb6b
8 weeks ago
daocloud.io/ubuntu
f49eec89601e
9 weeks ago
接下来直接用镜像生成MySQL容器,并启动:
docker run -d -p
-e MYSQL_ROOT_PASSWORD=6f75adb6b
注意:这里默认的docker是没有设定root用户的密码的,为方便后面对数据库docker进行管理,我们对root的密码进行了初始化,同时,如果你是计划将已经有的web应用迁移到docker的话,这里的端口号依然使用3306可以为你后面的工作省一些力气。
数据库docker启动成功以后,就需要对该数据库进行管理,根据自身的应用,导入数据库表及结构,给相应的数据库实例开管理账号等,这些都是和平时的做法没什么差别了。
至此,数据库的docker准备工作结束,接下来开始准备部署war包到Tomcat容器并进行应用调试。
docker的war包部署相对简单,将war包放在Dockerfile相应的同一个目录下(其中Tomcat、jdk等都放该路径),编写Dockerfile文件:
daocloud.io/ubuntu:latest
MAINTAINER
# now add java and tomcat support in the container
ADD jdk-8u121-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.0.M18.tar.gz /usr/local/
# configuration of java and tomcat ENV
ENV JAVA_HOME /usr/local/jdk1.8.0_121
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.0.M18
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.0.M18
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# add war in webapps
ADD ./myteay-web.war /usr/local/apache-tomcat-9.0.0.M18/webapps
# container listener port
EXPOSE 8080
# startup wev application services by self
CMD /usr/local/apache-tomcat-9.0.0.M18/bin/catalina.sh run
接下来通过Dockerfile构建webapp镜像
1、生成镜像:
root@danlley-VirtualBox:/home/danlley/dockerfiles# docker build .
2、为生成的镜像打tag:
root@danlley-VirtualBox:/home/danlley/dockerfiles# docker tag abbbfb1f232d webapp
3、启动镜像:
docker run -d -p
4、测试镜像部署结果,本地浏览器访问地址: http://192.168.56.102:8090
至此,一个由docker构成的简单web应用搭建成功。
各位看官,原创不易啊,转载请注明出处:
看在打字不易的份上,打赏一个吧
参考资料:
浏览: 271080 次
来自: 西安
最好这样:java -Xms3700M -Xmx3700M - ...
学习一哈……
System.out.println(&开始注册Js ...
你的头像看起来很像我们宿舍老四。。。}

我要回帖

更多关于 docker容器内存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信