Search code examples
pythontomcatdockerapplication-server

how many docker containers should a java web app w/ database have?


I'm trying to "dockerize" my java web application and finally run the docker image on EC2.

My application is a WAR file and connects to a database. There is also a python script which the application calls via REST. The python side uses the tornado webserver

Question 1:

Should I have the following Docker containers?

  1. Container for Application Server (Tomcat 7)
  2. Container for HTTP Server (nginx of httpd)
  3. Container for postgres db
  4. Container for python script (this will have tornado web server and my python script).

Question 2:

What is the best way to build dockerfile? I will have to do trial and error for what commands need to be put into the dockerfile for each container. Should I have an ubuntu VM on which I do trial and error and once I nail down which commands I need then put them into the dockerfile for that container?


Solution

  • That list looks about right.

    The advantage of splitting up your stack to separate containers is that you can (in many cases) use off-the-shelf official images, and only have to provide the right configuration to make them work together. In addition, you'd be able to upgrade the components (containers) separately.

    Note that combining multiple services in a single container is not forbidden, but in Docker it's overall best practice to separate concerns, and have a single container only be responsible for a single task/service.

    To get all containers started with the right configuration, docker-compose is a good choice; it enables you to create a single file (docker-compose.ymlhttps://docs.docker.com/compose/compose-file/) that describes your project; which images to build for each container, how the containers relate to each-other, and pass configurations to them.

    With docker-compose you can then start all containers by simply running docker-compose up -d