Public | Automated Build

Last pushed: 2 years ago
Short Description
Short description is empty for this repo.
Full Description

Apache Tomcat 8 optimized images

This repository contains Dockerfile of Apache Tomcat 8.

It use a Docker's personal build published to the public Docker Registry.

Design

This docker apache tomcat images supports production and development. A lot of other tomcat docker images exist, but the only support development or not use the newest version or bundle an open jdk. We want build a nicer one. Send us your missing features!

Goals

  • use minimal ubuntu and java8 base images (work in progress)
  • inject libs and wars as volumes (data container)
  • deploy the manager app and generate password at start
  • clean up installation and remove examples and unused *.bat, .. files.
  • squash footprint and clean up build artefacts
  • use a nicer access log pattern :-)
  • use a cleanup server.xml without comments
    • use separate executor
    • setup HTTP (8080) and AJP (8009) connectors and expose ports
    • currently not support APR Connectors or configure other then standard NIO
  • reuse existing cool ideas from other nice guys. Many thanks;)

You can deploy your own webapps and tomcat extended library with local volumens or better with a docker data container.

Found the tomcat docker images

Currently the apache tomcat8 images are available as automatic docker hub build and a squash version.

Dependencies

Installation

  1. Install Docker.
  2. Download rossbachp/java8: docker pull rossbachp/java8
  3. Download rossbachp/tomcat8: docker pull rossbachp/tomcat8 or rossbachp/apache-tomcat8: docker pull rossbachp/apache-tomcat8 or

Usage

docker run -it --rm -P rossbachp/apache-tomcat8
docker run -it --rm -P rossbachp/tomcat8

Run tomcat8 with a sample hello world

mkdir -p hello
cd hello
echo "Hello Docker Tomcat World" >index.jsp
jar -cf ../hello.war .
cd ..
docker run --name=tomcat8 -d -p 8080:8080 -v `pwd`:/webapps rossbachp/tomcat8
curl http://127.0.0.1:8080/hello/index.html

Run tomcat8 with a sample hello world at a data container

mkdir -p hello
cd hello
echo "Hello Docker Tomcat World" >index.jsp
jar -cf ../hello.war .
cd ..
vi Dockerfile

Dockerfile

FROM busybox
MAINTAINER Peter Rossbach <peter.rossbach@bee42.com>

RUN mkdir /webapps
ADD hello.war /webapps/hello.war

VOLUME ["/webapps"]

CMD /bin/sh

Running

docker build -t="rossbachp/hello-app".
docker run -it --name=hello-app rossbach/hello-app ls /webapps
docker run --name=tomcat8 -d -p 8080:8080 --volumes-from hello-app rossbachp/tomcat8
curl http://127.0.0.1:8080/hello/index.html

deploy with your system parameters

docker run -it --rm --env CATALINA_OPTS="-Ddb.user=admin -Ddb.password=secret" -v `pwd`/webapps:/webapps -v `pwd`/libs:/libs rossbachp/tomcat8

use your own JVM_ROUTE

docker run -it --rm --env TOMCAT_JVM_ROUTE=tomcat79 -p 7980:8080 -p 7909:8009 -v `pwd`/webapps:/webapps rossbachp/tomcat8

stop tomcat

docker stop --time=10 tomcat8
  • This send SIGTERM and after 10 seconds sends SIGKILL, if tomcat process is not stopped before.

tomcat docker images ENV parameter

Parameter Default Comment
JAVA_MAXMEMORY 256 setup jvm max memory
TOMCAT_MAXTHREADS 250 setup max executor threads
TOMCAT_MINSPARETHREADS 4 setup min spare executor threads
TOMCAT_HTTPTIMEOUT 20000 setup http connector timeout
TOMCAT_JVM_ROUTE tomcat80 support session sticky ness suffix
TOMCAT_JVM_ROUTE tomcat80 support session sticky ness suffix
TOMCAT_PASS random generated admin password
CATALINA_OPTS s. tomcat.sh tomcat start parameter
JAVA_OPTS s. tomcat.sh spezial java start/stop parameter

