City knocked out Paris St Germain in the quarter-finals thanks to a goal from Belgian midfielder Kevin De Bruyne which secured a 1-0 victory at the Etihad Stadium and sent the Premier League side through 3-2 on aggregate.
Madrid recovered from a 2-0 first-leg defeat by Wolfsburg to progress to the last four following a hat-trick by former Manchester United forward Cristiano Ronaldo.
City will be at home in the first leg on April 26/27 before heading to the Bernabeu a week later.
The other semi-final will see Atletico Madrid, who knocked out Barcelona, take on Bayern Munich, managed by Pep Guardiola in what will be his final season before taking over at City next season.
Liverpool will face Villarreal in the semi-finals of the Europa League.
The Reds produced a stunning comeback to beat Borussia Dortmund 4-3 at Anfield with a stoppage-time goal from Dejan Lovren which secured a place in Friday's draw.
The other semi-final will see holders Sevilla, who are chasing a third successive Europa League title, take on Ukrainian side Shakhtar Donetsk.
The ties will be played on April 28 and May 5, with Liverpool set to host the second leg.
The final is at St Jakob Park in Basel, Switzerland, on May 18, when the winners can claim a place in the Champions League for next season.
Liverpool and Villarreal have never met in Europe.
The Spaniards progressed to the semi-finals following a 6-3 aggregate win over Sparta Prague.
Sevilla overcame Athletic Bilbao on penalties to stay on course to become the first side to win the Europa League three times in a row, while Shakhtar secured their place in the semi-finals by beating Braga of Portugal 6-1 over two legs.