连接到同一Pod中的MySQL容器

时间:2016-02-03 15:10:23

标签: php mysql kubernetes google-kubernetes-engine unix-socket

美好的一天,

我正在使用Kubernetes在google容器引擎上运行容器。

想法是在一个pod中运行两个容器。一个容器使用docker mysql映像,另一个容器运行php,laravel,nginx和composer。

在本地,这是有效的。这个想法是php可以连接到localhost上的数据库,如果两个容器都在同一个pod中,这应该可以工作。但是,当pod启动时,我们会在日志中看到以下消息:

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

唯一的区别是,在本地测试时,我将localhost更改为内部docker ip。

谢谢,美好的一天

2 个答案:

答案 0 :(得分:5)

在Unix上,MySQL程序特别对待主机名localhost,其方式可能与您期望的与其他基于网络的程序相比有所不同。对于与localhost的连接,MySQL程序尝试使用Unix套接字文件连接到本地服务器。即使给出--port-P选项来指定端口号,也会发生这种情况。要确保客户端与本地服务器建立TCP / IP连接,请使用--host-h指定主机名值127.0.0.1或本地IP地址或名称服务器。您还可以使用--protocol=TCP选项显式指定连接协议,即使对于localhost也是如此。例如:

shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP

--protocol选项使您可以建立特定类型的连接,即使其他选项通常默认为某些其他协议。

另一种解决方案是使用Kubernetes Volume抽象来共享容器之间的路径。在两个容器上修改/etc/mysql/my.cnf'映像并将MySQL服务器和客户端的socket位置更改为指向共享目录或磁盘。

答案 1 :(得分:0)

MySQL预先配置为仅支持localhost上的命名管道连接,如果要从另一个逻辑机器连接到它,则需要在my.cnf文件中找到以下行...

#bind-address = 127.0.0.1

并将其替换为......

bind-address = {your network ip here}

启用绑定地址后重新启动mysql服务器,检查错误日志以确保绑定地址时没有发生异常,然后以root身份登录并创建一个附加到该IP地址的新用户帐户,然后您可以只要您使用my.cnf中定义的IP地址连接到MySQL,就可以使用从任何其他逻辑机器访问MySQL。

默认情况下,请注意只能从localhost访问root帐户,因此您需要创建新的用户帐户或更改root帐户以支持远程连接(不安全)