Spain internationals Javi Martinez and Juan Bernat gave Bayern a comfortable two-goal lead before substitute Franck Ribery netted a third on 90 minutes.
The result allowed Bayern to extend their lead over second-placed RB Leipzig, who drew 2-2 at Augsburg on Friday.
Bayern now head for Arsenal on Tuesday for their Champions League last 16 second leg tie, holding a 5-1 first-leg lead.
“We’re happy, because that was an important result for us,” said Bayern coach Carlo Ancelotti.
“We had problems at the start, because they were well organised, but we made more room after going 1-0 up and put in a good second-half performance.”
Cologne earned a 1-1 draw in Munich last October, but there was no denying Bayern this time.
Martinez headed home Arturo Vidal’s cross after Bayern worked a short-corner routine on 25 minutes.
Bayern doubled their lead when Thomas Mueller spotted Bernat unmarked to shoot home with the help of a deflection on 48 minutes.
Bernat then turned provider just before the final whistle when his cross was driven home by Ribery.
Borussia Dortmund will be without Germany winger Marco Reus for Wednesday’s Champions League last 16 return leg at home to Benfica after he limped out of Saturday’s 6-2 thrashing of Bayer Leverkusen.
Pierre-Emerick Aubameyang scored twice to leave him with 21 league goals in as many games, two ahead of Bayern’s Robert Lewandowski, but the win was dampened by a suspected tear to Reus’ left hamstring.
“It’s sad news, he (Reus) has been playing very consistently for weeks and at a high level,” said Dortmund coach Thomas Tuchel.
“It’s an enormous loss which tarnishes the win,” he added with Dortmund looking to overturn a 1-0 defeat from the first leg at Benfica.
Dortmund wasted no time as Ousmane Dembele gave them a sixth minute lead before Aubameyang was left unmarked to head home on 26 minutes.
Leverkusen pulled a goal back when Kevin Volland held off Dortmund defender Soktratis Papastathopoulos and drilled his shot inside the near post just after the break.
Dembele’s cross was headed home by Aubameyang, again at the far post, to put Dortmund 3-1 up on 69 minutes.
Brazilian defender Wendell curled a free-kick home to make it 3-2 on 74 minutes before Borussia’s US international teenager Christian Pulisic, on for Reus, made it 4-2 on 77 minutes.