Ronaldo claimed two second-half goals after Gareth Bale's stunning early volley gave Real the lead at Dortmund's Signal Iduna Park.
The Germans fought back when Pierre-Emerick Aubameyang finally netted with just over half an hour left, but there was to be no repeat of last year's 2-2 draw in Dortmund between the teams.
The result leaves Real top of Group H, just ahead of Tottenham Hotspur, who beat APOEL 3-0 away, with Dortmund third and six points adrift of Spurs, who they also lost 3-1 to in London.
He marked his 400th appearance for Madrid in total with another pair to leave him with 411 goals in the famous white shirt.
More From This Section
This is the first time Dortmund have lost at home to Real in seven European games while holders Madrid have now scored in 38 successive Champion League games.
Dortmund should have been awarded a penalty with 13 minutes gone when Sergio Ramos cleared Maximilian Philipp's shot off the line and the ball deflected off his hand.
Andrey Yarmolenko's initial cross sailed tantalisingly over the head of Borussia's top-scorer Aubameyang in the build up.
With half an hour gone, Dortmund turned the screw with Carvajal having to rescue Real by whipping the ball off Aubameyang's toes with the Gabon striker bearing down on goal.
Aubameyang had the ball in the net on 38 minutes, when he spun and fired home Lukasz Piszczek's pass, but the goal was ruled offside as it stayed 1-0 to Real at the break.
Real lived dangerously after the break when Mario Goetze tried to find Aubameyang, but centre-back Raphael Varane cleared the danger.
Dortmund pulled a goal back on 54 minutes when Aubameyang slipped his marker to convert Gonzalo Castro's cross, then hit the side netting as Borussia pushed for the equaliser.
With 15 minutes left, Burki had to push Isco's shot around the post as Real kept the pressure.
Ronaldo, who was left in acres of space, settled the tie by blasting home Luka Modric's cross on 79 minutes with Madrid's third goal on the break to take the game out of Dortmund's grasp.