Компонент-контейнер содержит логику, которая одинаковая/практически одинаковая для нескольких компонентов. В итоге, чтобы не дублировать один и тот же код в разных компонентах и не менять его то тут, то там при каких-либо изменениях их держат в одном контейнере.
Выглядит это примерно так:
const Container = (View) => {
return class extends Component {
state = { num: 1 };
render() {
return <View {..this.state} {...this.props} />
}
}
}
В компоненте пишите любую логику с изменением стейта, методами и т.д., а потом передаете это в оборачиваемый компонет, и в нем уже из пропсов достаете, что нужно
HOC это немного другое, например connect у react-redux это HOC, разницу между connect и выносом логики для отрисовки конкретных компонентов, думаю поймете сами