1. A method performed by a system of one or more computers, the method comprising: establishing a plurality of tenant containers for a plurality of tenants, each tenant container being a logical separation of data and functionality for a multi-tenant application, each tenant container being isolated from the other tenant containers; receiving a request from a client device; determining that the request is associated with one of the tenant containers; and directing the request to the tenant container associated with the request, including executing the multi-tenant application using the tenant container and the request.