11.3 Tomcat

Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和Java Server Page(JSP)的支持。同时,它提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。由于Tomcat本身也内含了一个HTTP服务器,也可以当作一个单独的Web服务器来使用。下面介绍如何定制Tomcat镜像。

11.3 Tomcat - 图1

首先,尝试在Docker Hub上搜索已有的Tomcat相关镜像的个数:


  1. $ docker search tomcat |wc -l
  2. 285

可以看到,已经有285个相关镜像。如是个人开发或测试,可以随意选择一个镜像,按照提示启动应用即可。

下面以Tomcat 7.0为例介绍定制Tomcat镜像的步骤。

1.准备工作

创建tomcat7.0_jdk1.6文件夹,从www.oracle.com网站上下载sun_jdk 1.6压缩包,解压为jdk目录。

创建Dockerfile和run.sh文件:


  1. $ mkdir tomcat7.0_jdk1.6
  2. $ cd tomcat7.0_jdk1.6/
  3. $ touch Dockerfile run.sh

下载Tomcat,可以到官方网站下载最新的版本,也可以直接使用下面链接中给出的版本:


  1. $ wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.56/bin/apache-tomcat-
  2. 7.0.56.zip

解压后,tomcat7.0_jdk1.6目录结构应如下所示(多余的压缩包文件已经被删除):


  1. $ ls
  2. Dockerfile apache-tomcat-7.0.56 jdk run.sh

2.Dockerfile文件和其他脚本文件

Dockerfile文件内容如下:


  1. FROM sshd:Dockerfile
  2. #设置继承自用户创建的sshd镜像
  3. MAINTAINER docker_user (user@docker.com)
  4. #下面是一些创建者的基本信息
  5. #设置环境变量,所有操作都是非交互式的
  6. ENV DEBIAN_FRONTEND noninteractive
  7. #注意这里要更改系统的时区设置
  8. RUN echo "Asia/Shanghai" > /etc/timezone && \
  9. dpkg-reconfigure -f noninteractive tzdata
  10. #安装跟tomcat用户认证相关的软件
  11. RUN apt-get install -yq --no-install-recommends wget pwgen ca-certificates && \
  12. apt-get clean && \
  13. rm -rf /var/lib/apt/lists/*
  14. #设置tomcat的环境变量,若读者有其他的环境变量需要设置,也可以在这里添加。
  15. ENV CATALINA_HOME /tomcat
  16. ENV JAVA_HOME /jdk
  17. #复制tomcat和jdk文件到镜像中
  18. ADD apache-tomcat-7.0.56 /tomcat
  19. ADD jdk /jdk
  20. ADD create_tomcat_admin_user.sh /create_tomcat_admin_user.sh
  21. ADD run.sh /run.sh
  22. RUN chmod +x /*.sh
  23. RUN chmod +x /tomcat/bin/*.sh
  24. EXPOSE 8080
  25. CMD ["/run.sh"]

创建tomcat用户和密码脚本文件create_tomcat_admin_user.sh文件,内容为:


  1. #!/bin/bash
  2. if [ -f /.tomcat_admin_created ]; then
  3. echo "Tomcat 'admin' user already created"
  4. exit 0
  5. fi
  6. #generate password
  7. PASS=${TOMCAT_PASS:-$(pwgen -s 12 1)}
  8. _word=$( [ ${TOMCAT_PASS} ] && echo "preset" || echo "random" )
  9. echo "=> Creating and admin user with a ${_word} password in Tomcat"
  10. sed -i -r 's/<\/tomcat-users>//' ${CATALINA_HOME}/conf/tomcat-users.xml
  11. echo '<role rolename="manager-gui"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
  12. echo '<role rolename="manager-script"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
  13. echo '<role rolename="manager-jmx"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
  14. echo '<role rolename="admin-gui"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
  15. echo '<role rolename="admin-script"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
  16. echo "<user username=\"admin\" password=\"${PASS}\" roles=\"manager-gui,manager-
  17. script,manager-jmx,admin-gui, admin-script\"/>" >> ${CATALINA_HOME}/conf/
  18. tomcat-users.xml
  19. echo '</tomcat-users>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
  20. echo "=> Done!"
  21. touch /.tomcat_admin_created
  22. echo "========================================================================"
  23. echo "You can now configure to this Tomcat server using:"
  24. echo ""
  25. echo " admin:${PASS}"
  26. echo ""
  27. echo "========================================================================"

编写run.sh脚本文件,内容为:


  1. #!/bin/bash
  2. if [ ! -f /.tomcat_admin_created ]; then
  3. /create_tomcat_admin_user.sh
  4. fi
  5. /usr/sbin/sshd -D &
  6. exec ${CATALINA_HOME}/bin/catalina.sh run

3.创建和测试镜像

通过下面的命令创建镜像tomcat7.0:jdk1.6:


  1. $ docker build -t tomcat7.0:jdk1.6 .

启动一个tomcat容器进行测试:


  1. $ docker run -d -P tomcat7.0:jdk1.6
  2. 3cd4238cb32a713a3a1c29d93fbfc80cba150653b5eb8bd7629bee957e7378ed

通过docker logs得到tomcat的密码aBwN0CNCPckw:


  1. $ docker logs 3cd
  2. => Creating and admin user with a random password in Tomcat
  3. => Done!
  4. ========================================================================
  5. You can now configure to this Tomcat server using:
  6. admin:aBwN0CNCPckw

查看映射的端口信息:


  1. $ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED
  3. STATUS PORTS NAMES
  4. 3cd4238cb32a tomcat7.0:jdk1.6 "/run.sh" 4 seconds ago
  5. Up 3 seconds 0.0.0.0:49157->22/tcp, 0.0.0.0:49158->8080/tcp
  6. cranky_wright

在本地使用浏览器登录Tomcat管理界面,访问本地的49158端口,即http://127.0.0.1:49158,如图11-3所示。

11.3 Tomcat - 图2

图11-3 Tomcat启动页面

输入从docker logs中得到的密码,如图11-4所示。

11.3 Tomcat - 图3

图11-4 Tomcat登录

成功进入管理界面,如图11-5所示。

11.3 Tomcat - 图4

图11-5 Tomcat管理界面

11.3 Tomcat - 图5注意

在实际环境中,可以通过使用-v参数来挂载Tomcat的日志文件、程序所在目录、以及与Tomcat相关的配置。