Bayern Munich missed the chance to seal a ninth successive Bundesliga title as they suffered a shock 2-1 defeat at Mainz.
Robert Lewandowski, back from a five-game absence, claimed his 36th Bundesliga goal of the season deep into stoppage time after Mainz had frustrated Bayern in the second period.
Bayern still have three games left to get the three points needed to wrap up the title – unless RB Leipzig slip up against Stuttgart on Sunday – while Mainz move five points clear of the relegation play-off spot.
Haaland struck his 24th and 25th Bundesliga goals of the season after 12 and 68 minutes.
The 17-year-old Bellingham was sent off in the 59th minute following a second bookable offence.
Dortmund's victory reduced the gap on third-placed Wolfsburg to two points.
Fourth-placed Eintracht Frankfurt failed to take advantage of Wolfsburg's defeat by losing 3-1 at Bayer Leverkusen.
Joel Pohjanpalo scored a second-half hat-trick as Union Berlin overcame Werder Bremen 3-1.
Pohjanpalo's treble boosted Union's hopes of a top-six finish, while Theodor Gebre Selassie grabbed a late consolation for relegation-threatened Bremen.
Vincenzo Grifo kept Freiburg's fading European hopes alive by cancelling out Andrej Kramaric's opener in a 1-1 draw with Hoffenheim.
Rodrygo hit the crossbar with a mishit cross but Zinedine Zidane's side created few chances and Real now trail city neighbours Atletico by two points having played a game more.
Elche won for the first time in eight games as Lucas Boye's 32nd-minute strike saw off Levante 1-0.
Ten-man Alaves drew 1-1 at Valencia after John Guidetti gave them the lead six minutes from time.
Javi Lopez was sent off for the visitors before Jose Gaya equalised at the death.
Valladolid and Cadiz also drew 1-1 as Cala cancelled out an earlier effort from Oscar Plano.
Kylian Mbappe scored twice as Paris St Germain took over at the top of Ligue 1 with a 3-1 win at Metz.
Mbappe opened the scoring after four minutes before Fabien Centonze levelled moments after the restart.
PSG reclaimed the lead in the 58th minute when Mbappe got his 25th league goal of the season with a deflected effort from outside the box.
Mbappe limped off in the closing stages to hand PSG a scare ahead of their Champions League semi-final with Manchester City, but Mauro Icardi settled matters in the dying moments with a 'Panenka' penalty.
Gaetan Charbonnier scored twice as Brest won 2-1 at St Etienne to claim a first win in seven games. Wahbi Khazri had given Les Verts an early lead.
In Italy's Serie A, Sassuolo kept up the chase for a European spot with Domenico Berardi on target in a 1-0 victory against Sampdoria. Genoa boosted their survival hopes as substitutes Gianluca Scamacca and Eldor Shomurodov came off the bench to score in a 2-0 win over Spezia.
A first win in five games lifted Genoa eight points clear of the relegation zone and three above Spezia.
Crotone won the battle of the bottom two against Parma with Simy scoring twice in a 4-3 away success.