提供一个极简的demo
- 编写hello world
import java.util.*;
public class Test {
public static void main(String[] args) {
System.out.println("Hello world!");
System.out.println(new Date());
}
}
- 编写Dockerfile
touch dockerfile
# 基于java 9
FROM java:9
# 设置工作目录
WORKDIR /app
# 复制文件到工作目录
COPY . /app
# 设置java环境变量
ENV PATH=$PATH:$JAVA_HOME/bin
ENV JRE_HOME=${JAVA_HOME}/jre
ENV CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
# 编译
RUN ["/usr/lib/jvm/java-9-openjdk-amd64/bin/javac","Test.java"]
# 运行
ENTRYPOINT ["/usr/lib/jvm/java-9-openjdk-amd64/bin/java","Test"]
- 构建镜像并执行
执行以下命令来构建Docker镜像
docker build . -f dockerfile -t java-test:latest
构建成功后,运行
docker run java-test:latest
效果如图
Docker 资源限制
在"docker run"中,可以添加一下参数来限制容器资源使用:
docker run java-test:latest --cpus 4 --memory 100m
防止Java容器应用被杀
Docker Linux 容器使用Linux内核的CGroup机制来实现限制容器的资源(CPU,内存等)使用,当系统资源 不足时,系统就会根据优先级杀掉相关进程来维持系统的正常运行,导致常见的OOM错误。
为了 确保java容器应用正常运行,需要确保JVM获取可用的正确的CPU核心数和RAM容量,以相应地调整内部参数,在有限的资源下正常运行。
在OpenJDK8及更高版本可用正确检测容器的CPU内核数量和可用RAM,在OpenJDK11中,这是默认打开的。在8,9,10中,必须使用一下配置选项启用容器限制RAM的检测,否则JVM将使用主机配置而不是容器资源配置(其并不识别容器):
java --XX:+UnlockExperimentalVMOptions --XX:+UseCGruopMemoryLimitForHeap
除此之外,还可以用 “-Xmx” 参数指定JVM的最大内存。