Tomcat

Tomcat 简单介绍

Tomcat server是一个免费的开放源码的Web 应用server,属于轻量级应用server。在中小型系统和并发訪问用户不是非常多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个刚開始学习的人来说,能够这样觉得。当在一台机器上配置好Apache server,可利用它响应HTML(标准通用标记语言下的一个应用)页面的訪问请求。

实际上Tomcat 部分是Apache server的扩展,但它是独立执行的。所以当你执行tomcat 时。它实际上作为一个与Apache 独立的进程单独执行的。

诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上执行JSP 页面和Servlet。另外,Tomcat和IIS等Webserver一样。具有处理HTML页面的功能。另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。

只是。Tomcat处理静态HTML的能力不如Apacheserver。

眼下Tomcat最新版本号为8.0.0-RC1 (alpha) Released。 Tomcat 非常受广大程序猿的喜欢。由于它执行时占用的系统资源小,扩展性好。支持负载平衡与邮件服务等开发应用系统经常使用的功能;并且它还在不断的改进和完好中,不论什么一个感兴趣的程序猿都能够更改它或在当中加入新的功能。

Tomcat最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发的。后来他帮助将其变为开源项目,并由Sun贡献给Apache软件基金会。由于大部分开源项目O'Reilly都会出一本相关的书,并且将其封面设计成某个动物的素描,因此他希望将此项目以一个动物的名字命名。由于他希望这种动物能够自己照应自己,终于,他将其命名为Tomcat(英语公猫或其它雄性猫科动物)。而O'Reilly出版的介绍Tomcat的书籍(ISBN 0-596-00318-8)[1]的封面也被设计成了一个公猫的形象。而Tomcat的Logo兼吉祥物也被设计成了一仅仅公猫。

怎样设计 Tomcat 的 Dockerfile

$ sudo docker search tomcat |wc -l
285

在 dockerhub 上搜索与 tomcat 相关的镜像。有如此之多的返回。

笔者建议。如是个人开发为图方便。能够任意选择一个镜像。依照提示启动应用就可以。若准备在生产环境中使用。或者是几个人、团队协作的项目,上述这些镜像都不是那么合适了。

原因有三:

  • 每一个项目要求的 tomcat 版本号不一致
  • 每一个项目要求的 tomcat 变量不一致
  • 每一个项目要求的 jdk 不一致

最好的方式应该是由架构师通过 dockerfile 或者其它方式构建好统一的镜像,然后分发给项目组全部成员,具体的操作方式将在稍后的章节中小企业研发、測试、生产环境使用 docker中具体介绍。

以下就以 sun_jdk 1.6|tomcat 7.0|ubuntu 14.04 为环境介绍下怎样定制自己的 tomcat 镜像。

准备工作

#创建 tomcat7.0_jdk1.6 目录
$ mkdir tomcat7.0_jdk1.6
$ cd tomcat7.0_jdk1.6/
#上传 jdk 到 tomcat7.0_jdk1.6 目录以下,也能够到本书的共享网盘下载(下载地址xxx),下载后用 unzip 解压,若没有 unzip 能够先在 windows 机器上用解压软件解压再上传到目录底下。也能够使用 apt-get install unzip 来安装解压软件 unzip。
$ touch Dockerfile run.sh
#至于 tomcat ,读者能够使用自己熟悉的版本号,或者到官方站点下载最新的版本号。 $ wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.56/bin/apache-tomcat-7.0.56.zip
--2014-10-27 22:25:23-- http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.56/bin/apache-tomcat-7.0.56.zip
Resolving mirror.bit.edu.cn (mirror.bit.edu.cn)... 219.143.204.117, 2001:da8:204:2001:250:56ff:fea1:22
Connecting to mirror.bit.edu.cn (mirror.bit.edu.cn)|219.143.204.117|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9466255 (9.0M) [application/zip]
Saving to: 'apache-tomcat-7.0.56.zip' 100%[===========================================================================================================>] 9,466,255 152KB/s in 70s 2014-10-27 22:26:34 (131 KB/s) - 'apache-tomcat-7.0.56.zip' saved [9466255/9466255]
#相同解压后,眼下 tomcat7.0_jdk1.6 目录底下应该是这种。多余的 zip 已经被我删除。
$ ls
Dockerfile apache-tomcat-7.0.56 jdk run.sh

