The Bavarians began the game on the front foot, Arturo Vidal heading against the Dortmund bar on three minutes and James Rodriguez, Robert Lewandowski and Franck Ribery all testing Roman Burki in the early stages.
Bayern's pressure eventually gave way to the opening goal on 11 minutes, Niklas Sule heading goalwards from Rodriguez's free kick and, despite the Dortmund keeper making the save, Jerome Boateng nodded home on the rebound.
The visitors came close to equalising when Christian Pulisic's cross was misjudged by David Alaba, allowing Andriy Yarmolenko to set himself up inside the box, but the Austria international made amends by making a last-ditch goal-line clearance from the ensuing effort.
Dortmund would come to rue the missed opportunity because, five minutes before the break, Lewandowski played Thomas Muller into the box on the right, the German going on to delicately chip the ball into the far corner over Burki from a tight angle.
Although Jupp Heynckes's charges continued to dominate well into the second half, Dortmund managed to halve the deficit on 77 minutes as Shinji Kagawa got the better of Joshua Kimmich and Javi Martinez before whipping the ball to the back post for Yarmolenko to power a header past Sven Ulreich at his near post.
Despite a frantic finish, with Peter Stoger's side desperately trying to find an equaliser, Bayern managed to hold on for the win and a place in the fourth round of the competition.
Bayern Munich (4-1-4-1): Ulreich; Alaba, Sule, Boateng, Kimmich; Martinez (Rudy 87'); Ribery (Coman 61'), Vidal, James (Tolisso 75'), Muller; Lewandowski
Borussia Dortmund (5-4-1): Burki; Schmelzer, Toprak, Bartra (Dahoud 43'), Sokratis, Toljian (Isak 88'); Guerreiro (Schurrle 56'), Weigl, Kagawa, Pulisic; Yarmolenko