深入浅出docker+docker实战云图书

105.8元

(需用券)

去购买 >

一、背景

对于Java8的一些较早的版本(8u131以前?),如果部署在docker容器中,由于JVM不能感知到docker容器的资源限制,会导致docker编排文件中设置的资源限制对JVM无效。轻则多个docker容器抢占资源导致性能下降,重则docker容器不稳定频频重启。

在Java8 8u131+和JDK9以后,JVM增加了感知容器资源的参数,解决了这个问题。

本文以JDK11为例,说明如何设置java应用的容器感知参数,以及如何在docker编排文件中设置容器资源限制。

二、环境java: AdoptOpenJDK 11.0.8+10

docker ce: 19.03.4

docker-compose: 1.24.0

三、Java应用相关设置

制作一个基于openjdk11的java应用镜像。

3.1 Java基础镜像

本文基于AdoptOpenJDK的openjdk11镜像 adoptopenjdk/openjdk11:jdk-11.0.8_10-alpine制作了中国时区,支持中文的openjdk11镜像。

Dockerfile如下:# 从dockerhub拉取基础镜像

FROM adoptopenjdk/openjdk11:jdk-11.0.8_10-alpine

# 设置时区与语言环境变量

ENV TIME_ZONE=Asia/Shanghai \

LANG=en_US.UTF-8 \

LANGUAGE=en_US.UTF-8 \

LC_ALL=en_US.UTF-8

# 执行以下命令设置时区

RUN apk add --no-cache tzdata \

&& echo "${TIME_ZONE}" > /etc/timezone \

&& ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime

在Dockerfile所在目录执行docker镜像编译命令:docker build -t : ., 如:docker build -t czhao/base-openjdk11:jdk-11.0.8_001 .

3.2 Java应用

事先准备一个openjdk11开发的java应用,编译为jar,基于前面的Java基础镜像,编译java应用镜像。

Dockerfile如下:FROM czhao/base-openjdk11:jdk-11.0.8_001

# JDK11支持: -XX:+UseContainerSupport 使JVM能够感知容器资源, -XX:InitialRAMPercentage 初期容器内存占比, -XX:MaxRAMPercentage 最大容器内存占比

ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:InitialRAMPercentage=50 -XX:MaxRAMPercentage=80"

# 复制上下文目录下的target/*.jar 到容器里

