Bottas, who started from pole position, kept his lead on the run down into Turn 2 while Hamilton came under pressure from title rival Sebastian Vettel. However, the Briton held him off and the trio ran as they were until the pit stop phase of the race, Bottas was the first to peel into the pitlane, swapping his ultra soft tyres to the yellow-walled soft compound.
Vettel came in one lap later while Mercedes opted to keep Hamilton out. On fresher tyres, Vettel pushed and managed to jump Hamilton who came into the pitlane one lap later.
However, despite complaining over the radio about being jumped, Hamilton didn't stay behind for long as on lap 16, he overtook the German as they ran into Turn 4. The battle heated up two corners before when Hamilton attempted an overtake, with the two coming close to contact.
Bottas led Hamilton for another nine laps before he was instructed to move over and let his teammate by. The Finn obliged and held on to keep Vettel behind and complete a one-two finish for Mercedes - its first since the German Grand Prix earlier this year.
The Dutchman cut his way through the field rapidly during the opening number of laps and found himself in P5 on lap nine. He took the lead after both Ferraris and Mercedes made their pitstops and kept a consistent gap to Hamilton behind.
Red Bull was hoping that a late switch to a softer tyre would allow him to catch and overtake Raikkonen, however the 20-year-old strangely fell even further behind Raikkonen after he pitted for the ultra soft tyre with just ten laps to run.
Verstappen's teammate Daniel Ricciardo was sixth and was well off the pace due to damage to his front wing. Charles Leclerc spoke after qualifying about his hopes to retain seventh place in the race, and he did just so, collecting six points to put Sauber just three points behind Toro Rosso in the standings.
Kevin Magnussen held off the Force India pair to bring home eighth place. The pink panthers tactically switched both of its cars around during the race, allowing both to have a go at the Dane. However, after failing to do so, Sergio Perez let Esteban Ocon back through for ninth position.
Bahrain International Circuit - Winter testing