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

2026-07-09 18:15:01 :0

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

本篇文章给大家谈谈docker部署java应用,以及如何把java 应用 制作成docker镜像对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录

如何把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提供了相应的启动参数

关于docker部署java应用,如何把java 应用 制作成docker镜像的介绍到此结束,希望对大家有所帮助。

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

本文编辑:admin

更多文章:


现代吉州窑玳瑁釉杯子贵吗?钧瓷梅瓶的特点与来历

现代吉州窑玳瑁釉杯子贵吗?钧瓷梅瓶的特点与来历

各位老铁们好,相信很多人对玳瑁釉梅瓶都不是特别的了解,因此呢,今天就来为大家分享下关于玳瑁釉梅瓶以及现代吉州窑玳瑁釉杯子贵吗的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录现代吉州窑玳瑁釉杯子贵吗钧瓷梅瓶的特点与

2026年9月15日 16:30

邮箱远程主机强迫关闭了一个现有的连接(foxmail为什么显示远程主机强迫关闭现有连接,能收邮件,可以发邮件,是怎么回事呢请各位帮忙解决下!)

邮箱远程主机强迫关闭了一个现有的连接(foxmail为什么显示远程主机强迫关闭现有连接,能收邮件,可以发邮件,是怎么回事呢请各位帮忙解决下!)

大家好,关于邮箱远程主机强迫关闭了一个现有的连接很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于foxmail为什么显示远程主机强迫关闭现有连接,能收邮件,可以发邮件,是怎么回事呢请各位帮忙解决下!的知识点,相信应该可以解决

2026年9月15日 17:30

启动界面图片(如何更改车载导航开机画面)

启动界面图片(如何更改车载导航开机画面)

本篇文章给大家谈谈启动界面图片,以及如何更改车载导航开机画面对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录如何更改车载导航开机画面微信启动

2026年7月26日 13:30

线程池内中断某个线程(如何终止 android线程池中的任务)

线程池内中断某个线程(如何终止 android线程池中的任务)

大家好,今天小编来为大家解答以下的问题,关于线程池内中断某个线程,如何终止 android线程池中的任务这个很多人还不知道,现在让我们一起来看看吧!本文目录如何终止 android线程池中的任务Java线程池停止空闲线程是否有规则Execu

2026年1月7日 07:15

为什么mysql没有bin目录(我在windows7下面安装mysql怎么会没有bin目录呢)

为什么mysql没有bin目录(我在windows7下面安装mysql怎么会没有bin目录呢)

本篇文章给大家谈谈为什么mysql没有bin目录,以及我在windows7下面安装mysql怎么会没有bin目录呢对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录我在windows7下面安装mysql怎么会没有bin目录呢我的

2026年2月7日 02:30

attuned什么意思(life rarely encountered so attuned to the met you,don’t miss.什么意思)

attuned什么意思(life rarely encountered so attuned to the met you,don’t miss.什么意思)

各位老铁们,大家好,今天由我来为大家分享attuned什么意思,以及life rarely encountered so attuned to the met you,don’t miss.什么意思的相关问题知识,希望对大家有所帮助。如果可

2025年11月5日 16:30

进程管理器端口(win7系统怎么查看端口被哪个进程占用情况呢)

进程管理器端口(win7系统怎么查看端口被哪个进程占用情况呢)

本篇文章给大家谈谈进程管理器端口,以及win7系统怎么查看端口被哪个进程占用情况呢对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录win7系统怎么查看端口被哪个进程占用情况呢查看进程端口怎么查看进程端口windows怎么查看进

2026年4月9日 11:45

统计学样本量计算公式(样本量计算公式是什么)

统计学样本量计算公式(样本量计算公式是什么)

大家好,关于统计学样本量计算公式很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于样本量计算公式是什么的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录样本

2025年7月17日 01:30

translate的用法及其词组(英语Arrival Site怎么翻译)

translate的用法及其词组(英语Arrival Site怎么翻译)

“translate的用法及其词组”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看translate的用法及其词组(英语Arrival Site怎么翻译)!本文目录英语Arrival Site怎么翻译高中英语常用固定短语请翻

