【问题标题】:Vagrant port forwarding for MysqlMysql 的 Vagrant 端口转发
【发布时间】:2016-01-13 18:35:45
【问题描述】:

我正在尝试在 Vagrantfile 中设置端口转发以从主机系统连接到访客 mysqld,但得到 reading initial communication packet 错误。 主持人:优胜美地,嘉宾:Trusty, vagrant 1.7.4

流浪文件(主机):

config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 3306, host: 3309

我的.ini(访客):

bind-address            = 127.0.0.1

8080 转发就像一个魅力。

来自客人的mysql -h127.0.0.1 -uroot -p 也有效。

来自主机的mysql -h127.0.0.1 -P 3309 -uroot -p 出现reading initial communication packet 错误。

当我从主机远程登录时,连接立即关闭:

$ telnet localhost 3309
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

当我从主机 ssh 到 vagrant box 时,端口转发工作:

$ssh vagrant@127.0.0.1 -p 2222 -L3308:localhost:3306 

然后我可以毫无问题地从主机mysql -h127.0.0.1 -P3308 -uroot -p 连接,我将其用作临时解决方法。

【问题讨论】:

  • 你有防火墙规则来阻止这些端口上的流量吗?
  • @FrédéricHenri 不,这是我的第一个嫌疑人。没有单一的 iptable 规则。无论如何,我尝试使用 ssh 进行隧道,它可以正常工作。
  • 对,但是通过隧道,您仍然使用 ssh 端口。
  • 好吧,即使 ssh 隧道超过 2222,它也应该使用客户机系统上的 3306 连接到 mysqld,并使用主机上的 3309 连接客户机。无论如何,我确认来宾上没有 iptable 规则,并且主机上的防火墙已关闭。

标签: mysql vagrant portforwarding vagrantfile


【解决方案1】:

终于可以让它工作了-

编辑/etc/mysql/my.cnf 文件并确保

  • 你有bind-address = 0.0.0.0
  • 或者你评论#bind-address ...这一行

您可能需要将其添加到 my.cnf 文件的 mysqld 部分:

[mysqld]
bind-address = 0.0.0.0

请确保在更改后重新启动您的 mysql 服务器

$ sudo service mysql restart

然后你可以从你的主机连接 - 所以我首先遇到了类似的错误

$ mysql -h127.0.0.1 -P 3309 -uroot -p
Enter password:
ERROR 1130 (HY000): Host '172.16.42.2' is not allowed to connect to this MySQL server

所以我回到了客人那里

vagrant@precise64:~$ mysql -h127.0.0.1 -uroot -p
...
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.16.42.2' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

然后我从主机连接没有问题

$ mysql -h127.0.0.1 -P 3309 -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.44-0ubuntu0.12.04.1 (Ubuntu)

【讨论】:

  • 谢谢弗雷德里克。它也适用于 my.cnf 中的bind-address = 10.0.2.15
  • 显然virtualbox使用这个接口进行端口转发。除了 ssh 到盒子之外,我找不到将端口转发到 lo 接口的方法,这不是很方便,但有点道理。
  • 对于 VirtualBox,Vagrant 要求连接到虚拟机的第一个网络设备是 NAT 设备。 NAT 设备用于端口转发,这是 Vagrant 通过 SSH 访问虚拟机的方式。
  • 我想补充一点,我花了一些时间让它工作(这个答案很好)。 (起初我会得到“错误2013(HY000):在'读取初始通信数据包'时丢失与MySQL服务器的连接,系统错误:2”即使我已经“正确”获得了所有配置设置,我放弃了所以我决定使用 ssh forward tunnel 解决方法,我终于可以让它工作,但到那时,我再次尝试直接将 mysql 连接到端口,没有隧道,它工作......所以其他人,也许只是耐心等待,重新加载 vagrant 和mysql几次才放弃。
【解决方案2】:

第一个答案是对的,但还不够。我连接 MySQL 时出现错误:

不允许主机 '10.0.2.2' 连接到此 MySQL 服务器

解决方案:

创建由“密码”标识的用户“root”@“10.0.2.2”;

使用授予选项将 . 上的所有权限授予 'root'@'10.0.2.2';

刷新权限;

啊哈,所有问题都解决了,

【讨论】:

    【解决方案3】:

    就我个人而言,我不会费心修改 MySQL 以用于开发 Vagrant 盒子 - 在配置程序中编写脚本既费时又困难,这意味着每次您 vagrany destroy 或新开发人员开始贡献时,您都必须手动完成。相反,我通过 SSH 隧道进行连接,使用 Vagrant 生成的 private_key 文件非常容易。无需额外的安装后调整。

    按照以下步骤使用 SequelPro、MySql Workbench 或任何其他支持 SSH 连接的客户端使用 SSH 隧道:

    • 选择 SSH 连接选项
    • SSH 模式下的“主机”变为 localhost 或具体为 127.0.0.1(更可预测的跨操作系统)
    • 用户名/密码是数据库用户名/密码。对于开发,您可以使用 root 并在配置程序中定义/创建密码(参见下面的 sn-p)
    • SSH 用户名是Vagrant
    • 没有 SSH 密码 - 只需将 private_key 用于 Vagrant 机器,它位于 VM 项目根目录中的 .vagrant/machines/default/virtualbox;请注意,在大多数操作系统的 此目录中,所有以 . 开头的目录都是隐藏的

    要自动安装和创建 root 密码,请将其添加到您的 Vagrant 配置器脚本文件(Vagrantfile 中的config.vm.provision),通常命名为provisioner.sh

    debconf-set-selections <<< 'mysql-server mysql-server/root_password password SuperSecretPasswordHere'
    debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password SuperSecretPasswordHere'
    
    apt-get install -y mysql-server
    

    希望这有助于为其他人节省一些时间!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 2013-06-30
      • 2019-03-24
      • 1970-01-01
      • 2014-02-14
      • 2016-04-21
      相关资源
      最近更新 更多