Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 连接到同一pod中的MySQL容器_Php_Mysql_Kubernetes_Google Kubernetes Engine_Unix Socket - Fatal编程技术网

Php 连接到同一pod中的MySQL容器

Php 连接到同一pod中的MySQL容器,php,mysql,kubernetes,google-kubernetes-engine,unix-socket,Php,Mysql,Kubernetes,Google Kubernetes Engine,Unix Socket,你好 我正在使用Kubernetes在google容器引擎上运行容器 想法是在一个吊舱中运行两个容器。一个容器使用docker mysql映像,另一个运行php、laravel、nginx和composer 在当地,这是可行的。其思想是php可以连接到localhost上的数据库,如果两个容器都在同一个pod中,这应该可以工作。但是,当pod启动时,我们会在日志中看到以下消息: SQLSTATE[HY000] [2002] Can't connect to local MySQL server

你好

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

想法是在一个吊舱中运行两个容器。一个容器使用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


感谢您,祝您愉快

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

#bind-address = 127.0.0.1
并将其替换为

bind-address = {your network ip here}
启用绑定地址后,请重新启动mysql服务器,检查错误日志以确保绑定地址时不会出现异常,然后以root用户身份登录并创建一个附加到该ip地址的新用户帐户,只要您使用my.cnf中定义的ip地址连接到MySQL,就可以使用该帐户从任何其他逻辑机器访问MySQL


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

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

shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP
--protocol
选项允许您建立特定类型的连接,即使其他选项通常默认为其他协议


另一种解决方案是使用抽象在容器之间共享路径。在两个容器的图像上编辑
/etc/mysql/my.cnf
,并更改mysql服务器和客户端的
socket
位置,使其指向共享目录或磁盘。

mysql已配置为只连接到本地主机。如果您想从另一个IP连接到MySQL,那么您必须将MySQL绑定到本地主机以外的IP,然后在kubernetes pod中向该主机上的MySQL用户授予权限,您应该能够使用localhost连接两个容器,当我在本地测试它时,我通过IP地址进行连接。因此,在本地,它们是通过ip连接的独立容器。在集群中,它们位于同一个pod中,因此应该能够通过localhost进行连接。在my.cnf文件中查找“bind address”,它最初将为空或显示为“localhost”。您可能需要在my.cnf中添加内部docker IP地址作为绑定地址。问题是:我们根本不希望使用套接字。php容器只需要连接到localhost。我们使用的mysql容器很难修改。这意味着修复最好是更改laravel的连接设置。如果我们打开端口,我们可以通过pod的外部IP连接到mysql工作台。Kubernetes文档规定:Pod中的容器都可以到达本地主机上彼此的端口。()如果您没有连接到本地主机,而是直接连接到套接字,则必须更改这两个问题。首先,因为我是在google容器引擎中进行这项工作的,所以我不可能提前知道pod将获得的内部ip地址。第二,我有两个集装箱在一个吊舱里。在一个pod内,容器应该能够通过本地主机进行通信,它们甚至没有单独的ip地址谢谢你的回复!我们尝试了两种方法,但我认为我们缺少了一些东西。我们使用标准的MySQL docker映像。我们在json描述符中设置协议和ip。这不起作用,系统一直试图使用套接字。之后,我们尝试了你的第二个建议,共享文件夹。为此,我们在两个容器中都添加了一个卷。我们收到的错误是:无法启动unix套接字上的server:Bind:Address已在使用另一种方法可能是创建一个emptyDir卷并将其装载在两个容器上的/var/run/mysqld。