The Citizens showed five changes to the side that began the 2-1 league win over Chelsea at the weekend, with Nicolas Otamendi, Fernandinho, Ilkay Gundogan, Bernardo Silva and Gabriel Jesus all handed starts.
The hosts dominated the early possession, with Kevin De Bruyne seeing an early shot blocked after he had been set up by Raheem Sterling.
However, City were almost behind when Ederson missed his kick as he raced out of his area and was relieved to see former Shakhtar star Fernandinho help in denying Mateus Tete what at one point looked like being an open goal.
The home side responded with Rodri testing Andriy Pyatov with a shot from distance, before the veteran keeper was in the right place to collect an Otamendi header.
There were few other moments of promise at either end after that as a drab first half ended goalless.
The second half also started quietly, before City broke the deadlock with 11 minutes of the second period played.
De Bruyne found Gabriel Jesus inside the Shakhtar area and his smart control and turn allowed him to tee up the arriving Gundogan for a comfortable finish from around ten yards out.
However, the Ukrainians drew level with just over 20 minutes to play as substitute Manor Solomon scored just five minute after coming on, with Brazilian Dodo the architect with a pacy run and cross.
The Citizens huffed and puffed as they went in search of a late winner, but come the final whistle a point was enough to ensure progress for Pep Guardiola’s side.