There is a great deal of excitement over containers and cloud these days. Everywhere you look there are books, webinars, videos, and companies promising to guide you to the promised land. The question remains, however, on why you would even want to make this leap. Change is hard, and there are always challenges when trying to move your applications to new infrastructure. Is this all really worth it?
As a tech geek, my answers to these questions are generally technical. I could explain how containers can help isolate your applications, scale them better, and make them more portable. The problem with these answers is that they don't really stand out among the other options of infrastructure hosting. Lots of technologies can address these different issues, so it doesn't really explain why containers or cloud would do it better.
Thanks to a recent session I attended hosted by Microsoft, Avanade, Met Life and Docker, I now have some better answers. I'm not someone who regularly has to deal with portfolios and budgets, so the question of cost isn't as much on my mind as much as all those technical reasons. Those folks who make the important decisions, however, think about costs a lot. If something doesn't help the bottom line, it almost doesn't matter that it would make other things easier. If things get easier, there should be some return on the bottom line as well, otherwise there is really no point in investing in that change.
Deciding how to host your application also involves a number of different success criteria. There are at least six different criteria that most applications have:
Operations: First and foremost, someone needs to run and manage your application. It is easy to develop an application, but then you hand it off to someone else and they have to manage it, and they need to be able to do it efficiently.
Infrastructure: You need to have reliable infrastructure to run your application on. The reliability of your application can be the difference between whether a customer selects you or goes to someone else for their needs.
Finance: You need to turn a profit on your application; that's why you are in business in the first place.
Security: Your application needs to be secure. Applications often handle sensitive data that can be abused if it gets into the wrong hands.
Governance: Applications are often subject to a number of policies and laws that regulate what your application can do. You need to be able to be flexible so that your application can adjust when those policies or laws change.
Quality: Your application needs to maintain a high quality of service. You should be able to identify and address issues as soon as possible to minimize customer impact.
Addressing all of these criteria is not an easy problem. It's such a hard problem that a lot of companies will spend almost 80% of their IT budget just trying to maintain their applications, and they will only spend 20% to innovate and improve how they deliver.
The average company will have as many as 8 different infrastructure environments which often creates silos and adds complexity to operations. Companies end up with rigid architectures that are difficult to change. Deployments are long and complicated. Downtime and reliability become challenging. Processes are slow and outdated.
So how do containers and cloud help with these issues? There are several factors that make these technologies key enablers:
Portability: When you build your applications in containers, you enable them to be more portable. You are no longer tied to specific versions of operating systems or libraries. All the dependencies for the processes running inside the container are included, and you can just take the image and run it anywhere that containers can run.
Agility: Deploying applications in containers is remarkably faster. Because the image contains everything you need to run the application, you aren't spending time setting up the environment before you start the application up. There may still be some configuration work required, but it is much easier with containers.
Security: Security is a fundamental aspect of containers. Processes running in containers are isolated from each other and other resources on the host. The processes only see what you want them to see.
Reduced Cost of Operation: Unlike traditional virtual machine hosting, containers don't require additional operating system layers to run, and you can often run many containers with the same amount of resources as a single virtual machine would require.
Less Environmental Drift: Images are intended to be immutable. The application you run in your dev environment is the same one that you run in production. Configurations can be externalized and you simply promote the images to production when they are ready. Any issues that appear in production are easier to address because developers are running the exact same image.
Flexibility: If you break your application into several containers (one for your application server, one for your database, etc), you make it easier to upgrade and adapt your application with minimal downtime. Orchestration frameworks like Kubernetes or Swarm make it trivial to swap out older containers with new ones and keep your application up.
Consistency: The best thing about containers is that the platform running them doesn't have to care about what is actually running in them. You can easily have JBoss applications running next to Python applications or NodeJS. All your different infrastructure models can be reduced down to simple groupings of containers running on one platform.
This is the power of containers and the cloud, and why it has become the wave of the future. The details of how they work is still technical, but the benefits are understandable by almost anyone.