2026年7月16日 00:00

girl怎么读音发音(girl的发音)

girl怎么读音发音(girl的发音)

本篇文章给大家谈谈girl怎么读音发音,以及girl的发音对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录girl的发音girl怎么读英语单

2026年4月12日 17:15

grassland(grassland怎么读 英语grassland怎么读)

grassland(grassland怎么读 英语grassland怎么读)

大家好,如果您还对grassland不太了解,没有关系,今天就由本站为大家分享grassland的知识,包括grassland怎么读 英语grassland怎么读的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录gr

2025年12月10日 09:45

elementui和bootstrap 哪个好(学习bootstrap还是vue好)

elementui和bootstrap 哪个好(学习bootstrap还是vue好)

大家好,关于elementui和bootstrap 哪个好很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于学习bootstrap还是vue好的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下

2026年4月1日 10:45

下载jquery最新版本教程(怎么引用bootstrap轮播图)

下载jquery最新版本教程(怎么引用bootstrap轮播图)

“下载jquery最新版本教程”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看下载jquery最新版本教程(怎么引用bootstrap轮播图)!本文目录怎么引用bootstrap轮播图dw日期选择框怎么设置精通javascr

2026年8月26日 01:45

revoke语句(sql语言中提供了哪些数据控制的语句)

revoke语句(sql语言中提供了哪些数据控制的语句)

今天给各位分享sql语言中提供了哪些数据控制的语句的知识,其中也会对sql语言中提供了哪些数据控制的语句进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录sql语言中提供了哪些数据控制的语句求:《数据库》1、什么

2026年4月27日 00:45

二次分式怎么求值域(如果是二次分式函数,那么应该怎么求值域)

二次分式怎么求值域(如果是二次分式函数,那么应该怎么求值域)

大家好,二次分式怎么求值域相信很多的网友都不是很明白,包括如果是二次分式函数,那么应该怎么求值域也是一样,不过没有关系,接下来就来为大家分享关于二次分式怎么求值域和如果是二次分式函数,那么应该怎么求值域的一些知识点,大家可以关注收藏,免得下

2026年9月18日 04:30

predominate是什么意思(这句话怎么翻译 In his eyes she eclipses and predominates the whole of her sex)

predominate是什么意思(这句话怎么翻译 In his eyes she eclipses and predominates the whole of her sex)

本篇文章给大家谈谈predominate是什么意思,以及这句话怎么翻译 In his eyes she eclipses and predominates the whole of her sex对应的知识点,文章可能有点长,但是希望大家可

2026年4月29日 13:30

手机上怎么显示html图片(html格式的图片在手机上怎么能打开)

手机上怎么显示html图片(html格式的图片在手机上怎么能打开)

各位老铁们好,相信很多人对手机上怎么显示html图片都不是特别的了解,因此呢,今天就来为大家分享下关于手机上怎么显示html图片以及html格式的图片在手机上怎么能打开的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文

2026年8月9日 01:30

js的replaceall(js 怎么替换不了 | 这个符号)

js的replaceall(js 怎么替换不了 | 这个符号)

大家好,如果您还对js的replaceall不太了解,没有关系,今天就由本站为大家分享js的replaceall的知识,包括js 怎么替换不了 | 这个符号的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录js 怎么

2026年9月16日 13:00

在线转换器jpg转pdf(jpg格式图片转换成pdf格式)

在线转换器jpg转pdf(jpg格式图片转换成pdf格式)

这篇文章给大家聊聊关于在线转换器jpg转pdf,以及jpg格式图片转换成pdf格式对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录jpg格式图片转换成pdf格式图片转PDF这几种方法你听说过吗把JPG转换成PDF格式文档的方法

2026年8月4日 08:15

安卓activity软件(activity(Android组件中最重要的四大组件之一)详细资料大全)

安卓activity软件(activity(Android组件中最重要的四大组件之一)详细资料大全)

这篇文章给大家聊聊关于安卓activity软件,以及activity(Android组件中最重要的四大组件之一)详细资料大全对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录activity(Android组件中最重要的四大组件

2026年7月30日 07:00

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索