VMs each have their own kernel, but containers share the host kernel. This tends to be more efficient and doesn't require you to statically allocate vCPUs and vRAM upfront when you create a container.
LXC also has an under-appreciated mode where you can run some processes (but not a full OS) in a container.