Dockerfile 文件和其它脚本文件

FROM sshd:dockerfile
#设置继承自我们创建的 sshd 镜像
MAINTAINER waitfish from dockerpool.com(dwj_zz@163.com)
#以下是一些创建者的基本信息 #环境变量设置,全部操作都是非交互式的
ENV DEBIAN_FRONTEND noninteractive RUN echo "Asia/Shanghai" > /etc/timezone && \
dpkg-reconfigure -f noninteractive tzdata #注意这里要更改系统的时区设置。由于在 web 应用中经常会用到时区这个系统变量,默认的 ubuntu 会让你的应用程序发生不可思议的效果哦 #安装跟 tomcat 用户认证相关的软件
RUN apt-get install -yq --no-install-recommends wget pwgen ca-certificates && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* #设置 tomcat 的环境变量。若读者有其它的环境变量须要设置,也能够在这里加入。 ENV CATALINA_HOME /tomcat
ENV JAVA_HOME /jdk #复制 tomcat 和 jdk 文件到镜像中
ADD apache-tomcat-7.0.56 /tomcat
ADD jdk /jdk ADD create_tomcat_admin_user.sh /create_tomcat_admin_user.sh
ADD run.sh /run.sh
RUN chmod +x /*.sh
RUN chmod +x /tomcat/bin/*.sh EXPOSE 8080
CMD ["/run.sh"]

创建 tomcat 用户和密码的脚本文件,create_tomcat_admin_user.sh 文件

#!/bin/bash

if [ -f /.tomcat_admin_created ]; then
echo "Tomcat 'admin' user already created"
exit 0
fi #generate password
PASS=${TOMCAT_PASS:-$(pwgen -s 12 1)}
_word=$( [ ${TOMCAT_PASS} ] && echo "preset" || echo "random" ) echo "=> Creating and admin user with a ${_word} password in Tomcat"
sed -i -r 's/<\/tomcat-users>//' ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-gui"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-script"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-jmx"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="admin-gui"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="admin-script"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo "<user username=\"admin\" password=\"${PASS}\" roles=\"manager-gui,manager-script,manager-jmx,admin-gui, admin-script\"/>" >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '</tomcat-users>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo "=> Done!"
touch /.tomcat_admin_created echo "========================================================================"
echo "You can now configure to this Tomcat server using:"
echo ""
echo " admin:${PASS}"
echo ""
echo "========================================================================"

run.sh 脚本文件

#!/bin/bash

if [ ! -f /.tomcat_admin_created ]; then
/create_tomcat_admin_user.sh
fi
/usr/sbin/sshd -D &
exec ${CATALINA_HOME}/bin/catalina.sh run

创建镜像、測试镜像

#删去了一下无关紧要的输出
$ sudo docker build -t tomcat7.0:jdk1.6 .
Sending build context to Docker daemon 234.8 MB
Sending build context to Docker daemon
Step 0 : FROM sshd:dockerfile
---> 570c26a9de68
Step 1 : MAINTAINER waitfish from dockerpool.com(dwj_zz@163.com)
---> Using cache
---> 5c6b90057a1d
Step 2 : ENV DEBIAN_FRONTEND noninteractive
---> Using cache
---> e06feb0790d7
Step 3 : RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
---> Running in 6dba2d312627 Current default time zone: 'Asia/Shanghai'
Local time is now: Tue Oct 28 13:47:08 CST 2014.
Universal Time is now: Tue Oct 28 05:47:08 UTC 2014. ---> a1dccb384edb
Removing intermediate container 6dba2d312627
...
Setting up pwgen (2.06-1ubuntu4) ...
---> e0e4ab118cda
Removing intermediate container aee38d8ab936
Step 5 : ENV CATALINA_HOME /tomcat
---> Running in 8d0d7176fb7e
---> e4d8891f4e86
Removing intermediate container 8d0d7176fb7e
Step 6 : ENV JAVA_HOME /jdk
---> Running in 53ce1fa9b8a0
---> f17a13a87981
Removing intermediate container 53ce1fa9b8a0
Step 7 : ADD apache-tomcat-7.0.56 /tomcat
---> ca1fa71b4130
Removing intermediate container 27e2d96bcb78
Step 8 : ADD jdk /jdk
---> d7a595c4c4f9
Removing intermediate container 00d980ad2cad
Step 9 : ADD create_tomcat_admin_user.sh /create_tomcat_admin_user.sh
---> 5055ca84decc
Removing intermediate container 220922d934ce
Step 10 : ADD run.sh /run.sh
---> da469edb1022
Removing intermediate container f0dde8563174
Step 11 : RUN chmod +x /*.sh
---> Running in 71564c350a2e
---> 5f566293e37c
Removing intermediate container 71564c350a2e
Step 12 : EXPOSE 8080
---> Running in 055c41de3bd8
---> b1213c1bc920
Removing intermediate container 055c41de3bd8
Step 13 : CMD /run.sh
---> Running in 5dbe1220a559
---> ce78537c247d
Removing intermediate container 5dbe1220a559
Successfully built ce78537c247d
#查看下眼下拥有的镜像
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
tomcat7.0 jdk1.6 ce78537c247d 9 minutes ago 473.3 MB
nginx albb 8e333a6f1d10 14 hours ago 567.6 MB
nginx stable 4e3936e36e31 15 hours ago 262.3 MB
apache ubuntu 06d84c79e905 16 hours ago 263.8 MB
sshd dockerfile 570c26a9de68 26 hours ago 246.5 MB
sshd ubuntu 7aef2cd95fd0 39 hours ago 255.2 MB
debian latest 61f7f4f722fb 7 days ago 85.1 MB
busybox latest e72ac664f4f0 3 weeks ago 2.433 MB
ubuntu 14.04 ba5877dc9bec 3 months ago 192.7 MB
ubuntu latest ba5877dc9bec 3 months ago 192.7 MB #执行一个測试的 tomcat 容器
$ sudo docker run -d -P tomcat7.0:jdk1.6
3cd4238cb32a713a3a1c29d93fbfc80cba150653b5eb8bd7629bee957e7378ed
#通过 docker logs 得到 tomcat 的密码
$ sudo docker logs 3cd
=> Creating and admin user with a random password in Tomcat
=> Done!
========================================================================
You can now configure to this Tomcat server using: admin:aBwN0CNCPckw ========================================================================
Oct 28, 2014 2:02:24 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /jdk/jre/lib/amd64/server:/jdk/jre/lib/amd64:/jdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Oct 28, 2014 2:02:24 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Oct 28, 2014 2:02:24 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
Oct 28, 2014 2:02:24 PM org.apache.catalina.startup.Catalina load
#查看映射的port
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3cd4238cb32a tomcat7.0:jdk1.6 "/run.sh" 4 seconds ago Up 3 seconds 0.0.0.0:49157->22/tcp, 0.0.0.0:49158->8080/tcp cranky_wright

在另外一台机器上使用浏览器登陆 输入我们从 docker logs 输出中得到的密码 成功进入管理界面 

注意事项

在实际环境中,我们能够通过使用 -v 參数来覆盖 tomcat 的日志文件、程序所在目录、以及与 tomcat 相关的一切配置。

很多其它内容,欢迎关注 www.dockerpool.com

「五」创建一个带 tomcat 服务的基础镜像(修订版)的更多相关文章

  1. 「六」创建一个带 weblogic 服务的基础镜像

    Weblogic Weblogic 简单介绍以及其在 Docker 环境下的特殊应用 WebLogic是美国Oracle公司出品的一个application server确切的说是一个基于JAVAEE ...

  2. 「两」创建一个带 ssh 镜座服务(修订版)--采用 Dockerfile 创

    创建目录 首先,创建一个叫做 sshd_ubuntu 的目录,用于存放我们的 Dockerfile .脚本文件.以及其它文件. $ mkdir sshd_ubuntu $ ls sshd_ubuntu ...

  3. 如何创建一个带诊断工具的.NET镜像

    现阶段的问题 现在是云原生和容器化时代,.NET Core对于云原生来说有非常好的兼容和亲和性,dotnet社区以及微软为.NET Core提供了非常方便的镜像容器化方案.所以现在大多数的dotnet ...

  4. 创建一个带模版的用户控件 V.3

    再重构此篇<创建一个带模版的用户控件  V.2>http://www.cnblogs.com/insus/p/4164149.html 让其它动态实现header,Item和Footer. ...

  5. 创建一个带模版的用户控件 V.2

    前面有做练习<创建一个带模版的用户控件>http://www.cnblogs.com/insus/p/4161544.html .过于简化.通常使用数据控件Repeater会有网页写好He ...

  6. 「Linux」制作一个Linux系统

    一.前言 Linux操作系统至1991年10月5日诞生以来,就其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在Linux内核还是开源软件等方面,都为我们 ...

  7. angular创建一个独立弹窗服务

    1.说明: 这个服务用于创建一个modal(弹窗),通常下,这个弹窗会插入到body的底部,并且拥有自己的作用域($scope),也可以和外界通讯. 2.逻辑: (1).创建模版 (2).拿到模版里要 ...

  8. 构建一个拥有sshd服务的docker镜像

    不直接描述结果,通过一个过程探究如何写一个 Dockerfile 一.环境 虚拟机CentOS7.4,Docker1.13.1 二.尝试步骤 1.下载基础镜像 docker pull alpine:3 ...

  9. micronaut 学习 二 创建一个简单的服务

    micronaut 提供的cli 很方便,我们可以快速创建具有所需特性的应用,以下是一个简单的web server app 创建命令 mn create-app hello-world 效果 mn c ...

随机推荐

  1. jquery滚轮事件

    // jquery 兼容的滚轮事件 $(document).on("mousewheel DOMMouseScroll", function (e) { var delta = ( ...

  2. Javascript中的那些bug

    1. x(比如document) is not defined 不止要检查是不是没有声明变量就使用了,还要检查是不是对象的方法调用写错了!比如: alert( document.getElementB ...

  3. git reset作用

    git reset: 1. 文件从暂存区回退到工作区,撤销add 2. 版本回退  一:文件从暂存区回退到工作区,撤销add 如果想取消某个add的文件,可以使用该命令来进行撤销操作 撤消add:gi ...

  4. 【C++】智能指针简述(三):scoped_ptr

    在介绍scoped_ptr之前,我们先回顾一下前两篇文章的内容. 首先,智能指针采用RAII机制,通过对象来管理指针,构造对象时,完成资源的初始化;析构对象时,对资源进行清理及汕尾. auto_ptr ...

  5. 在iframe内页面完全加载完后,关闭父页面生成的div遮罩层

    遮罩层div为iframe父页面生成,需在iframe内页面完全加载完后,关闭遮罩层 alertMsgClose() :函数为关闭遮罩层函数 此段代码在iframe页面内: <script> ...

  6. .ai域名注册已经极具投资价值进入火爆期

    最近G.ai以六位数的天价被国内域名收藏家收入囊中,间接说明了.ai域名的价值不断攀升,自从2016年AlphaGo胜利以来,人工智能几乎成为人人谈资,而由于.com域名被挖掘待尽,一些聪明的人工智能 ...

  7. (转)淘淘商城系列——商品搜索功能Service实现

    http://blog.csdn.net/column/details/15737.html 首先我们在taotao-search-interface工程中新建一个SearchService接口,并在 ...

  8. POJ_1088_(dp)(记忆化搜索)

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 95792   Accepted: 36322 Description ...

  9. Leetcode加一 (java、python3)

    加一 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. Given ...

  10. Leetcode724:寻找数组的中心索引(java、python3)

    寻找数组的中心索引 给定一个整数类型的数组 nums,请编写一个能够返回数组"中心索引"的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相 ...