The Citizens were two goals to the good midway through the match thanks to efforts from David Silva and Aymeric Laporte, which substitute Bernardo Silva added to moments after being introduced from the bench.
Just a third win in eight European outings, inspired in part by the return of Kevin De Bruyne to the starting lineup for the first time this season, lifts City up to first place in the Group F standings - one point ahead of Lyon - at the halfway point.
The man who launched City's European campaign with a late goal at Hoffenheim three weeks ago was at it again here, firing a volley across Andrij Pyatov and into the far corner of the net to give his side a deserved lead half an hour in.
It had been all City up to that point, with the Citizens boasting 90% possession at one stage and racking up a total of 15 goal attempts in a dominant first half.
Silva looped a shot narrowly over the crossbar and Gabriel Jesus was denied by Pyatov from a one-on-one position in the minutes leading up to the Spaniard's eventual opener, while Riyad Mahrez drilled a shot wide to bring a disappointing end to his side's four-on-one counter.
Shakhtar also had the post to thank for keeping the scoreline low as Silva's flicked finish came back off the frame of the goal, shortly after Yaroslav Rakitsky blocked Mahrez's latest attempt on the line.
Pep Guardiola's men were fully deserving of their two-goal advantage when the second goal of the evening arrived before half time, then, with Laporte swooping down to guide De Bruyne's corner into the net after Benjamin Mendy's bullet shot was pushed behind for a corner.
Having become the first English side to score twice away at Shakhtar in the Champions League, City - now unbeaten in seven since going down 2-1 to Lyon in their European opener - were keen to add more to their tally.
It was otherwise one-way traffic, though, as Mahrez blasted into the side-netting from a good position and Jesus dragged one wide.
Sensing that the job was done, Guardiola brought on Bernardo for De Bruyne with 20 minutes to go, and the Portuguese needed just a couple of minutes to make an impact on the game.
Bernardo picked up the ball in a deep position and exchanged passes with Mahrez, before killing off the tie by tucking the ball out of Pyatov's reach from the edge of the box.
Phil Foden and Raheem Sterling wasted presentable opportunities in the closing stages, the latter clipping the crossbar with his rising shot, but it mattered little in the grand scheme of things on a straightforward night for the visitors.
SHAKHTAR DONETSK (4-2-3-1): Pyatov; Matviienko, Kryvtsov, Rakitskiy, Ismaily; Maycon, Stepanenko; Wellington Nem (Bolbat 69'), Kovalenko (Alan Patrick 62'), Fernando (Dentinho 84'); Moraes
MANCHESTER CITY (4-3-3): Ederson; Stones (Walker 80'), Laporte, Otamendi, Mendy; D.Silva, Fernandinho, De Bruyne (Bernardo 69'); Sterling, Jesus (Foden 88'), Mahrez