Producing the same brand of attacking football that has earned them back-to-back Bundesliga titles, the Germans dominated for much of the game and grabbed a 36th-minute lead through Robert Lewandowski.
Real briefly silenced the sellout 65,000 crowd at the Westfalen Stadium with an equaliser from Cristiano Ronaldo's delicate lob two minutes later but they created few chances in a one-sided second half.
Dortmund grabbed the winner with a sweet, first-time shot from defender Marcel Schmelzer in the 64th minute after a weak punch by Real keeper Iker Casillas who had made a string of superb saves to keep his team in the game.
The Germans now have seven points from three games, one ahead of second-placed Real. For Ronaldo it was the first Champions League game he has lost after scoring a goal.
"Real remain the favourites in our group. This is not yet the decisive result," Dortmund coach Jurgen Klopp told reporters.
"It is important to know that with the quality of players we have we can take on the big teams and we showed it today. We had to be bold, keep possession and then also secure our attacking moves."
The Spaniards, who now have only one victory in 24 games against German clubs, went into the match without injured defenders Marcelo, Alvaro Arbeloa and Fabio Coentrao.
Dortmund quickly found their rhythm and twice Lewandowski threatened after Sebastian Kehl had tested Casillas with a 22-metre drive.
Captain Kehl also unleashed a powerful shot from the edge of the box but Casillas, at full stretch, palmed the ball over the bar.
The Spain keeper, though, was helpless when Lewandowski raced into the box after centre-half Pepe had surrendered possession in midfield and fired the ball just inside the post.
With Dortmund fans still celebrating, Ronaldo latched on to a perfect 30-metre cross-field pass from Mesut Ozil to beat keeper Roman Weidenfeller.
The goal meant Real have now scored in 14 consecutive away matches in the competition, equalling the all-time record held by Bayern Munich and Barcelona.
Casillas again came to Real's rescue early in the second half, blocking a close-range effort from Mario Gotze and punching away a dangerous Marco Reus free-kick as Dortmund took complete control.
With Real posing hardly any threat and unable to break free as the opposition pressed the ball deep in their half, Dortmund launched attack after attack and they were rewarded when Schmelzer thundered a low left-foot drive beyond Casillas.
"We could not make the most of our chances up front," said Real coach Jose Mourinho.
Asked whether he had to change his tactics after an injury to midfielder Sami Khedira after 20 minutes meant he had to bring on Luka Modric, the Portuguese replied: "I have to say that this was the case.
"I had said before that the bill has to be balanced on our side because of the injuries. We had to pay the bill and that is what happened today."
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.