The world of computing has varied environments. A computing environment includes computer machinery, data storage devices, client devices, software applications, operating systems, networks supporting processing, and exchange of data and information as needed by the software application. For the sake of clarity, computing environments include personal computing, client server computing, distributed computing, cloud (grid/cluster) computing. Various platforms help address different processing and operational requirements, but their use also helps explain the complexity of working with software applications IT environments. Initially, the conventional approach was to isolate applications to the specific environment they were written for, and build connectors to other environments.
API to SOA / SOAP to microservices - An Application Programming Interface (API) is an example of a connector referred to above. APIs are a set of definitions and protocols that are defined to allow different applications to interact with each other. This solution was efficient when applications were heavy and larger in size and were written in select environments to leverage computing capabilities, operational, and security needs. As web-based technologies emerged, connector approaches evolved from legacy APIs and the use of HTTP, JSON, URL, XML, to Simple Object Access Protocol (SOAP) and the use of HTTP and XML, to Service-Oriented Architecture (SOA). As web-based technologies evolved to cloud-native applications, serverless and virtual computing emerged. With the requirement to perform across multiple environments, including on the cloud and on devices with lower processing power, applications have become specific service-oriented, and developed with fewer lines of code. This led to emergence of microservices architecture4, and the evolution to SOA. Microservices arrange an application as a collection of loosely coupled services. - an evolution to service-oriented architecture (SOA). Microservices arrange an application as a collection of loosely coupled services.
Containers help resolve a typical dilemma faced by many developers in the evolving native-cloud based application opportunity, – varying computing environments meant that an application tested using Python 2.x could face issues because the production environment ran on Python 3.x ---- or ---- the application is tested on a certain Secure Socket Layer / SSL library, while the production environment has another one installed. Additionally, variations in security settings, file storage setup and network setups could cause the application to fail.
To allow applications, like microservices, to operate across computing environments, the concept of the containers emerged. While virtual machines (VMs) were in use before containers, VMs for microservices were bulkier due to OS images in the VM. A container is a logical packaging of the application, isolating it from the environment in which it runs. This allows container-based applications to be deployed with ease, regardless of the target environment which could be a private data center, the public cloud, or even a personal computer.
Containers made an appearance over 10 years ago, built into Linux with LXC. Other versions, like Solaris Containers, FreeBSD Jails, and AIX Workload Partitions followed. However, most developers recognize Docker for introducing the modern container era.
A single container can be used to run a microservice or even a software process to a larger application. The container consists of all the necessary executables, binary code, libraries, and configuration files.
The Open Container Initiative (OCI) run by the Linux Foundation helps to develop industry standards for container formats and container runtime softwares across platforms. The first standards were based on Docker technology, and Docker was an early developer of containers.
OCI sponsors include AWS, Google, IBM, HP, Microsoft, VMware, Red Hat, Oracle, Twitter, and HP as well as Docker and CoreOS.
To allow applications like microservices to operate across computing environments, the concept of containers emerged. A container is a logical packaging of the application, isolating it from the environment in which it runs. This allows container-based applications to be deployed with ease, regardless of the target environment, which could be a private data center, the public cloud, or even a personal computer. Containers encapsulate discrete components of application logic through microservices, provisioned only with the minimal resources needed to accomplish their job.