Running an Ubuntu user land on top of some generic other Linux kernel will for almost all practical purposes feel the same as running real Ubuntu.
That kernel is what is shared between different containers. You can have 5 copies of Ubuntu (or Debian, or Mint) in separate containers, but they're all using the same kernel. This is what makes containers much more efficient than multiple full VMs.
Not really, no. Software in a container directly talks to the kernel of the host using the normal APIs the kernel provides. A container does not contain a kernel!
They are just applications running on top of the very same kernel you would run any application from.
The kernel just provides enough layers of separation on the necessary structures.
There's plenty of material on it; if interested I'd suggest to start to study by kernel namespaces as @mav3rik pointed out.