However, just six minutes later, the Rossoneri restored parity when Stefan De Vrij headed a corner from Sandro Tonali into his own net.
The reigning champions then had another chance to go in front with a second penalty as Matteo Darmian was hacked down by Fode Ballo-Toure. Lautaro Martinez, however, saw his spot-kick saved by Ciprian Tatarusanu.
Both sides pushed for a winner in the second-half, with Milan even hitting the post through Alexis Saelemaekers, but couldn't find a breakthrough.
Milan remain in second place and still unbeaten going into the international break, while Inter are in third, seven points behind.
Here are the player ratings for both sides:
Ciprian Tatarusanu - 8/10
Milan's best player of the night, Tatarusanu made a series of incredible saves to keep his side in the game, including keeping out Martinez's penalty which ultimately proved decisive.
Davide Calabria - 6.5/10
A solid display from the Milan left-back, who improved vastly from his midweek showing in the Champions League. However, Calabria was dispossessed a few times and was beaten in the air too.
Simon Kjaer - 7/10
The Milan skipper didn't put a foot wrong in the game and was an absolute rock at the back, making three clearances and interceptions each.
Fikayo Tomori - 7/10
The former Chelsea man's pace is a huge asset and he used it to ruffle a few Inter feathers, whilst also forcing De Vrij into scoring the own goal during a set-piece.
Fode Ballo-Toure - 6/10
He looked to be in sixes and sevens in the first half, even conceding the second Inter penalty with a clumsy challenge on Darmian.
Sandro Tonali - 7.5/10
The 21-year-old worked hard all night and even bagged an assist for their goal as it was his free-kick that De Vrij converted into his own net.
Franck Kessie - 6.5/10
Kessie tracked back and closed down spaces often, as always. But the penalty he conceded will surely nag him, considering it was a strange call.
Brahim Diaz - 6/10
Inter did a fabulous job of keeping Diaz quiet, who failed to impact the proceedings in any meaningful way.
Rade Krunic - 6.5/10
His physical style of play helped Milan win the midfield battle as Krunic did a fine job of keeping Brozovic quiet.
Rafael Leao - 6.5/10
The Portuguese only completed nine accurate passes in almost an hour's action but still managed to get three shots on target, a testament to how dangerous he was. He could've used a little more cutting edge.
Zlatan Ibrahimovic - 6.5/10
No derby goals for the Milan legend tonight but he was still an important player in their build-up, whilst also winning a few duels.
Pierre Kalulu - 7/10
He replaced the ineffective Ballo-Toure at half-time and proved to be a massive upgrade, making important blocks and then playing a key role in their late surge.
Ante Rebic - 6.5/10
The Croatian was good on the ball and helped Milan continue their press. However, he'd be frustrated to have missed two good chances late on.
Alexis Saelemaekers - 7/10
Saelemaekers was very lively, although he smashed an effort against the post late on, missing a great chance to win it for the 'home' side.
Ismael Bennacer - 6.5/10
The Algerian, too, put up a good display but blazed a good chance well over the bar and saw a late chance he created wasted by Rebic.
Tiemoue Bakayoko - 5/10
He rarely got on the ball despite Milan being in control when he came on.
Samir Handanovic - 6.5/10
The Inter custodian made four saves on the night but could do nothing about the own goal.
Milan Skriniar - 6.5/10
A resolute display from the Slovakian, who won all his ground duels and also looked to push his side forward with delicious long balls.
Stefan de Vrij - 6/10
The Dutchman made a mess of a simple header but if you take that out, he had a good game against tough opposition, whilst also making five clearances.
Alessandro Bastoni - 7/10
Bastoni was amazing under pressure and was never afraid to charge forward, even laying an excellent ball for Barella, whose shot was unfortunately blocked, denying him an assist.
Matteo Darmian - 7.5/10
A lively attacking presence from the right who also won the second penalty. His offensive positioning was spot on, too.
Nicolo Barella - 7/10
Buzzing with energy and purpose, Barella was a big threat to Milan, although he'd be disappointed not to have converted Bastoni's cross in the first half.
Marcelo Brozovic - 5.5/10
The Croatian struggled against Milan's press but when on the ball, he looked bright, although those moments were few and far between.
Hakan Calhanoglu - 8.5/10
The Turkish playmaker was in inspired form against his former club, coolly dispatching a penalty in the first half. He could've easily had a second had he not blazed a good chance wide late on.
Ivan Perisic - 7.5/10
An excellent all-round performance from Perisic, who was solid defensively and looked threatening going forward too.
Edin Dzeko - 6/10
The 35-year-old has proved everyone wrong this season but tonight was arguably his worst outing with Inter. He was anonymous for much of the game and failed to muster a single effort on target.
Lautaro Martinez - 6/10
Martinez was excellent off the ball, hounding Milan players like a pitbull, but his finishing left a lot to be desired, whilst the Argentine's penalty was also poor.
Arturo Vidal - 5/10
The Chilean failed to get a grip on the match after replacing Barella.
Joaquin Correa - 6/10
No late-double heroics from the former Lazio man tonight.
Denzel Dumfries - 6.5/10
The Dutchman kept his cool and showed good positioning but could never attack.
Alexis Sanchez - 6/10
He won a free-kick in injury-time which came to nothing.
Federico Dimarco - N/A
He rarely even got a whiff of the ball.