A Container is a collection of physical resources on a single node, such as memory (RAM), CPU cores, and disks. There can be multiple Containers on a single Node (or a single large one). Every node in the system is considered to be composed of multiple Containers of minimum memory size (512MB or 1 GB, for example). The Application Master can request any Container as a multiple of the minimum memory size.
A Container thus represents a resource (memory, CPU) on a single node in a given cluster. A Container is supervised by the Node Manager and scheduled by the Resource Manager.
Each application starts out as an Application Master, which is itself a Container (often referred to as container -0). Once started, the Application Master must negotiate with the Resource Manager for more Containers. Container requests (and releases) can take place in a dynamic manner at run-time. For instance, a MapReduce job may request a certain amount of mapper Containers, and as they finish, release them and request that more reducer containers be started.