get tomcat container IP and ports

$ DOCKER_HOST_IP=$(docker inspect -f '{{.NetworkSettings.IPAddress}}'
$ docker inspect -f '{{ range $key, $value := .NetworkSettings.Ports }}{{ $key }}='"${DOCKER_HOST_IP}:"'{{ (index $value 0).HostPort }} {{ end }}‘ tomcat8 | tr " " "\n"
8080/tcp=172.17.0.30:8080
8009/tcp=172.17.0.30:8009

Run list all deployed apps

$ DOCKER_HOST_IP=$(docker inspect -f '{{.NetworkSettings.IPAddress}}' tomcat8)
$ curl --user "admin:password" http://${DOCKER_HOST_IP}:8080/manager/text/list
OK - Listed applications for virtual host localhost
/manager:running:0:manager

The admin password can be extract from logs:

$ docker logs tomcat8 | head
=> Creating and admin user with a random password in Tomcat
=> Done!
========================================================================
You can now configure to this Tomcat server using:

    admin:H4t4bbyZxjNh

========================================================================
Checking *.war in /webapps
Checking tomcat extended libs *.jar in /libs

or set at your password at container starts:

docker run -d --name=tomcat8 --env TOMCAT_PASS=password rossbachp/tomcat8

debug tomcat with nsenter

Install nsenter:

sudo docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter

Tail tomcat app or access logs

sudo docker-enter tomcat8 tail -f /opt/tomcat/logs/catalina-2014-08-27.log
sudo docker-enter tomcat8 tail -f /opt/tomcat/logs/access-2014-08-27.log

or

sudo docker logs tail tomcat8

Run jstat

sudo docker-enter tomcat8 su tomcat --shell /bin/bash -c 'jstat -gc 1 5000'

More space for research:

  • run jonsole?
    • add jmx port and expose
    • secure
  • load jolokia and monitor via http

manually build, squash and push

sudo bash
cd /tmp
docker build -t="rossbachp/tomcat8" .
ID=$(docker inspect -f '{{ .Id }}' rossbachp/tomcat8)
docker save $ID > tomcat8.tar
sudo docker-squash -verbose -i tomcat8.tar -o tomcat8-squash.tar -t rossbachp/tomcat8:squash
cat tomcat8-squash.tar | docker load
rm tomcat8.tar
rm tomcat8-squash.tar

or simple use the `./build.sh or with cleanup ./build.sh --rmi

Push to docker hub registry

docker login
docker push rossbachp/tomcat8:latest
docker push rossbachp/tomcat8:<DATE TAG>

Links

Option for better logging

  • Use a volume for logging sudo docker run --rm -t -v /var/log/tomcat8:/opt/tomcat/logs rossbachp/tomcat8 and delegate it to logstash-forwarder or rsyslog.
  • Use only stdout/stderr or file output handler
  • Don't let make file rotation, compression and archive control from outside

The current configured logging need a better solutions!

At your application you can use beter directly use syslog but how we configure syslog host?:

<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
        <syslogHost>localhost</syslogHost>
        <facility>LOCAL6</facility>
        <suffixPattern>app: %logger{20} %msg</suffixPattern>
</appender>
  • Use DNS link name at /etc/hosts with new writable docker >= 1.2 feature

Other nice tomcat docker images

Todo

  • setup better logging
  • setup JMX and monitoring
  • support APR Connector
  • support SSL
  • setup your own server.xml
  • integrate a check api
  • more samples
    • JDBC sample with fig setup
    • auto scaling apache/mod_jk ectd sample

##
Have fun with this tomcat images and give feedback!

Peter

Docker Pull Command
Owner
rossbachp
Source Repository

Comments (1)
ramrainb
2 years ago

Very useful. Thank you. However there are some mistakes.

Shouldn't that be index.jsp rather than index.html?
In the docker run command (second line Dockerfile example) shouldn't that be rossbachp?