Keuchel struck out seven without a walk. He gave up just one extra-base hit, a double by Adrian Beltre in the first inning, and threw his second career complete game.
''When you're able to plus and minus your fastball and have the type of command that Dallas has, he's able to ... cut the ball into the righties,'' Houston manager Bo Porter said. ''He can sink it away from the righties. He runs it in on the lefties. He has confidence to throw his breaking ball, his changeup in any count.''
It was the second straight start where Keuchel hasn't walked anyone, which Porter said shows his confidence in attacking the strike zone. Keuchel didn't think that part of his line was a big deal.
''I don't really think about that,'' he said. ''When I throw strikes I'm good, if I don't I'm not very good. So I just have to throw strikes and be good.''
L.J. Hoes and Carlos Corporan each homered and drove in three runs.
The Astros were shut out 4-0 in the series opener, but jumped on Matt Harrison (1-1) for three runs in the second before he left with back stiffness. Hoes hit a two-run homer in the inning.
''I felt OK warming up, but looking up (at the radar) I noticed that my velocity just kept going down further and further,'' Harrison said. ''Then I knew at that point, something wasn't right.''
He said he will go to Dallas on Wednesday to visit a doctor.
They were up by four before a four-run fifth inning powered by an RBI single by Hoes and a three-run shot by Corporan.
The roof at Minute Maid Park was open to start the game, but it was closed during the eighth inning with a storm approaching. It was the first Astros game where the roof was both open and closed since 2006.
Houston was up by four before a four-run fifth inning powered by an RBI single by Hoes and a three-run shot by Corporan.
Texas slugger Prince Fielder was thrown out in the fourth, trying to stretch the first of two singles into a double in the fourth. He was initially ruled safe, but Porter challenged the call and it was overturned.
Keuchel struck out the side in the second inning and was helped by his defense turning double plays in the third, sixth, seventh and ninth innings.
''He was changing speeds really well,'' Texas manager Ron Washington said. ''And when he had to make a pitch, he threw that sinker. We just could not center it. Everything we hit, we just kept beating it into the ground. And he kept throwing it, and we just kept beating it into the ground.''
Designated hitter Chris Carter, who entered the game batting just .168, had a season-high three hits, Jose Altuve tripled and doubled and rookie George Springer had an RBI and walked three times. It was the first time since 2006 that a Houston rookie walked three times in a game.
Hoes hit his first homer since opening day, a two-run shot to the Crawford Boxes in left field to give Houston a 2-0 lead in the second.
Altuve hit a two-out double before Springer walked. Harrison was replaced by Justin Germano after an RBI single by Dexter Fowler made it 3-0.
Harrison allowed four hits and walked three before he was pulled after 1 2-3 innings to tie his shortest career outing. He labored from the start and had already thrown 55 pitches when he left the game.
NOTES: Keuchel's other complete game came on June 23, 2012, against Cleveland. ... The Rangers will recall Nick Tepesch from Triple-A Round Rock before Wednesday's game to start the finale against the Astros against Scott Feldman. ... Houston general manager Jeff Luhnow said Tuesday that RHP Jose Cisnero will have Tommy John surgery on his right elbow next week. ... Luhnow also said that reliever Matt Albers, who is on the disabled list with right shoulder tendinitis, has some inflammation and won't throw for the next 10 days.