Dom*_*k K 6 php mysql unix-socket docker
我正在使用 Docker 19.03.8 并且想要设置两个容器:
两个容器通过该语句共享同一个网络networks。(我无法将 mysqld 套接字直接绑定安装到 PHP 容器中,因为 MySQL 版本不同,因此 MySQL 容器也不同)。
这是我的docker-compose.yml文件:
...
database:
build: .
volumes:
- /var/run/mysqld/mysqld.sock:/tmp/mysql.sock
...
Run Code Online (Sandbox Code Playgroud)
MySQL的Dockerfile :
FROM mysql:8.0.20
COPY my.cnf /etc/mysql/my.cnf
Run Code Online (Sandbox Code Playgroud)
my.cnf文件包含:
...
[mysql]
socket = /tmp/mysql.sock
[mysqld]
socket = /tmp/mysql.sock
...
Run Code Online (Sandbox Code Playgroud)
不幸的是,我从 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
Run Code Online (Sandbox Code Playgroud)
如果我省略my.cnf中的部分socket = /tmp/mysql.sock,MySQL 容器启动时不会出现错误。但是,如果我随后尝试从 PHP 容器 ( ) 连接到数据库,我只会得到一个空数据库。所以我假设它使用默认套接字(/var/run/mysqld/mysqld.sock)。[mysqld]mysql -h <what I specified in the networks statement> -u <user> -p <password>
我不明白为什么这不起作用,如果有人能给我提示,我将非常感激。
您应该为此使用 TCP 连接。配置 PHP 容器以连接到database数据库容器的 Compose 服务名称 ( ) 和默认 MySQL 端口 (3306)。不要尝试在这里使用 Unix 套接字。
此设置应该适用于开箱mysql:8即用的 Docker Compose 配置。您不需要自定义my.cnf或 Compose networks:、container_name:、links:或其他选项。
您所显示的设置中的重要细节是 MySQL 守护程序必须自行创建套接字文件。如果您确实想使用 Unix 套接字来执行此操作,则需要绑定挂载包含套接字文件的目录;您无法绑定安装套接字本身。(原则上您也可以在此处使用命名卷。)
# Not the preferred path: mount a directory instead of a file
volumes:
- ./shared_tmp:/tmp
Run Code Online (Sandbox Code Playgroud)
根据您展示的设置,您将遇到以下事件序列:
database容器。/var/run/mysqld/mysqld.sock主机上不存在,因此它在那里创建一个空目录并将其挂载到容器中。/tmp/mysql.sock,但那里已经有一个(空)目录。一般来说,最好避免尝试通过文件系统在容器之间进行通信。除了这些复杂问题之外,还经常存在用户权限问题,并且此设置限制了您在 Docker Swarm 和 Kubernetes 等多主机设置上运行的能力。
| 归档时间: |
|
| 查看次数: |
9252 次 |
| 最近记录: |