Interference between co-located VMs may lead to performance fluctuations and degradation, especially in overbooked datacenters. To limit this problem, VMs access to physical resources needs to be controlled to ensure certain degree of isolation among them. However, the mapping between virtual and physical resources must be performed in a dynamic way so that it can be adapted to the changing applications requirements, as well as to the different set of co-located VMs. To address this problem we propose a twofold approach: (1) a Quality of Service (QoS) scheme that provides different isolation levels for VMs with different QoS requirements, and (2) a self-adaptive fuzzy Q-learning capacity controller that proactively readjusts the isolation degree based on applications performance. Our evaluation based on real cloud applications and workloads demonstrates that the efficient, adaptive mapping between VMs and physical resources reduces the interference between VMs, enabling the possibility of co-locating more VMs, increases overall utilization, and ensures the performance of critical applications while providing more resources to the low QoS applications.