Vettel controlled the opening phase of the race after leapfrogging both Hamilton and his Mercedes team-mate Nico Rosberg off the line, but Ferrari’s decision to pit the German twice enabled Hamilton to claim his fifth victory in Montreal.
And with Rosberg, who spun on the penultimate lap attempting to pass Max Verstappen, crossing the line only fifth, Hamilton has slashed the gap in the championship from 24 to just nine points. Williams driver Valtteri Bottas finished third with a fine drive.
Hamilton, who claimed the 53rd pole of his career, was joined on the front row at the Gilles-Villeneuve Circuit by Rosberg for the first time since their sensational first-lap collision at last month’s Spanish Grand Prix.
But it was the fast-starting Vettel who led into turn one after getting the jump on both Mercedes drivers.
Hamilton, not for the first time this year, was particularly sluggish out of the blocks and as he moved to defend second from Rosberg, the Mercedes pair banged wheels.
While Hamilton retained second place, Rosberg was left with little option other than to take evasive action on to the grass, and when the German re-joined the circuit he found himself in ninth.
That soon became tenth after he was passed by Force India’s Nico Hulkenberg. On lap three, Rosberg made his way ahead of McLaren’s Fernando Alonso for ninth, but he was struggling to make any further inroads on the cars ahead of him.
Up front, Vettel led comfortably, but after the virtual safety car was deployed with Jenson Button parking his poorly McLaren, Ferrari decided to pit both Vettel from the lead and his team-mate Kimi Raikkonen, too. It seemed a curious decision with Vettel, who was leading the race, subsequently dropping back to fourth, and having to commit to a two-stop strategy.
On lap 17, Vettel made his way past the first Red Bull of Daniel Ricciardo before making light work of Verstappen on the ensuing lap to move up to second. At the end of lap 24, Hamilton would make his one and only visit to the pits, stopping for the soft rubber which afforded Vettel the lead once more.
But the four-time champion was back in the pits eight laps later for his second stop of the afternoon, allowing Hamilton to retake the lead. The gap was a little over eight seconds.
Elsewhere, Rosberg was making tentative progress through the pack before his troubled afternoon took another miserable twist when he suffered a puncture in the closing stages.
He pitted from fourth and rejoined in seventh. That soon became sixth when Rosberg passed Ricciardo and then fifth after the German eased past Raikkonen. That is where Rosberg, winner of the opening four rounds of this season, would remain after he failed to find a way past Verstappen. While Vettel was taking small chunks out of Hamilton’s lead it was proving to be slow progress, and when he made a mistake at the final chicane, it did not look as though Hamilton would be troubled. But that wasn’t the case as he cruised to his second victory in 14 days.
“Float like a butterfly, sting like a bee. That was for Muhammad Ali,” said a jubilant Hamilton over the team radio.