Docker自动部署Apache Tomcat

标签: docker apache tomcat | 发表时间:2016-04-29 17:32 | 作者:shiguanghui
出处:http://www.iteye.com

本文是Docker的入门文章,推荐Java开发者阅读。文章详细介绍了如何用Docker来安装部署Tomcat。 

介绍

本文会讲述: 

  1. 扩展Tomcat的官方Dockerfile
  2. 构建新的镜像
  3. 从修改过的新镜像启动容器
  4. 在容器里部署RESTful的Web服务并测试

 

Apache Tomcat

使用docker search可以查到最流行的(和官方的)Docker Tomcat容器: 

$ sudo docker search tomcat
[sudo] password for craig: 
NAME                                  DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
tomcat                                Apache Tomcat is an open source implementa...   103       [OK]       
tutum/tomcat                          Tomcat image - listens in port 8080. For t...   38                   [OK]
consol/tomcat-7.0                     Tomcat 7.0.57, 8080, "admin/admin"              12                   [OK]
consol/tomcat-8.0                     Tomcat 8.0.15, 8080, "admin/admin"              9                    [OK]
consol/tomcat-6.0                     Tomcat 6.0.43, 8080, "admin/admin"              6                    [OK]
consol/tomcat-4.1                     Tomcat 4.1.40, 8080, "admin/admin"              4                    [OK]
consol/tomcat-5.0                     Tomcat 5.0.30,  8080, "admin/admin"             4                    [OK]
consol/tomcat-5.5                     Tomcat 5.5.36, 8080, "admin/admin"              4                    [OK]
consol/tomcat-3.3                     Tomcat 3.3.2, 8080, "admin/admin"               4                    [OK]
readytalk/tomcat-native               Debian backed Tomcat + Tomcat Native Library    3                    [OK]
malderhout/tomcat                     Tomcat7 with OpenJDK7 on CentOS7                3                    [OK]
dordoka/tomcat                        Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 ba...   3                    [OK]
meirwa/spring-boot-tomcat-mysql-app   a sample spring-boot app using tomcat and ...   2                    [OK]
h2000/docker-tomcat-youtrack          Dockerfile for youtrack to run under tomcat.    1                    [OK]
nicescale/tomcat                      Tomcat service for NiceScale. http://nices...   1                    [OK]
dmean/liferay-tomcat                  Debian + Liferay CE Tomcat                      1                    [OK]
atomi/tomcat                                                                          0                    [OK]
mminke/apache-tomcat                  A Docker image which contains the Apache T...   0                    [OK]
ericogr/tomcat                        Tomcat 8.0.21, 8080, "docker/docker"            0                    [OK]
holmes/tomcat                                                                         0                    [OK]
paulkling/tomcat                                                                      0                    [OK]
dynamind/tomcat                                                                       0                    [OK]
fabric8/tomcat-8.0                    runs Apache Tomcat 8.0 with jolokia enable...   0                    [OK]
learninglayers/tomcat                                                                 0                    [OK]
dmglab/tomcat                         CentOS 7 based tomcat installation              0                    [OK]


官方网站描述了所支持的标签: 


我正在用的是版本7,所以选择了tomcat:7。 
我是使用Docker的新手(在写这边文章的时候),因此不想称此文是“最佳实践”。本文所写的是我认为好用的实践,如果有不同意见也请告诉我。对于每一 个想要启动的Docker容器,我都创建了自己的Dockerfile并且扩展了镜像。当然也完全可以不扩展镜像,而直接使用它。不过基于目标镜像构建我 们自己的镜像应该是能稳定扩展别人工作成果的更合适的方式。 
本文示例中,创建了一个简单的Dockerfile,如下: 

FROM tomcat:7-jre7
MAINTAINER "Craig Trim <[email protected]>"


用如下命令构建镜像: 

$ sudo docker build -t craig/tomcat .


这样扩展的一个好处是简化了环境。最终,我要为Eclipse、MySQL和其它应用使用容器。我会给每个应用一个简化的命名空间和镜像名称。做项目的时 候,我推荐使用项目的代码名称作为容器的命名空间。我也简化了标签名称。这些都是很小的注意事项,不过又很重要。在大型项目中,有很多开发人员参与,这样 的方式就会很有帮助。通用的命名空间,简化的镜像名称和标签,会帮助项目成员更方便得使用官方项目镜像。 

