Manuel Pellegrini’s men came under heavy pressure in the second half as a previously subdued Real finally found their teeth.
City goalkeeper Joe Hart again proved their saviour, producing fine reflex stops from Casemiro and Pepe, while Jese also hit the bar as the visitors upped the tempo in the latter stages.
City held on to give themselves a fighting chance heading into next week’s second leg at the Bernabeu, although the watching Ronaldo, who unexpectedly failed a fitness test, will hope to feature.
The occasion was a tense one, although there was some amusement on the touchline as Real coach Zinedine Zidane split his trousers.
The drama began before kick-off as Ronaldo, whom Zidane had suggested would be fit after a thigh injury, failed to make the teamsheet.
He was forced to watch from the bench while his Brazilian namesake Ronaldo, a former Real player, looked on from the stands.
The absence of former Manchester United star Ronaldo should have boosted City, as would the sight of their fans waving flags in an impressive pre-game display of support.
City responded well initially with their all-Brazilian central midfield pairing of Fernandinho and Fernando taking an early grip on proceedings.
Even though neither side could muster a shot on target in the opening 45 minutes it was City who were the more positive.
Kevin De Bruyne curled a dangerous ball into the box for Sergio Aguero but Pepe did enough to prevent the Argentine shooting.
Pepe was booked soon after for taking down a surging De Bruyne on the right and Sergio Ramos was perhaps fortunate to escape a similar fate after fouling Fernandinho in a similar position.
Without Ronaldo, Real were limited in attack. Gareth Bale struggled to get into the game and on the visitors’ rare forays forward Vincent Kompany and Nicolas Otamendi were solid.
City suffered a blow before the break as playmaker David Silva was forced off with a suspected hamstring injury but his replacement Kelechi Iheanacho, scorer of two goals at the weekend, entered to a big ovation.
The hosts had a clear chance early in the second half but Aguero fired over and Real finally started to force their way into the game.
Bale appealed without success for a penalty after stumbling following a challenge by Otamendi and an unmarked Ramos spurned a golden chance when he headed straight at Hart from a corner.
Toni Kroos missed the target with a long-range effort and substitute Jese went close as he leaped ahead of Fernando and headed against the bar. Bale curled an effort wide and Vazquez was also denied a penalty after tangling with Otamendi.
Hart, who had hitherto had a quiet game, then came to City’s rescue with a fine reflex save from a Casemiro header and then did even better to block from Pepe at point-blank range.
City breathed a huge sigh of relief as they weathered that storm and they might even have snatched victory in injury time when De Bruyne fired in a free-kick only to see it tipped over the bar by Keylor Navas.