本文是Docker的入门文章,推荐Java开发者阅读。文章详细介绍了如何用Docker来安装部署Tomcat。
介绍
本文会讲述:
- 扩展Tomcat的官方Dockerfile
- 构建新的镜像
- 从修改过的新镜像启动容器
- 在容器里部署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 <craigtrim@gmail.com>"
用如下命令构建镜像:
$ 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 <craigtrim@gmail.com>" 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 <craigtrim@gmail.com>" ---> 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,解压,运行启动脚本要复杂一些。
这样做带来的好处包括:
- 不是所有应用都像Tomcat一样易于安装。
- 几乎所有应用在安装后都需要额外的配置。
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
相关推荐
主要介绍了Docker自动部署Apache Tomcat的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
标题 "Docker Logging with a Tomcat Container with the Native Graylog Driver" 暗示了本文将探讨如何在Docker环境中使用Tomcat容器,并利用Graylog的原生驱动来收集和管理日志。Graylog是一个开源的日志管理和...
Apache Tomcat是一款开源的Java Servlet容器,主要用于部署和运行Java Web应用程序。在这个版本中,我们关注的是`Apache-tomcat-8.0.0`,这是一个在CentOS 7操作系统环境下使用的特定构建。Tomcat 8.0.0是在Tomcat...
# tar -zxvf apache-tomcat-9.0.0.M17.tar.gz ``` 然后,我们需要添加 Tomcat 用户和创建图片存放目录: ``` # useradd tomcat # su tomcat # mkdir -p ./terminalPM-web/img ``` 接下来,我们需要配置 Tomcat 的...
- 利用Ansible、Docker Compose等工具实现自动化部署和运维。 综上所述,Apache Tomcat 8.5.69在Linux环境下提供了强大的Web应用托管能力,通过合理配置和优化,可以满足各种规模的业务需求。理解并掌握这些知识点...
总结来说,Apache Tomcat9是部署Java Web应用和服务的重要工具,包括像Geoserver这样的GIS应用。在使用过程中,要注意版本兼容性,如Tomcat 10可能不适用于Geoserver的部署。同时,结合Apache ZooKeeper和云原生技术...
该插件可以将代码部署到 Docker 等容器中,实现自动部署。 6. Maven 集成: Maven 是一个基于 Java 的项目管理工具,用于管理项目的编译、测试、打包等过程。在 Jenkins 中,我们可以使用 Maven 来编译代码,并将...
云平台和容器化:Tomcat 可以作为 Docker 容器来运行,方便在云平台上进行部署和扩展。它也支持 Kubernetes 等容器调度平台,可以轻松地与容器编排和自动化部署工具集成。微服务架构:Tomcat 可以作为微服务架构中的...
对于使用Apache Tomcat服务器的应用程序来说,跨域问题同样普遍存在。当客户端尝试访问由Tomcat服务器托管的应用程序时,如果客户端所在的域名与Tomcat服务器的域名不一致,则可能会遇到跨域问题。为了解决这类问题...
Tomcat是Apache软件基金会的Jakarta项目下的一个开源Servlet容器,实现了Java Servlet和JavaServer Pages(JSP)规范,是部署Java Web应用的常见选择。在Docker容器中集成Tomcat,意味着开发者可以直接在Eclipse内...
Docker 是一个容器化平台,允许用户在容器中运行应用程序,实现应用程序的自动化部署和管理。 本文将介绍如何使用 Jenkins、Node.js、Git 和 Docker 实现自动化编译和发布。 一. Jenkins 安装和配置 1. 安装 ...
Apache 通过集成JK模块(mod_jk)来实现与Tomcat的交互,JK模块是一个负载均衡器,可以根据预设策略将请求分发到多个Tomcat实例,实现集群化部署,从而提升系统处理能力并提供故障转移的能力。 **实现目标:** 在...
通过以上步骤,我们可以成功地在Tomcat服务器上部署Jenkins服务,为项目构建一个强大的自动化工作流平台。理解并熟练掌握Jenkins的部署和使用,对于提升开发团队的生产力和保证软件质量具有重要意义。
Docker部署Java Web系统 1.在root目录下创建一个路径test/app mkdir test && cd test&& mkdir app &&cd app 2.将apache-tomcat-7.0.29.tar.gz及jdk-7u25-linux-x64.tar.gz拷贝 到app目录下 3.解压两个tar.gz文件 ...
演示Web工件处理程序POC应用程序一个Java应用程序,它在由Google Kubernetes精心组织的Apache Tomcat Docker容器中部署指定的Web工件。 使用库进行Docker映像处理,并使用库进行Google Kubernetes编排。 此Java ...
JavaKubernetesWebAppHandler 一个Java应用程序,使用户可以选择.war文件,并使用Google Kubernetes将其部署在Apache Tomcat Docker容器中。 对于这个项目,我使用了和 GitHub存储库。 有关任何设置的详细信息,请...