我的示例如下: 

tomcat:7-jre7   ns/tomcat
mysql:5.6.23    ns/mysql
fgrehm/eclipse:v4.4.1   ns/eclipse


ns代表命名空间,每个项目成员都能理解。启动容器只需要记住项目代码名(命名空间)和应用名称即可。 

运行Tomcat

如下命令会运行Tomcat,并将容器的8080端口暴露到宿主机器的8080端口: 

$ sudo docker run -p 8080:8080 craig/tomcat


如果还需要从这个镜像启动容器,只需要: 

$ sudo docker run -p 8081:8080 craig/tomcat


测试tomcat已经启动: 

 

扩展Dockerfile

我需要扩展Dockerfile,来实现Maven的自动部署。需要添加settings.xml,更新tomcat-user.xml文件。如下所示: 
tomcat-users.xml: 

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="craig" password="password" roles="manager,manager-gui,manager-script" />
</tomcat-users>


settings.xml: 

<?xml version="1.0" encoding="UTF-8"?>
<settings>
<servers> 
<server>
<id>TomcatServer</id>
<username>craig</username>
<password>password</password>
</server> 
</servers>


这些文件和Dockerfile放在同一个目录下。 
Dockerfile更新为: 

FROM tomcat:7-jre7

MAINTAINER "Craig Trim <[email protected]>"

ADD settings.xml /usr/local/tomcat/conf/
ADD tomcat-users.xml /usr/local/tomcat/conf/


当镜像构建时,配置文件会被放置到正确目录下。从这个镜像启动的任意容器都会包含这些文件。 

重构镜像

用之前的方法重新构建镜像: 

$ sudo docker build -t craig/tomcat .
Sending build context to Docker daemon 5.632 kB
Sending build context to Docker daemon 
Step 0 : FROM tomcat:7-jre7
---> 77eb038c09d1
Step 1 : MAINTAINER "Craig Trim <[email protected]>"
---> Using cache
---> cadc51a3054c
Step 2 : ADD settings.xml /usr/local/tomcat/conf/
---> Using cache
---> 5009ba884f1f
Step 3 : ADD tomcat-users.xml /usr/local/tomcat/conf/
---> Using cache
---> 33917c541bb5
Successfully built 33917c541bb5


可以查看镜像历史: 

$ sudo docker history craig/tomcat
IMAGE               CREATED             CREATED BY                                      SIZE
33917c541bb5        4 hours ago         /bin/sh -c #(nop) ADD file:c1d08c42d5808537b4   1.761 kB
5009ba884f1f        4 hours ago         /bin/sh -c #(nop) ADD file:5dd8f0f6d0cd64de3c   212 B
cadc51a3054c        4 hours ago         /bin/sh -c #(nop) MAINTAINER "Craig Trim <cra   0 B
77eb038c09d1        3 weeks ago         /bin/sh -c #(nop) CMD [catalina.sh run]         0 B
a96609fc8364        3 weeks ago         /bin/sh -c #(nop) EXPOSE map[8080/tcp:{}]       0 B
ca99125fbf51        3 weeks ago         /bin/sh -c curl -SL "$TOMCAT_TGZ_URL" -o tomc   13.63 MB
e7ca14a4280a        3 weeks ago         /bin/sh -c #(nop) ENV TOMCAT_TGZ_URL=https://   0 B
eac866e259d8        3 weeks ago         /bin/sh -c #(nop) ENV TOMCAT_VERSION=7.0.59     0 B
d391d657b53a        3 weeks ago         /bin/sh -c #(nop) ENV TOMCAT_MAJOR=7            0 B
7b323fd1e0d3        3 weeks ago         /bin/sh -c gpg --keyserver pool.sks-keyserver   113.9 kB
4412b8a11fb6        3 weeks ago         /bin/sh -c #(nop) WORKDIR /usr/local/tomcat     0 B
b4ec9d590927        3 weeks ago         /bin/sh -c mkdir -p "$CATALINA_HOME"            0 B
681b802059fe        3 weeks ago         /bin/sh -c #(nop) ENV PATH=/usr/local/tomcat/   0 B
11b245da4142        3 weeks ago         /bin/sh -c #(nop) ENV CATALINA_HOME=/usr/loca   0 B
44faa7b2809f        3 weeks ago         /bin/sh -c apt-get update && apt-get install    164.5 MB
42c3653e1b26        3 weeks ago         /bin/sh -c #(nop) ENV JAVA_DEBIAN_VERSION=7u7   0 B
45ff981e92b4        3 weeks ago         /bin/sh -c #(nop) ENV JAVA_VERSION=7u75         0 B
5e9b188bc82c        3 weeks ago         /bin/sh -c apt-get update && apt-get install    676 kB
1073b544a1cb        3 weeks ago         /bin/sh -c apt-get update && apt-get install    44.34 MB
50ec2d202fe8        3 weeks ago         /bin/sh -c #(nop) CMD [/bin/bash]               0 B
3b3a4796eef1        3 weeks ago         /bin/sh -c #(nop) ADD file:fb7c52fc8e65391715   122.8 MB
511136ea3c5a        21 months ago                                                       0 B


所做的变动是四小时之前发生的。现在可以从修改过的镜像启动容器,来测试自动化部署。 

部署到Tomcat

这可能应该是另外一篇教程的主题,不过检验Tomcat安装是否成功的最佳方式就是部署一个WAR文件。我用Maven创建了一个简单的JavaEE项目,结构如下: 

$ tree
.
+-- pom.xml
+-- src
¦   +-- main
¦   ¦   +-- java
¦   ¦       +-- com
¦   ¦           +-- trimc
¦   ¦               +-- blogger


如下插件(在pom.xml文件里)指定了部署信息,包括暴露的端口和用户名密码: 

<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://localhost:8080/manager/text</url>
<server>TomcatServer</server>
<path>/sample</path>
<username>craig</username>
<password>password</password>
</configuration>
</plugin>


使用Maven将其部署到Tomcat: 

$ mvn tomcat7:deploy
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Test Runtime 1.0.0
[INFO] ------------------------------------------------------------------------
[INFO] 

*** SNIP ***

[INFO] --- tomcat7-maven-plugin:2.2:deploy (default-cli) @ sandbox-web2 ---
[INFO] Deploying war to http://localhost:8080/test  
Uploading: http://localhost:8080/manager/text/deploy?path=%2Ftest
Uploaded: http://localhost:8080/manager/text/deploy?path=%2Ftest (1352 KB at 18512.6 KB/sec)

[INFO] tomcatManager status code:200, ReasonPhrase:OK
[INFO] OK - Deployed application at context path /test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.495 s
[INFO] Finished at: 2015-03-31T19:08:12-07:00
[INFO] Final Memory: 15M/506M
[INFO] ------------------------------------------------------------------------


Tomcat日志显示如下: 

Apr 01, 2015 2:08:12 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.9 09/02/2011 11:17 AM' 
Apr 01, 2015 2:08:12 AM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deployment of web application archive /usr/local/tomcat/webapps/test.war has finished in 826 ms


输出如下图: 

 

结论

什么是至关重要的? 

我们不需要安装Tomcat,而是需要在Dockerfile定义,然后从镜像里启动容器。似乎看起来比下载Tomcat,解压,运行启动脚本要复杂一些。 

这样做带来的好处包括: 

  1. 不是所有应用都像Tomcat一样易于安装。
  2. 几乎所有应用在安装后都需要额外的配置。


Docker的作用有点类似Vagrant/Puppet/Chef/Ansible等。需要写一个脚本定义环境,之后build工具就可以自动 搭建出环境。在这里Docker的优势显而易见,那就是比虚拟机更为轻量。大多数情况下,就为了使用Tomcat而占用整个虚拟机会造成资源的浪费。而且 很多程序员是在笔记本上工作,也很难同时启动多个虚拟机。 

这也就是Docker的第三个好处:可以从同一个镜像启动多个容器。启动多个容器所占用的资源比启动多个虚拟机要少得多,启动时间也非常快。 

参考资料

1.  REST Webapp示例 
2. WAR文件  在这里 
3.  Apache Tomcat Dockerfile 
4.  Maven:构建自动化工具 
5.  JAX-RS介绍(RESTFul Web服务的Java API) 

原文链接: Docker and Apache Tomcat(翻译:崔婧雯 校对:李颖杰) 

来自:http://dockerone.com/article/285



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [docker apache tomcat] 推荐:

Docker自动部署Apache Tomcat

- - 开源软件 - ITeye博客
本文是Docker的入门文章,推荐Java开发者阅读. 文章详细介绍了如何用Docker来安装部署Tomcat. 扩展Tomcat的官方Dockerfile. 在容器里部署RESTful的Web服务并测试. 使用docker search可以查到最流行的(和官方的)Docker Tomcat容器: .

docker初体验之docker-tomcat

- - BlogJava-首页技术区
docker已经是现在最热的容器技术,最近也去体验了一下,在daocloud注册了一个账号,并开始本机实战docker. daocloud免费有两个容器可用,体验送T恤,邀请送书,这里我分享一个daocloud的邀请码 https://account.daocloud.io/signup?invite_code=mxeq2jkmcur37vz6ven8,daocloud是非常棒的容器云平台,使用体验好,问题响应也及时,绑定微信还送一个额外容器.

Apache整合Tomcat、集群

- - ITeye博客
Apache 整合 Tomcat 、集群. 1.1     使用mod_proxy整合. 1.2     使用mod_jk整合. 1.3.1    Tomcat集群配置. 1.3.2    mod_proxy进行负载均衡. 1.3.3    mod_jk进行负载均衡.        Apache整合Tomcat主要有两种方式,通过mod_proxy整合和通过mod_jk整合.

apache与tomcat负载集群的3种方法

- dongsheng - BlogJava-首页技术区
花了两天时间学习apache与tomcat的集成方法,现在把学习成果记录下来. apache与tomcat负载集群集成方法有3种jk、jk_proxy、http_proxy. 本次测试是1个apache集成两个tomcat. 安装apache http server省略,访问地址为http://127.0.0.1:8081.

Apache Tomcat 6.0.35前有拒绝服务,信息泄露等漏洞

- - C1G军火库
Apache Tomcat 6.0.35前有信息泄露相关的一个漏洞(CVE-2011-3375),. 以及另一个在此前广受关注的哈希碰撞引发拒绝服务(DoS)漏洞(CVE-2012-0022),. Apache 建议用户对 Tomcat 进行升级从而规避此漏洞. 一.安装Oracle JRockit.

Apache与Tomcat的3种连接方式分析

- - 服务器运维与网站架构|Linux运维|互联网研究
首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接. 事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序,你也可以将该端口改为 80. 既然 Tomcat 本身已经可以提供这样的服务,我们为什么还要引入 Apache 或者其他的一些专门的 HTTP 服务器呢.

Apache+Tomcat+Memcached共享Session的构架设计

- - CSDN博客架构设计推荐文章
一、       方案目标. 实现互动留言系统、后台发布系统的高可用性,有效解决高并发量对单台应用服务器的冲击,确保应用服务器单点故障不影响系统正常运行. 二、       部署架构. 采取Tomcat集群的部署方式,Apache通过proxy_module代理方式对用户的请求进行负载均衡,转发至tomcat集群中的某一实例进行处理,tomcat集群之间通过Memcached高性能缓存集群共享持久Session.

Apache Tomcat DIGEST身份验证多个安全漏洞(CVE-2012-3439)

- - C1G军火库
发布时间: 2012-11-05 (GMT+0800). Apache Tomcat是一个流行的开放源码的JSP应用服务器程序. Apache Tomcat 7.0.0-7.0.27、6.0.0-6.0.35、5.5.0-5.5.35存在多个安全漏洞,成功利用后可允许攻击者绕过安全限制并执行非法操作.

使用 Redis 来存储 Apache Tomcat 7 的 Session

- - 编程语言 - ITeye博客
使用  Redis 服务器来存储Session非常有优势. 首先它是一个NOSQL数据,第二它很容易扩展使用. This kind of setup would lead to a clear understanding of how  Redis can behave as cache as well as a session storing system.

apache与tomcat负载集群的3种方法 (转载)

- - 研发管理 - ITeye博客
集群tomcat主要是解决SESSION共享的问题. 花了两天时间学习apache与tomcat的集成方法,现在把学习成果记录下来. apache与tomcat负载集群集成方法有3种jk、jk_proxy、http_proxy. 本次测试是1个apache集成两个tomcat. 安装apache http server省略,访问地址为http://127.0.0.1:8081.