The Canucks announced the deal Sunday, the first day of free agency.
Garrison, who grew up in White Rock, B.C., joins the Canucks after four seasons with the Panthers.
"We felt quite strongly that he is a player that is evolving and, given our circumstances, that he would have an opportunity to continue to evolve," Canucks general manager Mike Gillis said.
The 27-year-old had 16 goals and 17 assists for 33 points in 77 games with Florida last season. He added a goal and two assists in the playoffs.
Gillis indicated Garrison agreed to take less from the Canucks than he could have earned with other clubs.
"We're trying to have a team that competes for the Stanley Cup, and in a cap system, it means that everyone has to work with you in order to allow that to happen," Gillis said. "(Garrison) was adamant that he wanted to play for a team that was going to compete for a Stanley Cup and had an opportunity to, and was prepared to work with us to do it."
Garrison was viewed as a prime candidate to join the Canucks before free agency opened due to his Vancouver ties. He appeared to become expendable in Florida after the Panthers signed defenseman Filip Kuba away from the Ottawa Senators.
"It's hard to find big, strong defensemen in their prime that you can sign, and we consider him one of them," Gillis said.
Information from The Associated Press was used in this report.