<ng-container>if you need a helper element for nested structural directives like ngIf or ngFor or if you want to wrap more than one element inside such a structural directive;
<ng-template>if you need a view "snippet" that you want to stamp at various places using ngForTemplate, ngTemplateOutlet, or createEmbeddedView().
ng-template is used for structural directive like ng-if, ng-for and ng-switch. If you use it without structural directive, nothing happens and renders.
ng-container is used when you don't have a suitable wrapper or parent container. In most cases we are using div or span as a container but in such a cases when you want to use multiple structural directive, but you can't use more than one structural directive on a element, in that case ng-container can be used as a container