「五」创建一个带 tomcat 服务的基础镜像(修订版)

Tomcat

Tomcat 简介

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前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([email protected]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([email protected]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
#查看映射的端口
$ 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

时间: 2024-10-12 15:10:28

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

「一」创建一个带 ssh 服务的基础镜像(修订版)--使用「docker commit」创建

在介绍如何创建带 ssh 服务的基础镜像之前,我们想回顾一下之前介绍过的内容,其中提到有三种创建镜像的常用办法: 从文件系统导入 从现有容器使用「docker commit」提交 使用 dockerfile 文件 build 本章将主要介绍后面 2 种方法. 步骤如下: $ sudo docker run -ti ubuntu:14.04 /bin/bash #首先,使用我们最熟悉的 「-ti」参数来创建一个容器. [email protected]:/# sshd bash: sshd: co

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

Weblogic Weblogic 简介以及其在 Docker 环境下的特殊应用 WebLogic是美国Oracle公司出品的一个application server确切的说是一个基于JAVAEE架构的中间件,BEA WebLogic是用于开发.集成.部署和管理大型分布式Web应用.网络应用和数据库应用的Java应用服务器.是商业市场上主要的Java(J2EE)应用服务器软件(application server)之一,是世界上第一个成功商业化的J2EE应用服务器.目前weblogic在世界ap

「二」创建一个带 ssh 服务的基础镜像(修订版)--使用 Dockerfile 创建

创建文件夹 首先,创建一个叫做 sshd_ubuntu 的文件夹,用于存放我们的 Dockerfile .脚本文件.以及其他文件. $ mkdir sshd_ubuntu $ ls sshd_ubuntu $ cd sshd_ubuntu/ $ touch Dockerfile run.sh $ ls Dockerfile run.sh 编写 shell 脚本和 authorized_keys 文件 其中脚本文件 run.sh 的内容与上一小节一致 #!/bin/bash /usr/sbin/s

「四」创建一个带 apache 服务的镜像

Apache 是世界使用排名第一的 Web 服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的 Web 服务器端软件.同时 Apache 音译为阿帕奇,是北美印第安人的一个部落,叫阿帕奇族,在美国的西南部.也是一个基金会的名称.一种武装直升机等等. 下面是使用 Dockerfile 来创建带 apache 服务的镜像的过程. 创建 apache 文件夹 首先,创建一个叫做 apache_ubuntu 的文件夹,用于存放我们的 Dockerfile

创建一个支持 sshd 服务的 docker 镜像

前言 当我们运行容器后,第一件会想到的事情,就是如何连接容器.一般来说,连接容器的方式大概有四种.分别是attach.exec.ssh 和 nsenter. attach 和 exec 都是 docker 自带的命令,不需要做任何配置. 这篇文章,主要尝试配置一个实现 sshd 服务的镜像.并用这个镜像生成容器,然后验证 ssh 登录的功能. 操作过程 环境说明 宿主机 : ubunt:16.04 用 Dockerfile 文件建立一个镜像 hell[email protected]:~/mys

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

再重构此篇<创建一个带模版的用户控件  V.2>http://www.cnblogs.com/insus/p/4164149.html 让其它动态实现header,Item和Footer. Insus.NET不想所有代码写在InstantiateIn(Control container)方法内的switch分流上.其实是想使用开发设计模式的中介者(Mediator)来拆分它. 拆分为四个方法:ListItemType.Header: ListItemType.Item: ListItemTyp

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

前面有做练习<创建一个带模版的用户控件>http://www.cnblogs.com/insus/p/4161544.html .过于简化.通常使用数据控件Repeater会有网页写好Header,Item,AlternatingItem和Footer.如果需要动态产生列时,我们需要在后台写好模板. 再来复习一下这篇<Repeater控件动态变更列(Header,Item和Foot)信息>http://www.cnblogs.com/insus/archive/2013/03/22

创建带Tomcat服务的Centos Docker镜像

Tomacat服务器是一个免费的开源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下普遍使用,是开发和高度JSP程序的首选. 下面我就分步骤向大家介绍如何创建带Nginx服务的Centos Docker镜像. 基础镜像: [root@localhost ~]# docker images REPOSITORY     TAG       IMAGE ID      CREATED      VIRTUAL SIZE sshd    dockerfile  

创建一个带模版的用户控件

今天学习与练习,做一个用户控件,让其带模版的.关键是两个接口ITemplate和INamingContainer,有关此两个接口技术诠释可以查MSDN官网. 创建一个控件,它继承Control和INamingContainer接口. 创建用户控件UcB.ascx,拉一个控件容器Placeholder控件,方便在cs能动态加载上面创建的控件 UcB.ascx.cs: 在网页xxx.aspx: xxx.aspx.cs: 运行结果: