Part-time spinner Roston Chase dismissed Oshada Fernando and Angelo Mathews for three each in quick succession to bring the West Indies back into the game.
But Sri Lanka wrestled back the initiative as Karunaratne shared a 97-run partnership with Dhananjaya de Silva for the fourth wicket.
This was Karunaratne's 13th Test century and fourth this year. He has bagged more than 750 runs in 2021, including a career-best 244 against Bangladesh, despite only playing 10 innings.
The West Indies had a scare when Karunaratne attempted a full-blooded pull shot off the bowling of Chase and the ball crashed onto the helmet grill of Solozano, who was fielding at short leg.
Medical staff attended to him on the ground before he was taken on a stretcher to a waiting ambulance.
"He underwent scans at a hospital in Colombo and will be kept overnight for observation," Arjuna de Silva, the head of the Sri Lanka Cricket medical panel, told AFP.
"There's no internal bleeding and the scans show no structural damage," he added.
He underwent scans at a hospital in Colombo, and will be kept overnight for observation, the West Indies said in a media release.
'We had to show patience'
Shannon Gabriel provided the breakthrough for the tourists when he had Nissanka -- who was chasing a full delivery wide outside the off-stump -- caught by Rahkeem Cornwall at first slip for 56.
"We had to show patience and see through the first session. We overcame that tough period and from then on it was good for batting," Nissanka told reporters.
"Disappointed I did the hard work and couldn't make most of the start I got," he added.
But they squandered an opportunity to dismiss Karunaratne on 14, when Cornwall found the outside edge of the bat but Jermaine Blackwood at slip was unable to hold on as he attempted a one-handed grab.
The West Indies unsuccessfully reviewed after Karunaratne played an uncharacteristic reverse sweep off the left-arm orthodox spin of Jomel Warrican and the ball struck his front pad.
Television replays showed the impact was outside off-stump.
The tourists lost their second review over a caught-behind appeal against Nissanka off the bowling of Chase.
They were denied a second wicket in the afternoon session when Warrican failed to take a return catch with Fernando on three.
But the reprieve was brief, with Fernando well caught by Nkrumah Bonner at short leg to give Chase his first wicket.
Mathews' half-an-hour stay at the crease was unconvincing and the West Indies kept attacking with tight field settings.
In a bid to break the shackles, Mathews took on Chase attempting to clear the boundary but found the lone fielder Jason Holder at mid-wicket.
The West Indies took the second new ball soon after 80 overs but could not break the Karunaratne-de Silva partnership.
The tourists had surprised fans by leaving out Kemar Roach, their most experienced player and the eighth-highest Test wicket taker.