ADD target/*.jar app.jar

# 指定容器启动程序及参数 ""

ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar-XX:+UseContainerSupport开启容器感知。

-XX:InitialRAMPercentage与-XX:MaxRAMPercentage用于设置JVM初始的容器内存占比和最大容器内存占比。

上述命令仅在java10以后有效,其他支持感知的版本的参数配置各不相同。

镜像编译命令不再赘述。

四、docker编排与启动

编排java应用的docker compose文件,启动,并检查资源占用。

4.1 docker编排文件

这里使用docker compose v3的编排规则,编排文件如下:

service.yaml:version: '3'

...

services:

:

container_name:

image: :

...

deploy:

resources:

limits:

cpus: '1.00'

memory: 1024M

reservations:

# cpus: '0.1'

memory: 512Mdeploy本来是docker swarm的docker stack deploy命令才支持的属性,但可以在docker-compose up命令中通过添加--compatibility参数使之生效。但deploy.resources.reservations.cpus仍然无法生效。

limits是资源上限,reservations是保留资源。

cpus设置的数字是占用宿主机cpu的比例,1.00即100%,代表完全占用了宿主机CPU的一个process。注意,宿主机如果是多核机器的话,100%只是占用了一个process而已。例如一个8 core 16 process的宿主机,cpus理论上可以设置到16.00。但这里建议一个容器的cpu占用不要超过1.00。

4.2 启动docker容器并检查资源占用

使用以下命令启动:docker-compose --compatibility -f service.yaml up -d

然后使用以下命令,查看docker容器的资源占用情况:docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

docker资源占用如下:NAME CPU % MEM USAGE / LIMIT

0.66% 418.5MiB / 1GiB注意观察就可以发现,该容器占用CPU最高在100%左右,而内存则不会超过1G的限制。

java 11官方入门(第8版)教材

79.84元

包邮

(需用券)

去购买 >

docker查看java资源_JDK11设置Docker容器资源感知相关推荐

  1. docker 查看日志_8个优秀Docker容器监控工具,收藏了

    Docker是目前使用最广泛的容器之一,但它并不总是像物理硬件一样可见.而使用docker容器监控工具有助于消除这种透明度的缺失.以下介绍8种优秀Docker容器监控工具. 1.SolarWinds ...

  2. docker 运行java程序_Docker:在容器中运行Java应用程序

    您可以使用Docker在特定的运行时环境中运行容器中的Java应用程序.本教程介绍如何创建Dockerfile,以便在OpenJDK 8的容器中运行简单的Java应用程序. 示例应用程序由一个Main ...

  3. 修改docker内java内存_在docker中使用java的内存情况

    Java和Docker不是天然的朋友. Docker可以设置内存和CPU限制,而Java不能自动检测到.使用Java的Xmx标识(繁琐/重复)或新的实验性JVM标识,我们可以解决这个问题. 虚拟化中的 ...

  4. docker hub 国内镜像_Mac设置docker国内镜像源

    转载自:https://zhuanlan.zhihu.com/p/146876547?from_voters_page=true 在国内使用docker拉取镜像会非常的慢,所以一定得设置国内镜像源. ...

  5. 时间在线验证 java代码_timetest.java 源代码在线查看 - Java获取各种常用时间方法 资源下载 虫虫电子下载站...

    package com.hefeng.test;import java.text.DateFormat;import java.text.ParsePosition;import java.text. ...

  6. java迷宫生成代码_maxe.java 源代码在线查看 - Java Maze 计算机自动生成迷宫 资源下载 虫虫电子下载站...

    public class Maxe{ private int startI, startJ; // 入口 private int endI, endJ; // 出口public void setSta ...

  7. 如何设置Docker容器的CPU和内存使用限制

    如何设置Docker容器的CPU和内存使用限制 1. 概述 在很多情况下,我们需要限制docker主机上资源的使用. 在本教程中,我们将学习如何设置docker容器的内存和CPU限制 2. 通过doc ...

  8. Docker 安装、镜像、dockerfile、容器、仓库

    2018-05-30 参考: 1.<docker从入门到实战> 2.菜鸟教程http://www.runoob.com/docker/docker-command-manual.html. ...

  9. 写给Java开发看的 Docker 干货(零基础部署Nginx MySQL SpringBoot)

    前言 Docker是当下使用最多的一种容器技术,想精通Docker并不容易,在公司生产中会有专门的运维人员负责.但是身为开发人员,适当的学习Docker是必要的.Docker的好处这里就不介绍了,网上 ...

最新文章

  1. 【蓝桥杯 - 练习】k倍区间(思维,数组)
  2. Python|LeetCode习题答案汇总
  3. int与byte之间的相互转化
  4. Everything下载及使用教程【非常详细】(磁盘文件搜索神器)
  5. 关于DC-DC电源的总体概述
  6. OmegaT-竞赛争论机协助翻译软件
  7. php 10到50的随机数,【单选题】php中以下能输出1到10之间的随机数的是( )
  8. 批处理框架 Spring Batch 这么强,你会用吗?
  9. 【线索二叉树】C++代码及线索化过程详解
  10. 微信小程序链接外部服务器接口
  11. 狂神说docker(最全笔记)--转载
  12. kibana 报错:Another Kibana instance appears to be migrating the index
  13. 关于影子(shadow)DOM
  14. javaWeb前端网页课程设计的实现——【JAVA篇】
  15. 大数据专业来袭!前京东大学大数据院长亲自为你授课!
  16. 未处理 SecurityException,PublicKeyToken=b77a5c561934e089 类型的权限已失败
  17. X86指令:NOP指令
  18. 腾讯面试题:服务器内存1G,有一个2G的文件,里面每行存着一个QQ号(5-10位数),怎么最快找出出现过最多次的QQ号。
  19. 新ipad 充电测试软件,你的充电器能喂饱新iPad Pro吗?新iPad Pro充电大对决
  20. mfence, lfence, sfence什么作用?

热门文章

  1. “快来”带你了解低轨卫星物联网的应用
  2. linux的技术性特征有,华为鸿蒙操作系统(HarmonyOS)主要特性介绍,附讲解图示...
  3. 做软件,中国人不比别人差 专访微软中国研究院院长:张亚勤 1
  4. NYOJ869---切蛋糕
  5. Unix时间戳在Excel中正确显示
  6. 随时随地创建在线考试,“无纸化”考试时代来临
  7. linux joomla安装教程,如何在Ubuntu 18.04上使用Apache安装Joomla
  8. 个人项目经历---玩转山大
  9. 绿皮书再版!ECMAScript 5th有讲呵!
  10. 看完《魔鬼经济学》(zz)