Coding云

码云的愿心:希望广大程序猿朋友摘掉苦逼的昵称

服务器

docker通过dockFile定制tomcat8镜像,启动tomcat容器

docker通过dockFile定制tomcat8镜像,启动tomcat容器

准备工作:
我们服务器上会通过docker安装mysql,nginx,tomcat等等应用,而这些应用需要共享某些目录,这样才能方便使用文件,以及nginx才可以做文件映射等。
前两篇安装mysql、nginx共享的目录是/alidata,因此我们在/alidata/myDocker/tomcat下新建tomcat需要的server.xml配置文件,并把war文件放进来。
进入/alidata/myDocker/tomcat下,准备好server.xml,
进入宿主机/etc目录下,复制localtime,timezone文件到/alidata/myDocker/tomcat目录,防止容器时间与宿主机时间不一致
然后新建新建一个Dockerfile文件,文件名”Dockerfile”,内容如下:


# First docker file from tomcat:8.5.38-jre8
# VERSION 1.0
# Author: coding云

#基础镜像(选择镜像时不要选slim版本的)
FROM tomcat:8.5.38-jre8

#作者,使用LABEL指令,可以为镜像设置元数据,例如镜像创建者或者镜像说明。旧版的Dockerfile语法使用MAINTAINER指令指定镜像创建者,但是它已经被弃用了。
LABEL MAINTAINER coding云 <jack_bj@163.com>

#定义配置文件目录
ENV WORK_PATH /usr/local/tomcat/conf

#定义war运行目录
ENV WAR_PATH /usr/local/tomcat/webapps

#定义要替换的server.xml文件名
ENV SERVER_CONF_FILE_NAME server.xml

#删除原文件server.xml,删除webapps目录下的自带项目
RUN rm -rf $WORK_PATH/$SERVER_CONF_FILE_NAME && rm -rf $WAR_PATH/*

#复制文件server.xml,以及时区文件,防止容器中时间与宿主机时间不一致
COPY  ./$SERVER_CONF_FILE_NAME $WORK_PATH/
COPY  ./localtime /etc/
COPY  ./timezone /etc/


以上就是Dockerfile的全部内容,几个关键点如下:
1. FROM FROM tomcat:8.5.34-jre8-slim的意思是使用tomcat:8.5.34-jre8-slim作为基础镜像,8.5.34-jre8-slim是tag,slim代表该tag的镜像更加精简节省空间(镜像版本需要去https://hub.docker.com/,在explore下查找镜像);
2. 使用了tomcat:7.0.77-jre8作为基础镜像后,通过RUN rm命令将原有的server.xml和webapps目录下的默认项目删除;
3. 将我们准备工作中准备的server.xml文件复制到原来的conf目录下,这样就用取代了原有的文件;

进入/alidata/myDocker/tomcat目录下:
有3个文件
Dockerfile
server.xml
codingYun-web.war  
(
该war是需要运行在tomcat的war包,server.xml里配置了Context节点
<Context path="" reloadable="true" docBase="/alidata/myDocker/tomcat1/codingYun-web.war"/>
当有新的war包版本需要更新时,直接上传新版war到/alidata/myDocker/tomcat,重新运行容器即可
)

执行命令生成镜像:
docker build -t jack-tomcat8jre8:1.0 .
后面的.代表的是相对路径的当前目录,如果需要全路径则为/alidata/myDocker/(就是找到Dockerfile文件)
镜像做好之后我们就创建运行应用的容器:
docker run -itd\
  --name tomcat_weishi_01 \
  -p 8090:8080 \
  -v /alidata:/alidata \
  jack-tomcat8jre8:1.0

解释一下上面命令的含义:

run -itd:在docker中运行一个带交互式的且能后台运行的容器,如果运行后发现tomcat没有正常启动,可以去掉该参数重新运行,这样能看到日志。
--name nginx:给容器命名为nginx,注意name前面有两个小横杠,你也可以自己随意命名。
-p 8080:8080:这里是指将容器的8080端口映射到主机的8080端口,冒号前面指的是主机,后面指的是容器。
-v: 是宿主机的项目静态文件目录挂载到容器的目录下
-v: 示例表示把宿主机的/alidata 目录挂载到容器的/alidata目录下;这样容器就可以与宿主机共享alidata目录下的文件了,比如项目静态文件等。
jack-tomcat8jre8:1.0: 示例表示用tag为1.0的jack-tomcat8jre8镜像创建容器


附:

自动执行的shell脚本


 #/bin/bash
#########################################
#publish:     执行DockerFile生成weishi的tomcat镜像,并通过该镜像生成容器,运行该容器。
#Author:      wang yong
#Company:     www.codingyun.com
#Version:     1.0
#########################################
imageName="weishi-tomcat8jre8"
imageTag="1.0"
tomcatName="tomcat_weishi"
publishDate=`date +%Y%m%d%H%M`
echo "start build image ${imageName}:${imageTag}"
echo "build start ${publishDate}"
#执行命令生成镜像:
docker build -t ${imageName}:${imageTag} .
echo "run container start ${publishDate}"
#说明:docker ps -a 查询出所有的容器,
#然后通过grep 使用扩展的正则表达式匹配,找出匹配的内容
#接着用awk打印出第一列也就是CONTAINER ID的那一列,然后将结果作为参数传给删除命令.
#先尝试停用weishi项目的tomcat容器
docker ps -a | grep -E "(${tomcatName})"  | awk '{print $1}' | uniq | xargs -I {} docker stop {}
#再删除weishi项目的tomcat容器
docker ps -a | grep -E "(${tomcatName})"  | awk '{print $1}' | uniq | xargs -I {} docker rm {}
#镜像做好之后我们就创建运行应用的容器:
docker run -itd --name ${tomcatName}  -p 8090:8080  -v /alidata:/alidata ${imageName}:${imageTag} 
这篇文章帮我解决问题了,我忍不住的想点赞!!!
同时也想小小的打赏一笔表示感谢。

已经有4位老爷赞赏了本文

打赏方式一:
打开支付宝,使用“扫一扫”打赏。
支付宝打赏
打赏方式二:
打开微信,使用“扫一扫”打赏。
微信打赏