Docker自動(dòng)部署Apache Tomcat的方法
介紹
本文會(huì)講述:
- 擴(kuò)展Tomcat的官方Dockerfile
- 構(gòu)建新的鏡像
- 從修改過(guò)的新鏡像啟動(dòng)容器
- 在容器里部署RESTful的Web服務(wù)并測(cè)試
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]
官方網(wǎng)站描述了所支持的標(biāo)簽:

我正在用的是版本7,所以選擇了tomcat:7。
我是使用Docker的新手(在寫(xiě)這邊文章的時(shí)候),因此不想稱此文是“最佳實(shí)踐”。本文所寫(xiě)的是我認(rèn)為好用的實(shí)踐,如果有不同意見(jiàn)也請(qǐng)告訴我。對(duì)于每一個(gè)想要啟動(dòng)的Docker容器,我都創(chuàng)建了自己的Dockerfile并且擴(kuò)展了鏡像。當(dāng)然也完全可以不擴(kuò)展鏡像,而直接使用它。不過(guò)基于目標(biāo)鏡像構(gòu)建我們自己的鏡像應(yīng)該是能穩(wěn)定擴(kuò)展別人工作成果的更合適的方式。
本文示例中,創(chuàng)建了一個(gè)簡(jiǎn)單的Dockerfile,如下:
FROM tomcat:7-jre7 MAINTAINER "Craig Trim <craigtrim@gmail.com>"
用如下命令構(gòu)建鏡像:
$ sudo docker build -t craig/tomcat .
這樣擴(kuò)展的一個(gè)好處是簡(jiǎn)化了環(huán)境。最終,我要為Eclipse、MySQL和其它應(yīng)用使用容器。我會(huì)給每個(gè)應(yīng)用一個(gè)簡(jiǎn)化的命名空間和鏡像名稱。做項(xiàng)目的時(shí)候,我推薦使用項(xiàng)目的代碼名稱作為容器的命名空間。我也簡(jiǎn)化了標(biāo)簽名稱。這些都是很小的注意事項(xiàng),不過(guò)又很重要。在大型項(xiàng)目中,有很多開(kāi)發(fā)人員參與,這樣的方式就會(huì)很有幫助。通用的命名空間,簡(jiǎn)化的鏡像名稱和標(biāo)簽,會(huì)幫助項(xiàng)目成員更方便得使用官方項(xiàng)目鏡像。
我的示例如下:
tomcat:7-jre7 ns/tomcat mysql:5.6.23 ns/mysql fgrehm/eclipse:v4.4.1 ns/eclipse
ns代表命名空間,每個(gè)項(xiàng)目成員都能理解。啟動(dòng)容器只需要記住項(xiàng)目代碼名(命名空間)和應(yīng)用名稱即可。
運(yùn)行Tomcat
如下命令會(huì)運(yùn)行Tomcat,并將容器的8080端口暴露到宿主機(jī)器的8080端口:
$ sudo docker run -p 8080:8080 craig/tomcat
如果還需要從這個(gè)鏡像啟動(dòng)容器,只需要:
$ sudo docker run -p 8081:8080 craig/tomcat
測(cè)試tomcat已經(jīng)啟動(dòng):

擴(kuò)展Dockerfile
我需要擴(kuò)展Dockerfile,來(lái)實(shí)現(xiàn)Maven的自動(dòng)部署。需要添加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放在同一個(gè)目錄下。
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/
當(dāng)鏡像構(gòu)建時(shí),配置文件會(huì)被放置到正確目錄下。從這個(gè)鏡像啟動(dòng)的任意容器都會(huì)包含這些文件。
重構(gòu)鏡像
用之前的方法重新構(gòu)建鏡像:
$ 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
所做的變動(dòng)是四小時(shí)之前發(fā)生的?,F(xiàn)在可以從修改過(guò)的鏡像啟動(dòng)容器,來(lái)測(cè)試自動(dòng)化部署。
部署到Tomcat
這可能應(yīng)該是另外一篇教程的主題,不過(guò)檢驗(yàn)Tomcat安裝是否成功的最佳方式就是部署一個(gè)WAR文件。我用Maven創(chuàng)建了一個(gè)簡(jiǎn)單的JavaEE項(xiàng)目,結(jié)構(gòu)如下:
$ 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
輸出如下圖:

