基于Java+Tomcat的Docker镜像
Docker镜像好不好并不完全是大小的问题,我喜欢自己动手制作自己的镜像这样感觉比较安全;更加适合自己。
系统环境:Centos6.5
制作工具:febootstrap
1、搭建一个内网源;在这个内网源主机上挂载上系统光盘:方便更新下载所有的包:
详情可参考上一篇文章:http://www.58jb.com/html/66.html
本次制作一个Java与Tomcat结合的镜像:
一、建立一个目录,命令为Tomcat7
mkdir Tomcat7
切换到上面的Tomcat7目录下,把jdk-7u79-linux-x64.gz和apache-tomcat-7.0.68.tar.gz解压到当前目录:
目录下的文件有:
[root@centos tomcat7]# ls
apache-tomcat-7.0.68 Dockerfile jdk1.7.0_79 start_tomcat.sh
Dockerfile文件内容:
FROM centos6.5
MAINTAINER swper <hz328@qq.com>
#Make java and tomcat install directory
RUN mkdir -p /usr/local/java && mkdir -p /data/tomcat
#Copy jre and tomcat into image
ADD jdk1.7.0_79 /usr/local/java
ADD apache-tomcat-7.0.68 /data/tomcat
ADD start_tomcat.sh start_tomcat.sh
#Expose http port
EXPOSE 8080
start_tomcat.sh 文件内容:
#!/bin/bash
#Date: 2016/08/24
#Desc: swper
#Start tomcat with docker containerstart.
echo "Start Tomcat ..."
# Export java path
export PATH=$PATH:/usr/local/java/bin
export TOMCAT_HOME=/data/tomcat
# Start tomcat
bash $TOMCAT_HOME/bin/catalina.sh run
修改apache-tomcat-7.0.68/bin/catalina.sh文件内容:区别在于-Denv=dev
【由于多套环境,所以这个要修改】,和内存配置大小;
JAVA_OPTS="-server -XX:PermSize=1024m -XX:MaxPermSize=2048m -Denv=dev -Dfile.encoding=UTF-8"
删除Tomcat目录下的webapps下所有文件;可节省镜像打包后的大小;
rm -rf rm -rf apache-tomcat-7.0.68/webapps/*
Build镜像:【名字可随意,可用tag重新命名】
docker build -t tomcat7:dev .
查看镜像:
[root@centos tomcat7]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
tomcat709 latest 2b35c9249340 5 hours ago 590.5 MB
tomcat7 dev 2b35c9249340 5 hours ago 590.5 MB
tomcat v14 d15e965a97e5 5 days ago 590.5 MB
tomcat704 latest 767036a52e4c 13 days ago 590.5 MB
centos6.5 latest e0cf85ebb835 2 weeks ago 276 MB
使用方法:
在宿主机上创建相应目录:
mkdir -p /data/{logs,webapps}
webapps:存放Java项目
Logs: 存放Tomcat的日志
启动容器:
docker run -it -d --name=w1 -p 8081:8080 -v /data/webapps/h5-server:/data/tomcat/webapps -v /data/logs:/data/tomcat/logs tomcat7:dev /bin/bash start_tomcat.sh
启动后,访问地址:192.168.18.51:8081/h5-server即可访问到项目,日志就存储到/data/logs里了。不过日志有点延迟一秒左右;
可通过Nginx做反代直接跳到容器里:
如果出现容器内的时间不致可以再添加挂载一个文件到容器里:
在宿主机上定时同步互联网上的时间,这样再以只读方式挂载到容器即可解决;
-v /etc/localtime:/etc/localtime:ro