Traditionell wurde eine Software mit dem Ziel erschaffen, auf einer physischen Maschine ausgeführt zu werden. Dabei stoßen wir schnell an Grenzen. Eine Software läuft ggf. nur auf einer bestimmten Hardware, benötigt z. B. einen bestimmten Prozessor.
Ferner läuft komplexere Software meist nicht komplett autark, sondern in ein Software-Ökosystem eingebunden: Dazu gehören Betriebssystem, Bibliotheken und Abhängigkeiten. Damit das Zusammenspiel funktioniert, müssen alle Komponenten in den richtigen Versionen vorliegen. Hinzu kommt die Konfiguration, die beschreibt, wie die einzelnen Komponenten untereinander verknüpft sind.
Möchte man mehrere Anwendungen auf einer Maschine parallel betreiben, ergeben sich schnell Versionskonflikte. Ggf. benötigt eine Anwendung eine Version einer Komponente, die mit einer anderen Anwendung nicht kompatibel ist. Im schlimmsten Fall müsste jede Anwendung auf einer eigenen physischen Maschine betrieben werden. Dabei gilt: Physische Maschinen sind teuer und lassen sich nicht einfach skalieren. Wächst also der Ressourcen-Bedarf einer Anwendung, muss diese unter Umständen auf eine neue physische Maschine migriert werden.
Ein weiteres Problem ergibt sich aus dem Umstand, dass Software in der Entwicklung in verschiedenen Umgebungen eingesetzt wird. Ein Entwickler schreibt Code auf dem lokalen System und führt diesen dort zum Testen aus. Die Anwendung durchläuft vor dem Produktiveinsatz mehrere Stufen. Dazu gehören z. B. eine Test-Umgebung zur Qualitätssicherung oder eine Staging-Umgebung für Tests durch das Produkt-Team.
Die verschiedenen Umgebungen existieren oft auf verschiedenen physischen Maschinen. Fast immer gibt es Unterschiede in den Versionen von Betriebssystem, Bibliotheken und Konfiguration. Wie diese alle in Einklang bringen? Denn unterscheiden sich die Umgebungen voneinander, sind Tests wenig aussagekräftig. Ferner muss bei Ausfall eines Systems selbiges ersetzt werden – wie dabei die Konsistenz sicherstellen? Mit physischen Maschinen ist diesen Problemen nur schwer Herr zu werden.