Php Docker:MySQL容器绑定主机mysqld套接字

Php Docker:MySQL容器绑定主机mysqld套接字,php,mysql,docker,unix-socket,Php,Mysql,Docker,Unix Socket,我正在使用Docker 19.03.8并希望设置两个容器: 第一个是MySQL容器,它绑定从主机装载mysqld套接字 第二个是PHP容器,它需要通过MySQL容器访问数据库 两个容器通过网络语句共享同一网络。(我不能将mysqld套接字直接绑定到PHP容器中,因为MySQL版本不同,因此MySQL容器也不同) 这是我的docker-compose.yml文件: MySQL的Dockerfile: FROM mysql:8.0.20 COPY my.cnf /etc/mysql/my.cnf

我正在使用Docker 19.03.8并希望设置两个容器:

  • 第一个是MySQL容器,它绑定从主机装载mysqld套接字
  • 第二个是PHP容器,它需要通过MySQL容器访问数据库
两个容器通过
网络
语句共享同一网络。(我不能将mysqld套接字直接绑定到PHP容器中,因为MySQL版本不同,因此MySQL容器也不同)

这是我的docker-compose.yml文件:

MySQL的Dockerfile:

FROM mysql:8.0.20
COPY my.cnf /etc/mysql/my.cnf
并且my.cnf文件包含:

...
[mysql]
socket = /tmp/mysql.sock

[mysqld]
socket = /tmp/mysql.sock
...
不幸的是,我从MySQL容器中收到以下错误消息:

2020-05-20T11:30:04.708067Z 0 [ERROR] [MY-010270] [Server] Can't start server : Bind on unix socket: Address already in use
2020-05-20T11:30:04.708406Z 0 [ERROR] [MY-010258] [Server] Do you already have another mysqld server running on socket: /tmp/mysql.sock ?
2020-05-20T11:30:04.709083Z 0 [ERROR] [MY-010119] [Server] Aborting
如果我在my.cnf中的
[mysqld]
部分省略了
socket=/tmp/MySQL.sock
,那么MySQL容器开始时没有错误。但是如果我尝试从PHP容器(
mysql-h-u-p
)连接到数据库,我只会得到一个空数据库。因此,我假设它使用默认套接字(/var/run/mysqld/mysqld.sock)


我不明白这为什么不起作用,如果有人能给我一个提示,我将不胜感激。

你应该使用TCP连接。将PHP容器配置为连接到数据库容器的Compose服务名称(
database
)和默认MySQL端口(3306)。不要尝试在此处使用Unix套接字

此设置应适用于开箱即用的mysql:8和Docker Compose配置。您不需要自定义
my.cnf
或组合
网络:
容器名称:
链接:
,或其他选项


在您展示的设置中,重要的细节是MySQL守护进程必须自己创建套接字文件。如果您确实想使用Unix套接字执行此操作,则需要绑定装载包含套接字文件的目录;您不能绑定并安装套接字本身。(原则上,您也可以在此处使用命名卷。)

#不是首选路径:挂载目录而不是文件
卷数:
-/共享\u tmp:/tmp
通过显示的设置,您将点击以下事件序列:

  • Docker尝试设置
    数据库
    容器
  • Docker发现主机上不存在
    /var/run/mysqld/mysqld.sock
    ,因此它在那里创建一个空目录并将其装载到容器中
  • 当MySQL守护进程启动时,它会尝试在
    /tmp/MySQL.sock
    处创建一个套接字,但那里已经有一个(空)目录

  • 一般来说,最好避免尝试通过文件系统在容器之间进行通信。除了这些复杂问题外,还经常存在用户权限问题,这种设置限制了您在Docker Swarm和Kubernetes等多主机设置上运行的能力。

    mysql创建套接字,因此您需要执行套接字路径,而不是套接字本身。抱歉,我不明白。我必须将套接字路径放在哪里?我的意思是,在my.cnf中,我需要指定套接字位置。我可以绑定挂载整个/var/run/mysqld路径,但这没有什么区别。谢谢您的回答!抱歉,我想我还不够清楚:我想要访问的实际数据库位于主机系统上,而不是MySQL容器中。但是我想通过MySQL容器从PHP容器访问数据库。MySQL容器不应该创建新的套接字,它应该只使用主机套接字。我写的越多,这个设置对我来说就越没有意义。对于这个设置,你不需要MySQL容器,它将运行第二台服务器。
    2020-05-20T11:30:04.708067Z 0 [ERROR] [MY-010270] [Server] Can't start server : Bind on unix socket: Address already in use
    2020-05-20T11:30:04.708406Z 0 [ERROR] [MY-010258] [Server] Do you already have another mysqld server running on socket: /tmp/mysql.sock ?
    2020-05-20T11:30:04.709083Z 0 [ERROR] [MY-010119] [Server] Aborting