目标:alpine + jdk8 + openJ9 + tomcat7
上述镜像可以基于 ssuhvs/alpine-openjdk8-openj9:v1.2 ,再追加一个tomcat7即可 。至于为什么使用openJ9 网上有很多说明,我的个人网站:啰嗦的VIP 使用openJ9前经常出现内存报警,使用openJ9运行之后内存占用明显下降!再没有出现过应用宕掉的问题!
步骤:
1、下载原有镜像 (这个镜像的说明请看这里)
docker pull ssuhvs/alpine-openjdk8-openj9:v1.2
2、生成容器:
docker run -dit --name tomcat7 ssuhvs/alpine-openjdk8-openj9:v1.2
这时输入docker ps已经能看到正在运行的 容器了,下一步是进入容器安装tomcat7 ,并提交就可以了! 注意上面的启动参数里的 -d 代表可以后台运行,不然退出容器后所有数据会丢失!!
已经制作好的镜像名称: ssuhvs/alpine-openjdk8-openj9:v1.2_tomcat7
3、进入容器安装 tomcat 到 /opt/ 下
docker exec -it tomcat7 /bin/sh
cd到/opt/目录下,使用wget 命令下载 tomcat7
wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.90/bin/apache-tomcat-7.0.90.tar.gz
解压: tar -zxvf apache-tomcat-7.0.90.tar.gz
然后退出容器,在外部提交tomcat7容器到镜像文件中, 版本tag为 v1.2_tomcat7.0.90
docker commit tomcat7 lostvip/alpine-openjdk8-openj9:v1.2_tomcat7.0.90
4、这时tomcat还不能随容器启动,需要写个Dockerfile来设置自启动,最后面一行就是启动命令:
FROM alpine-openjdk8-openj9:v1.2_tomcat7.0.90
MAINTAINER lostvip
ENV REFRESHED_AT 2018-07-12
#公开端口
EXPOSE 8080
#设置启动命令,注意这里的启动脚本不是start.sh
ENTRYPOINT ["/usr/tomcat/bin/catalina.sh","run"]
Dockerfile 随便放到一个目录即可,然后进入此目录执行(注意最后面要有一个.):
docker build -t alpine-openjdk8-openj9:v1.2_tomcat7.0.90 .
这样就生成了我们需要的镜像了,并覆盖掉原来的旧镜像。
如果要提交到hub.docker.com可以:
docker login 后 输入用户名、密码 登录成功后再推送镜像即可
docker push alpine-openjdk8-openj9:v1.2_tomcat7.0.90
如果想使用本人的镜像可以从这里获取:
https://hub.docker.com/r/ssuhvs/alpine-openjdk8-openj9/
或者直接:docker pull alpine-openjdk8-openj9:v1.2_tomcat7.0.90
此镜像中tomcat的安装目录:/opt/apache-tomcat-7.0.90
5、附录:docker compsoe 中可以这样使用(端口映射到8881上)
version: '2'
tomcat8881:
image: ssuhvs/alpine-openjdk8-openj9:v1.2_tomcat7.0.90
hostname: tomcat8881
container_name: tomcat8881
privileged: true
volumes:
- ./tomcat/webapps:/opt/apache-tomcat-7.0.90/webapps
- ./tomcat/logs:/opt/apache-tomcat-7.0.90/logs
- ./tomcat/upload:/usr/local/upload_by_tomcat
ports:
- "8881:8080"
#要连接的其它容器服务名
#links:
# - mysql3306
# - redis6379
environment:
TIMEZONE: Asia/Shanghai
LANG: "zh_CN.UTF-8"
ulimits: # 操作系统限制
nproc: 65535
mem_limit: 4096m # 最大内存使用不超过4G,我在本地机器上测试,才只写了1024m,生产上需要根据自己的服务器配置,以及docker容器数进行调优.
restart: always