結(jié)論
什么是至關(guān)重要的?
我們不需要安裝Tomcat,而是需要在Dockerfile定義,然后從鏡像里啟動(dòng)容器。似乎看起來(lái)比下載Tomcat,解壓,運(yùn)行啟動(dòng)腳本要復(fù)雜一些。
這樣做帶來(lái)的好處包括:
- 不是所有應(yīng)用都像Tomcat一樣易于安裝。
- 幾乎所有應(yīng)用在安裝后都需要額外的配置。
Docker的作用有點(diǎn)類似Vagrant/Puppet/Chef/Ansible等。需要寫(xiě)一個(gè)腳本定義環(huán)境,之后build工具就可以自動(dòng)搭建出環(huán)境。在這里Docker的優(yōu)勢(shì)顯而易見(jiàn),那就是比虛擬機(jī)更為輕量。大多數(shù)情況下,就為了使用Tomcat而占用整個(gè)虛擬機(jī)會(huì)造成資源的浪費(fèi)。而且很多程序員是在筆記本上工作,也很難同時(shí)啟動(dòng)多個(gè)虛擬機(jī)。
這也就是Docker的第三個(gè)好處:可以從同一個(gè)鏡像啟動(dòng)多個(gè)容器。啟動(dòng)多個(gè)容器所占用的資源比啟動(dòng)多個(gè)虛擬機(jī)要少得多,啟動(dòng)時(shí)間也非常快。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Docker部署MySQL并實(shí)現(xiàn)客戶端連接
這篇文章介紹了Docker部署MySQL并實(shí)現(xiàn)客戶端連接的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01
使用Grafana 展示Docker容器的監(jiān)控圖表并設(shè)置郵件報(bào)警規(guī)則(圖解)
這篇文章主要介紹了使用Grafana 展示Docker容器的監(jiān)控圖表并設(shè)置郵件報(bào)警規(guī)則的圖文教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-01-01
局域網(wǎng)內(nèi)部署 Docker Registry(推薦)
本文將從創(chuàng)建單機(jī)的 Docker Registry 開(kāi)始,逐步完成局域網(wǎng)內(nèi)可用的 Docker Registry 的創(chuàng)建,并重點(diǎn)解釋如何使用 IP 地址訪問(wèn) Registry 的方法2017-05-05
Docker Compose 輕松管理多容器應(yīng)用小結(jié)
Docker Compose 是管理多容器應(yīng)用的利器,通過(guò)一個(gè)簡(jiǎn)單的 YAML 文件,開(kāi)發(fā)者可以輕松定義服務(wù)、網(wǎng)絡(luò)和數(shù)據(jù)卷的配置,這篇文章主要介紹了Docker Compose :輕松管理多容器應(yīng)用,需要的朋友可以參考下2024-12-12
Docker容器沒(méi)有權(quán)限寫(xiě)入宿主機(jī)目錄的解決方案
這篇文章主要介紹了Docker容器沒(méi)有權(quán)限寫(xiě)入宿主機(jī)目錄的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
dockerfile中ENTRYPOINT與CMD的結(jié)合使用及區(qū)別
這篇文章主要介紹了dockerfile中ENTRYPOINT與CMD的結(jié)合使用,大家都知道CMD 與 ENTRYPOINT都是用于指定啟動(dòng)容器執(zhí)行的命令,那么他們倆有什么區(qū)別呢,本文給大家詳細(xì)介紹,需要的朋友可以參考下2021-08-08
Docker部署RabbitMQ的實(shí)現(xiàn)方法(圖文并茂)
本文詳細(xì)介紹了如何使用Docker部署RabbitMQ的步驟,包括拉取RabbitMQ鏡像,創(chuàng)建與授權(quán)文件夾,創(chuàng)建RabbitMQ容器,查看啟動(dòng)日志,訪問(wèn)控制臺(tái)和登錄等,全程詳細(xì)的參數(shù)解釋和操作步驟,讓Docker部署RabbitMQ變得簡(jiǎn)單易行2024-10-10
PVE下擴(kuò)展openwrt?for?x86分區(qū)大小方式
本文介紹了在PVE環(huán)境下如何對(duì)OpenWRT虛擬機(jī)的分區(qū)進(jìn)行擴(kuò)容,包括磁盤(pán)調(diào)整、軟件安裝、分區(qū)配置和系統(tǒng)引導(dǎo)等步驟,操作前需做好備份,以防數(shù)據(jù)丟失2024-10-10
Docker Elasticsearch集群部署的操作過(guò)程
這篇文章主要介紹了Docker Elasticsearch集群部署的操作過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03

