It was not immediately clear which side was responsible, but angry residents punched and kicked a captured soldier dragged to the scene by the rebels.
The mortar killed passengers instantly and blew out the windows of a nearby building. Separatist leader Alexander Zakharchenko blamed Ukrainian government troops for the attack, calling it a provocation.
The civilian death toll has been mounting in the conflict between Ukrainian troops and Russian-backed separatists that the United Nations says has killed more than 4,700 people since April.
Residential areas in eastern Ukraine have been frequently struck during artillery duels between the warring sides.
The bus hit yesterday, however, was far from the front lines, in Donetsk’s central Lenin district.
The separatist-run Donetsk News Agency cited officials as saying the shell was fired from a portable 82-millimetre calibre mortar.
That type of weapon used would seem to indicate the shell was fired from rebel-held territory.
Mr Zakharchenko said a “raiding party” suspected in the attack had already been detained. He did not elaborate.
Ukraine’s defence minister said it believed the shells were fired from residential areas inside Donetsk and the incident occurred 9 miles (15km) from the nearest government positions. It said evidence so far indicated that the responsibility for the attack lay with “illegal armed formations”.
The attack follows a surge of fighting last weekend for control over Donetsk’s war-hit airport.
Ukrainian forces have all but abandoned the airport after months of bitter battles against the rebels, although military officials continued to insist yesterday that their forces still held part of the terminal.
Ukraine’s Defence Ministry said six of its soldiers had died over the previous day at the terminal, which lies on the northern edge of Donetsk, part of 10 soldiers killed overall in fighting across eastern Ukraine. Sixteen Ukrainian troops were taken prisoner after the fighting at the airport.
One of the prisoners was brought to the scene of the bus shelling yesterday morning, while bodies still lay in the road, to be paraded before furious local residents.
Some in the crowd punched and kicked the soldier. He was quickly bundled into a waiting car by rebel militiamen as a crowd pursued them.
Diplomats from Russia and Ukraine agreed on Wednesday on a dividing line from where the warring sides should pull back their heavy weapons.
Hours earlier, however, separatist forces were continuing to deploy more heavy arms and manpower to an emerging flashpoint in eastern Ukraine near the second-largest rebel city, Luhansk.
Germany’s foreign minister, Frank-Walter Steinmeier, who hosted a meeting of his counterparts from Russia, Ukraine and France, said the four parties had agreed the demarcation line defined in the Minsk agreement of last year should form the basis for the withdrawal.
Under the plan, Ukraine and the pro-Russian separatists would pull back their heavy arms nine miles on either side of the line.