<ng-content>

This is the tag you use for "content projection". If you have some html you want to insert into a child component, say <peters-component>. Roughly it looks like this:

Parent Template

<peters-component>
	<h1>Projected Content!</h1>
	<p>This is content that I want to "project" into Peter's Component</p>
</peters-component>

Child Template

<h1><i>Welcome to Peter's Component</i></h1>
<p>And heeeere is the projected content!:</p>
<ng-content></ng-content>

And that's it. You can chuck an id in there somewhere to make the code less ambiguous. If that's what spins ya wheels (it should).

<ng-template>

The thing Angular "de-sugars" your structural directives (*ngIfs and *ngFors) into.

"The <ng-template> is an Angular element for rendering HTML. It is never displayed directly. In fact, before rendering the view, Angular replaces the <ng-template> and its contents with a comment." - link

<ng-container>

This is an invisible thing you can put your *ngIfs or *ngFors on. Also used for the else clause in an *ngIf.

"The Angular <ng-container> is a grouping element that doesn't interfere with styles or layout because Angular doesn't put it in the DOM." - link