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

Connecting to a MySQL container in the same pod

美好的一天,

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

这个想法是 运行 一个 pod 中的两个容器。一个容器使用 docker mysql 图像,另一个 运行s php、laravel、nginx 和 composer.

在本地,这行得通。这个想法是 php 可以连接到本地主机上的数据库,如果两个容器都在同一个 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 身份登录并创建一个附加到该地址的新用户帐户只要您使用您在 my.cnf.

中定义的 IP 地址连接到它,您就可以使用它从任何其他逻辑机器访问 MySQL

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

在 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 选项使您能够建立特定类型的连接,即使其他选项通常默认为某些其他协议。

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