Docker自动部署Apache 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 <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,解压,运行启动脚本要复杂一些。

这样做带来的好处包括:

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Dockerfile制作官方Tomcat镜像及镜像使用详解

    这两天学习了Dockerfile感觉这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记. 官方Tomcat镜像 地址:https://hub.docker.com/_/tomcat/ 镜像的Full Description中,我们可以得到许多信息,这里简单介绍几个: 1.Supported tags and respective Dockerfile links 支持的标签,以及对应的Dockerfile链接.一个Dockerfile可以对应多个标签,我们将以8.5.16-jre8版本的

  • 详解在docker中制作自己的JDK+tomcat镜像

    也许你和我一样,想要自己亲手制作一个热乎乎的镜像,最好自己指定JDK版本和tomcat版本.当然,这是可以的. 根据我的水平,目前有两种办法可以制作我想要的这个镜像.来,我们先说简单点的. 方式一 首先,准备好想要的jdk和tomcat,另外,我们需要创建一个Dockerfile文件,什么,你说你不知道Dockerfile是什么也不会写Dockerfile文件?哦,那也没关系吧,你Ctrl+C就好了.下面展示一个Dockerfile文件的完整内容: FROM ubuntu:14.10 MAINT

  • Docker 搭建 Tomcat 运行环境的方法

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 1 Docker与虚拟机   2 搭建过程 2.1 准备宿主系统 准备一个 CentOS 7操作系统,具体要求如下: 必须是 64 位操作系统 建议内核在 3.8 以上 通过以下命令查看您的 CentOS 内核: # uname -r 2.2 安装Docker # yum install d

  • Docker 自动部署tomcat详解

    Docker 自动部署tomcat 1. 下载镜像 # Docker pull centos:latest  #获取最新的centos镜像 2. 启动容器 #docker run -i -t -v /home/user/software/:/home/software/ imageId /bin/bash 其实包含以下三个部分: docker run <相关参数> <镜像ID> <初始命令> 其中,相关参数包括: -i:表示以"交互模式"运行容器 -

  • 详解通过Docker搭建Mysql容器+Tomcat容器连接环境

    1.实验目的:web容器能访问部署在另外容器中的MySQL 2.步骤1:拉取mysql镜像,拉取命令如下: docker pull mysql//官网的最新mysql进行 3.步骤2:拉取tomcat镜像,拉取命令如下: docker pull tomcat --name xuguokun/jdk-tomcat 4.步骤3:创建mysql的一个容器,容器的名字是mymysql,创建命令如下: 复制代码 代码如下: docker run --name mymysql -p 3306:3306  -

  • Docker下搭建一个JAVA Tomcat运行环境的方法

    前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装.部署和升级,非常方便.因为使用了容器,所以可以很方便的把生产环境和开发环境分开,互不影响,这是 docker 最普遍的一个玩法.更多的玩法还有大规模 web 应用.数据库部署.持续部署.集群.测试环境.面向服务的云计算.虚拟桌面 VDI 等等. 主观的印象:Docker 使用 Go 语言编写,用 cgroup 实现

  • Docker多容器连接(以Tomcat+Mysql为例)

    Docker提供了多个容器直接访问的方法,最简单的方式是直接使用端口映射-p参数指定映射的端口或者-P映射所有端口,多个容器直接通过网络端口进行访问. 但网络端口映射方式并不是Docker中连接多个容器的唯一方式,更安全的方法是可以使用Docker的连接系统(--link)连接多个容器,当容器连接到一起时,接受者容器就可以看到源容器的信息. 以Tomcat + Mysql为例,建立容器之间的连接 在容器直接建立连接要使用--link选项 --link <name or id>:alias 这里

  • 详解Docker学习笔记之搭建一个JAVA Tomcat运行环境

    前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装.部署和升级,非常方便.因为使用了容器,所以可以很方便的把生产环境和开发环境分开,互不影响,这是 docker 最普遍的一个玩法.更多的玩法还有大规模 web 应用.数据库部署.持续部署.集群.测试环境.面向服务的云计算.虚拟桌面 VDI 等等. 主观的印象:Docker 使用 Go 语言编写,用 cgroup 实现

  • Docker自动部署Apache 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 Tomc

  • Ubuntu 16.04安装Apache Tomcat的方法

    Apache Tomcat是Java Servlet和Java Server Pages技术的开源软件实现. 可以使用OpenJDK tomcat运行你的Java应用. Apache Tomcat安装 从Ubuntu软件库安装Tomcat: apt-get install tomcat8 您可能还需要安装tomcat8-docs,tomcat8-examples和tomcat8-admin工具,这些工具提供了文档,测试和允许您基于Web的应用程序管理Tomcat. 您可以使用以下命令安装所有这三

  • Docker搭建部署Node项目的方法步骤

    目录 什么是Docker 客户端Docker Docker基本操作 镜像名称 拉取镜像 其他操作 Dockerfile Docker-compose 构建nginx-node-postgres项目 前段时间做了个node全栈项目,服务端技术栈是 nginx + koa + postgresql.其中在centos上搭建环境和部署都挺费周折,部署测试服务器,接着上线的时候又部署生产环境服务器.这中间就有很多既无聊又费精力,吃力不讨好的"体力活".所以就开始思考怎么自动化这部分搭建部署的工

  • Docker一键部署springcloud项目的方法

    目录 docker下载的镜像 启动mysql和nacos 修改自己的java项目 打包 上传Linux系统 启动 遇到的一些问题: 其他错误 docker下载的镜像 1.下载nacos docker pull nacos:[版本号] 2.下载mysql docker pull mysql:[版本号] 3.安装docker-compose Linux下需要通过命令下载: # 安装 curl -L https://github.com/docker/compose/releases/download

  • Docker中部署mysql服务的方法及遇到的坑

    最近一直在学习搬运工,感觉这么厉害的东西怎么以前不知道呢,把自己捣鼓的过程整理记录下来,供同学们参考 第零步:从Docker Hub拉取官方mysql镜像 docker pull mysql 然后就是进入漫长的等待,当然如果你配置了镜像加速器,速度会快那么一丢丢 第一步:使用docker images命令查看镜像 你会看到我们这里已经有了MySQL的的镜像 第二步:启动我们的mysql的镜像,创建一个MySQL的容器 使用命令:docker run -d --name mysql -p 3307

  • 基于Docker镜像部署go项目的方法步骤

    依赖知识 Go交叉编译基础 Docker基础 Dockerfile自定义镜像基础 docker-compose编排文件编写基础 当然,一点也不会也可以按照这个步骤部署完成,不过可能中间如果出点小问题,会不知道怎么解决,当然你也可以留言. 我是在mac环境上开发测试的,如果你是在windows上可能有一点出入,但应该不会有啥大问题. 一.依赖环境 Docker 二.编写一个GoLang web程序 我这里就写一个最简单的hello world程序吧,监听端口是80端口. 新建一个main.go文件

  • 详解jenkins自动部署springboot应用的方法

    最近公司在利用jenkins自动部署springboot应用,以前别人配的那个jenkins虽说可以正常部署,但是多次反复部署之后jenkins会报错,提示内存不足: Maven JVM terminated unexpectedly with exit code 137 原因是因为jenkins没有配置部署新的应用前先把旧的应用进程先kill掉而导致在服务器上有多个应用进程.因此自己决定摸索如何配置jenkins可以每次部署都把旧进程kill掉再启动新进程. 安装Jenkins 安装命令: s

  • 尝试Docker+Nginx部署单页应用方法

    开发到部署,亲力亲为 当我们开发一个单页面应用时,执行完构建后 npm run build 会生成一个 index.html 在 dist 目录,那怎么把这个 index.html 部署到服务器上呢? 目录结构 dist/:前端构建完的静态文件 docker/:镜像所需的配置文件 配置 Nginx 挑几点配置讲讲,先是 Gzip 压缩资源,以节省带宽和提高浏览器加载速度 虽然 Webpack 已经支持在构建时就生成 .gz 压缩包,但也可以通过 Nginx 来启用 gzip on; gzip_d

  • Maven项目打包成war包部署到Tomcat的方法

    有关于 Maven 项目的打包部署,我这里用的是 Eclipse 编辑器,以此来做个简单的记录. 实践环境 操作系统: Windows IDE: Eclipse 打包部署过程 1 项目打包 1.1 右键点击所需要打包的项目,点击如图所示 Maven clean,这里 Maven 会清楚掉之前对这个项目所有的打包信息. 1.2 进行完 Maven clean 操作后,在eclipse的控制台会出现以下的信息. 1.3 然后我们重新右键所需打包的项目,点击如图所示 Maven build 1.4 在

随机推荐