Steven Gerrard came close to doubling the lead when he was left unmarked in the box, giving him a free header, but Hart was able to deny the Liverpool captain.
However, the England international was able to set Martin Skrtel up for their second from the resulting corner.
City continued to get stronger after the break and had the ball in the back of the net just over 10 minutes after the restart, but Silva's finish was ruled out for offside.
However, he did manage to pull one back just moments later, tapping in from close range from a James Milner delivery.
© Getty Images
The resurgent visitors almost had another just four minutes later as Silva crossed the ball in for Dzeko, but he just missed the target.
Their pressure paid off, though, as a low Silva cross into the box left Liverpool scrambling as they tried to clear the ball, resulting in Glen Johnson turning it past his own keeper.
Liverpool had to defend hard as City tried to edge ahead for the first time, having brought Sergio Aguero off the bench, but the Argentine's cross in to Silva failed to produce a goal.
The miss proved costly as the hosts immediately went on the counter-attack, regaining the lead when Philippe Coutinho fired the ball into the bottom corner after Kompany failed the clear.
© Getty Images
City had the majority of the possession in the final five minutes as they pushed for another equaliser, but the hosts got numbers back to prevent them getting a clear sight of the goal.
The visitors had a corner in stoppage time, but Mignolet claimed it to clear the danger and seal the win for Liverpool.
The hosts were reduced to 10 men for the final two minutes of injury time when Jordan Henderson was shown a straight red for a high challenge on Silva.
The result leaves Liverpool five points clear at the top of the table, while City remain third.