Docker自動部署Apache Tomcat

jopen 9年前發布 | 361K 次閱讀 Docker

本文是Docker的入門文章,推薦Java開發者閱讀。文章詳細介紹了如何用Docker來安裝部署Tomcat。

介紹

本文會講述:

  1. 擴展Tomcat的官方Dockerfile
  2. 構建新的鏡像
  3. 從修改過的新鏡像啟動容器
  4. 在容器里部署RESTful的Web服務并測試
  5. </ol>

    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]

    官方網站描述了所支持的標簽:

     Docker自動部署Apache Tomcat

    我正在用的是版本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已經啟動:

     Docker自動部署Apache 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/</pre>
    當鏡像構建時,配置文件會被放置到正確目錄下。從這個鏡像啟動的任意容器都會包含這些文件。

    重構鏡像

    用之前的方法重新構建鏡像:

    $ 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 &nbsp; 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] ------------------------------------------------------------------------</pre>
    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

    輸出如下圖:

     Docker自動部署Apache Tomcat

    結論

    什么是至關重要的?

    我們不需要安裝Tomcat,而是需要在Dockerfile定義,然后從鏡像里啟動容器。似乎看起來比下載Tomcat,解壓,運行啟動腳本要復雜一些。

    這樣做帶來的好處包括:

    1. 不是所有應用都像Tomcat一樣易于安裝。
    2. 幾乎所有應用在安裝后都需要額外的配置。
    3. </ol>
      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
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!