Bale opened the scoring, before teeing up Ronaldo as the holders took a 2-0 lead. Pierre-Emerick Aubameyang got one back for Dortmund nine minutes after the break, only for Ronaldo to complete his brace and wrap up the points on 79 minutes.
Real's starting XI featured Nacho at the back and Toni Kroos in midfield, while Isco partnered Bale and Ronaldo in attack, per the club's official Twitter account:
Dortmund gave starts to Maximilian Philipp and Andriy Yarmolenko either side of Aubameyang.
With so much attacking talent and flair on display, the match understandably started at a frenetic pace. The quality of football was impeccable as both teams shifted the ball quickly and intelligently between the lines.
Dani Carvajal shot wide on 10 minutes before Ronaldo's low cross on the break missed Bale by a whisker. The end-to-end nature of the contest saw Yarmolenko and Philipp combine to draw a desperate goal-line clearance from goalkeeper Keylor Navas and centre-back Sergio Ramos.
Los Blancos were ahead on 18 minutes when Carvajal chipped a ball forward for Bale whose volleyed finish was exquisite. For Carvajal, it was another reminder of his keen eye for a pass from defence, per Squawka Football:
As for Bale, the Welshman has been a free-scoring force for the holders this season, according to OptaJose:
Ramos soon flashed a header wide as a rampant first half never let up in pace and entertainment.
Real needed the comfort of a second and got it four minutes after the break when Bale teed up Ronaldo to sweep in. Ronaldo has made a habit of scoring at Dortmund's home, per WhoScored.com:
To their credit, Dortmund didn't buckle. In fact, manager Peter Bosz's side still poured forward in numbers. Philipp, Yarmolenko and Aubameyang rotated and combined fluidly, with the visitors struggling to keep up.
Real's defence buckled when Gonzalo Castro's cross picked out Aubameyang on 54 minutes. One of the Champions League's deadliest finishers was typically unerring from inside the box.
Getting one back prompted Bosz to change his side's shape. Dortmund went to three at the back while Julian Weigl and Mahmoud Dahoud came off the bench to supplement midfield.
The change of shape should have brought an equaliser, but Aubameyang was uncharacteristically profligate. Isco also missed a fine opportunity at the other end.
As is so often the case, it was left to Ronaldo to settle the affair late on. The 32-year-old slammed a shot in at the near post with 11 minutes remaining to take the steam out of Dortmund.
Real have been far from their best in La Liga, currently seven points adrift of arch-rivals Barcelona after six matches. However, the Champions League is where this club is at its best.
There's no sign of Real's dominance of the Champions League waning, while Dortmund now face a tough task just to qualify from the group after consecutive defeats.