Two high-quality opponents produced numerous uncharacteristic errors, with Joshua Kimmich beating Real goalkeeper Keylor Navas at his near post to give Bayern the lead.
Marcelo equalised after 44 minutes, after Bayern had lost winger Arjen Robben and defender Jerome Boateng to injury.
And half-time substitute Marco Asensio struck after 57 minutes, capitalising on Rafinha's sloppy pass, to give Zidane's men the advantage ahead of next week's second leg at the Bernabeu.
"We're very satisfied with the result, but we had a lot of problems in the first few minutes trying to take control of the game," Zidane said.
"The tie is far from over, it's more than possible that Bayern could win in the Bernabeu, but we are very happy to have won 2-1 in Munich."
Real won 3-0 at Juventus in the quarter-final, but Juve drew level in Madrid and the Spaniards prevailed only after Cristiano Ronaldo's stoppage-time penalty. That will be used as a cautionary tale by Zidane.
"We know that the tie cannot be over after one leg," he added. "After the Juventus match, we know we'll need to approach the Bayern result differently, otherwise things could go badly for us. We can't have another night like that."
Zidane praised Navas for his performance, refusing to dwell on Kimmich's goal, which came after Marcelo was caught out of position.
The Frenchman added: "Bayern's goal was a consequence of several people making mistakes, not just Navas.
"He was very good in the second half. I think we suffered a little tonight off the ball, I thought (Franck) Ribery was excellent tonight."
Zidane also praised Marcelo, who equalised moments before the interval.
He added: "It's a good thing that Marcelo plays for us. It's not just about his goals, it's what he can do defensively too. He can make the difference at any moment."
The result means the German champions must score at least twice and overcome the away goals advantage to have any hope of denying 12-time European champions Real's progress to next month's final in Kiev.
Reporting by Press Association.