The left-handed opener was out for 96 but not before he repaired the early damage with help of Bell and Morgan.
Cook misses ton but knock good enough to spice up England total
Cook's 96 was the centrepiece of England's 342 for six at stumps after Sri Lanka won the toss.
The left-handed opener had had to watch from the other end as England slumped to 22 for three.
But stands of 108 with Ian Bell and 71 with Eoin Morgan helped repair the early damage.
Former Ireland batsman Morgan shared 101 with the equally free-scoring wicket-keeper Matt Prior for the sixth wicket before falling lbw for 79 to seamer Suranga Lakmal's first delivery with the new ball.
But Prior, in sunny conditions ideal for batting, was 73 not out off 83 balls with 14 fours at stumps and Stuart Broad unbeaten on 17.
"It's quite evenly poised still," Morgan told BBC Radio after stumps. "We're in that position that allows us to kick on in the morning if we get through the first hour.
And of his own innings, he added: "I do feel in good form so it is good to get some runs under the belt — a packed house at Lord's, there's no better place to do it."
Sri Lanka, 1-0 down in this three-match series after an innings and 14-run loss in the first Test in Cardiff concluded Monday, where Cook made 133 after his 189 in the Ashes finale in Sydney, enjoyed a sensational start.
They dimissed England captain Andrew Strauss for four before Jonathan Trott and Kevin Pietersen fell for just two apiece.
Sri Lanka's attack had looked unthreatening in Cardiff. But left-arm seamer Chanaka Welegedara, recalled with the fit-again Dilhara Fernando in place of spinner Ajantha Mendis and seamer Thisara Perera, had opener Strauss lbw, hitting across the line, and England were five for one.
Trott came into this match on the back of a first Test 203 but, aiming legside, he was lbw to seamer Lakmal after unsuccessfully reviewing West Indian umpire Billy Doctrove's decision.
Pietersen, lbw to left-arm spinner Rangana Herath for three in Cardiff, was then out even more cheaply after steering Lakmal to gully, where Sri Lanka captain Tillakaratne Dilshan held a diving catch.
"Kev is quite a chilled bloke and he is looking pretty good in the nets so I'm sure there's a huge score around the corner," Morgan said.
The stylish Bell then rode his luck before edging Welegedara to first slip Tharanga Paranavitana for 52.
Cook, the rock of England's batting during their Ashes win in Australia with 766 runs at 127.66, including three hundreds, carried on in typically unfussy fashion.
But, after more than four-and-a-half hours at the crease, he tamely miscued a pull off Fernando to Farveez Maharoof to end an innings featuring 15 fours.
"He's continued his fantastic form we've seen through the winter," Morgan said of Cook. "When our backs were against the wall, he scored a real world-class innings."
Left-hander Morgan, who plays at Lord's for Middlesex, lofted the spin of Herath and Dilshan for six as he advanced to his second highest Test score, behind his 130 against Pakistan at Trent Bridge last year.
Those runs were made after coming in at 118 for four and Friday's knock saw him take guard with England faltering at 130 for four.
But Morgan's hopes of another Test century ended when, having originally been given not out by Doctrove, Sri Lanka's review established Lakmal's delivery had pitched in line and would have hit the stumps.
England (1st Innings):
Andrew Strauss lbw b Welegedara 4
Alastair Cook c Maharoof b Fernando 96
Jonathan Trott lbw b Lakmal 2
Kevin Pietersen c Dilshan b Lakmal 2
Ian Bell c Paranavitana b Welegedara 52
Eoin Morgan lbw b Lakmal 79
Matt Prior not out 73
Stuart Broad not out 17
Extras: (9nb, 3w, 3b, 2lb) 17
TOTAL: (for six wickets, 88 overs) 342
Fall of wickets: 1-5, 2-18, 3-22, 4-130, 5-201, 6-302.
Still to bat: Graeme Swann, Steven Finn, Chris Tremlett.
Bowling: Chanaka Welegedara 18-4-65-2 (4nb, 1w), Suranga Lakmal 19-2-79-3 (1w), Farveez Maharoof 17-5-57-0 (5nb, 1w), Dilhara Fernando 13-2-57-1, Rangana Herath 14-1-49-0, Tillakaratne Dilshan 7-1-30-0.