At the heart of the modern cloud is a tension between two different philosophies: IaaS, where you build a virtual infrastructure on a fabric of host systems managed by a cloud provider, and PaaS, where you write code for runtimes managed by your provider, targeting their service APIs. Both approaches give you a layer of abstraction from physical infrastructure and host operations, allowing you to focus on your applications.
Containers provide a middle ground between these two methods, letting you rely on platforms managed by cloud operators while allowing you to write more complex code and to package required applications and other dependencies. You don’t have to manage OS-level security or updates and you’re not limited to the languages and APIs supported by platform runtimes. It’s an effective compromise, with technologies such as Kubernetes providing the necessary container-level systems management tools.