Self-adaptive containers: a novel framework for building scalable QoS-aware software with low programmer overhead