2015 seems to be a good time to pooh-pooh Java Containers because Docker has obviously solved all the developer’s and ops’ problems. While bringing containers to the masses is a good thing ™, in server-side Java land you should still understand the distinction between “container” and “app server”.
The Java container provides services that adhere to an API, typically Java EE (with servlets being the most used API of all). The application server product, on the other hand, is the part that implements everything the API or the spec doesn’t require: management, monitoring, and of course clustering. This is where clearly, with the advent of Docker containers and the move to microservices, you should think seriously about the value this brings to your deployments, or rather the constraints it imposes.
But as far as the Java container is concerned, I’d say that it’s something that is still pretty much relevant. You may chose not to use all of the services the container has to offer (think JSF, EJB, JMS, …) but you might as well use the component models and separation of concerns it brings to the table.
This short piece was triggered by my morning read of James Ward’s excellent Comparing Application Deployment: 2005 vs. 2015. More on that in another post.