docker部署java应用(如何把java 应用 制作成docker镜像)

本文目录
- 如何把java 应用 制作成docker镜像
- Docker项目部署内存占用过高的问题解决
- dockerweb项目更新快捷方式
- docker在web开发中得使用流程是怎样的
- 如何设置Docker容器中Java应用的内存限制
如何把java 应用 制作成docker镜像
利用Dockerfile构建一个简单的java应用镜像,依赖环境比较简单,JDK,定制化的Tomcat(名为star-appserver)
1、环境准备
ubuntu:14.04
docker : 1.4
jdk:jdk-8u31-linux-x64.gz
tomcat : 7.0(star-appserver)
在/usr/local下创建目录:sms,将jdk-8u31-linux-x64.gz和star-appserver(此处为了简单,已包含应用)拷贝到此目录下,由于Docker在构建镜像时,需将Dockerfile所在目录传给Docker daemon作为构建上下文,所以此目录下应包含构建时所依赖的各种环境。
2、环境准备好后,在sms下创建Dockerfile(名字必须为Dockerfile)文件,内容如下
FROM ubuntu:latest
MAINTAINER zhangjy
#install JDK and TOMCAT
ADD jdk-8u31-linux-x64.gz /usr/local/
ADD tomcat /usr/local/ #tomcat下为star-appserver,如果直接复制star-appserver,只会复制目录里边的内容,不会复制目录本身
ADD timezone /etc/
#启动脚本,用于从镜像启动容器时调用执行,见下面的ENTRYPOINT
ADD onStart.sh /usr/local/
ENV JAVA_HOME=/usr/local/jdk1.8.0_31 CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar PATH=$PATH:$JAVA_HOME/bin
RUN echo "JAVA_HOME=/usr/local/jdk1.8.0_31\nCALSSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar\nPATH=$PATH:$JAVA_HOME/bin" 》》 /etc/profile
#start tomcat
ENTRYPOINT
3、在sms下创建onStart.sh,并赋予执行权限,用于启动tomcat并输出日志(为了保证容器中有执行状态的进程,否则容器停止)
#!/bin/bash
/usr/local/star-appserver/bin/startup.sh
tail -f /usr/local/star-appserver/logs/stariboss.log
4、在sms下执行命令,创建成功
$docker build -t zhangjy/starsms:v1 .
启动时,发现应用访问数据库报错:ORA-01882: timezone region not found,原因是JVM默认使用Ubuntu的/etc/timezone里配置的时区,查看timezone时区为Etc/UTC,再查看ORACLE数据库支持的时区:select * from V$TIMEZONE_NAMES发现没有,于是又在sms目录下创建了一个timezone文件,将时区配置成Asia/Shanghai,在Dockerfile中加入到镜像/etc/目录下
Dockerfile文件配置说明:
FROM
表明基于哪个镜像创建
MAINTAINER
作者和邮箱
ADD
将目录或文件加入到镜像的某个目录,格式是ADD 《源文件》 《目标目录》
RUN
有两种格式:
RUN 《command》 (the command is run in a shell - /bin/sh -c - shell form)
RUN (exec form)
默认RUN后的命令是在/bin/sh下执行,像Ubuntu默认/bin/sh是指向/bin/dash,如果想使用/bin/bash,则可按如下方式
RUN
但需注意,这种方式不能解析类似于$HOME的参数引用
ENV
设置环境变量,在镜像构建过程中和容器启动后均有效
CMD
CMD在容器运行的时候提供一些命令及参数,用法如下:
CMD (as default parameters to ENTRYPOINT) CMD command param1 param2 (shell form)
- 第一种用法:运行一个可执行的文件并提供参数。
- 第二种用法:为ENTRYPOINT指定参数,即为ENTRYPOINT指定命令的默认参数,通过docker run命令传过来的参数会将其覆盖
- 第三种用法(shell form):是以”/bin/sh -c”的方法执行的命令。
如指定:
1. CMD
build后运行(假设镜像名为ec):
1. docker run ec
就会输出: this is a echo test
注意:如果在docker run命令后指定命令,如docker run ec echo ’test’,会将CMD的命令覆盖。CMD的命令不能接收run传过来的参数,而ENTRYPOINT可以
ENTRYPOINT
有两种用法
ENTRYPOINT (the preferred exec form)
ENTRYPOINT command param1 param2 (shell form)
第一种可以接收docker run命令传过来的参数(即使docker run传过来的是命令,也会被当做参数处理),如果想覆盖,可使用docker run ... --entrypoint 《COMMAND》
Docker项目部署内存占用过高的问题解决
本文主要针对docker来部署java程序的时候,常常会出现内存占有很大的问题,通过调整docker的配置来限制内存占用
测试环境下服务器的配置为24核64G内存,启动微服务,在没有进行内存限制的时候,我们通过 docker stats 命令查看一下微服务的内存占用,如下图
我们看一下Dockerfile文件的配置
对应的启动脚本 start.sh 的配置如下:
我们再看一下docker-compose的配置
配置中都没有对docker内存以及jvm内存做任何限制,导致了我们docker容器启动,占用内存过大的问题
首先我们对java启动时jvm内存大小做个调整,增加jvm启动参数 -Xms1024M -Xmx1024M -Xmn256M -Xss256K
调整后的启动脚本 start.sh 如下:
调整完jvm启动参数之后,重新启动容器,结果如下:
发现内存使用上已经根据我们调整的大小降了下来
到这里,问题基本解决,不过看到容器的内存限制还是62G,这样显然还是不合理的,我们也要对容器进行调整,调整方式有两种
直接指定容器最多使用 200M 物理内存和 200M swap。
其中mem_limit用于控制容器默认启动时会使用 1/16*物理内存的现象,导致几个服就占满了全部内存。
v3版本中,配置如下:
注意 deploy 仅 docker deploy stack 生效
或使用 docker-compose --compatibility up 生效
配置完成之后,重启docker服务,如下图:
容器内存限制发生了变化,达到了我们的预期效果
1. JVM常用启动参数
2. 如何限制docker容器的内存大小
3. 在Docker Compose file 3下限制CPU与内存
dockerweb项目更新快捷方式
更新jar包,然后重启容器。
使用docker部署Javaweb项目时,需要制作jar包,上传jar包,制作新镜像,停止容器,.启动新的容器,这样的更新方式步骤是比较繁琐而且很浪费时间,一般只需要更新jar包然后进行重启容器就可以了。
docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。
docker在web开发中得使用流程是怎样的
docker在web开发中得使用流程概述:
1、创建java镜像:
把所有的文件都放置在docker目录下,分别为不同的功能创建不同的目录。
$ sudo mkdir docker/java
$ sudo cd docker/java
接下来在该目录下创建一个jdk的Dockerfile文件,具体内容如下:
# openjdk 6
# version 1.0
FROM ubuntu:14.04
MAINTAINER mhy "mhy2011@gmail.com"
RUN apt-get update
RUN apt-get install -y -q openjdk-7-jdk
WORKDIR /
ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
CMD
创建完Dockerfile之后来生成一个jdk的镜像
$ sudo docker build -t pobaby/java .
可以看到已经生成了一个镜像名为pobaby/java的镜像,接下来检验一下该镜像能否正常使用,通过该镜像启动一个容器,然后看看java命令是否能执行。
2、创建resin镜像
这里以使用的webserver是resin,没有使用tomcat,以此说明:
使用刚才创建的pobaby/java的镜像为基础镜像来创建resin镜像
# resin
# version 1.0
FROM pobaby/java
MAINTAINER mhy "mhy2011@gmail.com"
RUN apt-get update
ADD resin-3.1.14.tar.gz /opt/
WORKDIR /opt/
RUN mv resin-3.1.14 resin
EXPOSE 8080
***隐藏网址***
关于这个Dockerfile中有一行
ADD resin-3.1.14.tar.gz /opt/
是把当前目录下的resin-3.1.14.tar.gz添加到容器的/opt/目录下并解压,当然也可以指定从网络上下载
接下来再生成一个包含resin的镜像
$ sudo docker build -t pobaby/resin .
这里又生成了一个名为pobaby/resin的镜像。接下来通过该镜像启动一个容器,观察一下环境是否正常。
$ sudo docker run -d -p 80:8080 --name web001 pobaby/resin
3、接下来访问一下该容器,把本机80端口映射到容器的8080端口上
4、启动Web项目
创建一个包含WebServer的基本镜像,然后启动一个容器,在启动容器的时候挂载上本地的web应用,具体如下:
$ sudo docker run -d -p 8881:8080 --name web-demo -v $PWD/webapps:/opt/resin/webapps pobaby/resin
以上启动了一个名为web-demo容器,并把webapps下的项目web-demo挂载到容器/opt/resin/webapps下
访问结果如下:
以上已经实现了一个简单的基于Docker容器运行的Java Web程序。
如何设置Docker容器中Java应用的内存限制
然而在Docker集群上部署运行Java容器应用的时候,仅仅对JVM的heap参数设置是不够的,我们还需要对Docker容器的内存资源进行限制:
1. 限制容器使用的内存的最大量,防止对系统或其他应用造成伤害
2. 能够将Docker容器调度到拥有足够空余的内存的节点,从而保证应用的所需运行资源
关于容器的资源分配约束,Docker提供了相应的启动参数

更多文章:
线程池内中断某个线程(如何终止 android线程池中的任务)
2026年1月7日 07:15
为什么mysql没有bin目录(我在windows7下面安装mysql怎么会没有bin目录呢)
2026年2月7日 02:30
进程管理器端口(win7系统怎么查看端口被哪个进程占用情况呢)
2026年4月9日 11:45
translate的用法及其词组(英语Arrival Site怎么翻译)
2026年7月16日 00:00
grassland(grassland怎么读 英语grassland怎么读)
2025年12月10日 09:45
elementui和bootstrap 哪个好(学习bootstrap还是vue好)
2026年4月1日 10:45
下载jquery最新版本教程(怎么引用bootstrap轮播图)
2026年8月26日 01:45
二次分式怎么求值域(如果是二次分式函数,那么应该怎么求值域)
2026年9月18日 04:30
手机上怎么显示html图片(html格式的图片在手机上怎么能打开)
2026年8月9日 01:30
js的replaceall(js 怎么替换不了 | 这个符号)
2026年9月16日 13:00
安卓activity软件(activity(Android组件中最重要的四大组件之一)详细资料大全)
2026年7月30日 07:00














