Php 无法连接到docker compose中的数据库
这是我的docker-compose.yamlPhp 无法连接到docker compose中的数据库,php,docker,docker-compose,Php,Docker,Docker Compose,这是我的docker-compose.yaml version: "3.1" services: mysql: image: mysql:8.0.13 container_name: project-mysql volumes: - ./docker/data/mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: db
version: "3.1"
services:
mysql:
image: mysql:8.0.13
container_name: project-mysql
volumes:
- ./docker/data/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: db
MYSQL_USER: dbuser
MYSQL_PASSWORD: secret
ports:
- "3306:3306"
webserver:
image: nginx:alpine
container_name: project-webserver
working_dir: /var/www
volumes:
- .:/var/www
- ./docker/config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- "8080:80"
php-fpm:
build: ./docker/config/php
container_name: project-php-fpm
working_dir: /var/www
volumes:
- .:/var/www
environment:
XDEBUG_CONFIG: remote_host=172.17.0.1
PHP_IDE_CONFIG: serverName=docker
问题是php容器无法连接到mysql。
虽然我可以从主机连接mycli-h 127.0.0.1-P 3306-u root。
但当我在php容器中执行并尝试它时,得到“连接被拒绝”您就可以与用户root连接了。但在docker compose文件中,您是通过用户dbuser进行连接的。如果不是这个问题,请告诉我。您可以与root用户连接。但在docker compose文件中,您是通过用户dbuser进行连接的。如果不是这个问题,请告诉我。您的mysql服务将mysql服务器的端口3306绑定到主机的3306。因此,您可以从主机连接是正常的 在php容器内部,localhost引用了@davidmaze在评论中所说的特定容器 由于您使用的docker compose容器位于同一网络中,因此您应该使用服务名称来连接mysql服务器 从php容器中尝试以下操作:
mycli-hmysql-p3306-uroot您的mysql服务将mysql服务器的端口3306绑定到主机的3306。因此,您可以从主机连接是正常的 在php容器内部,localhost引用了@davidmaze在评论中所说的特定容器 由于您使用的docker compose容器位于同一网络中,因此您应该使用服务名称来连接mysql服务器 从php容器中尝试以下操作:
mycli-h mysql-p 3306-u root当请求来自与绑定地址不同的ip时,通常会被拒绝。试试下面的方法 确保mysql配置my.cnf或任何默认配置不会阻止外部连接检查 mysql配置中的绑定地址(如果仅为127.0.0.1) 允许本地连接表单,我现在将其设置为0.0.0.0或 注释该行(如果存在) mysqld-verbose-help=>您将看到所有选项 mysqld-verbose-help | grep bind address=>检查绑定地址 确保我尝试登录的用户有足够的权限 connectSELECT用户,主机来自mysql.user;检查您的用户是否可以 从docker网络连接=>172.*或任何地方=>%
通常情况下,当请求来自与其绑定地址不同的ip时,conenction会拒绝您的请求。试试下面的方法 确保mysql配置my.cnf或任何默认配置不会阻止外部连接检查 mysql配置中的绑定地址(如果仅为127.0.0.1) 允许本地连接表单,我现在将其设置为0.0.0.0或 注释该行(如果存在) mysqld-verbose-help=>您将看到所有选项 mysqld-verbose-help | grep bind address=>检查绑定地址 确保我尝试登录的用户有足够的权限 connectSELECT用户,主机来自mysql.user;检查您的用户是否可以 从docker网络连接=>172.*或任何地方=>%
您需要使用docker-compose.yml服务名称作为主机名,在本例中为mysql。Docker中的localhost总是指这个容器。您需要使用Docker-compose.yml服务名称作为主机名,在本例中为mysql。Docker中的localhost始终表示此容器。不,这不是问题所在,我也可以连接dbuser。@标记我的意思是,如果您将root作为用户放在撰写文件中。这样行吗?如果没有,请尝试image:mysql:5.7我确信它不会改变任何东西,root默认情况下已经创建了,我为它设置了密码。@标记root用户可能能够从所有源连接进行连接,但dbuser可能没有此权限,假设您没有授予此权限是的,当然。但它是默认创建的,我甚至为它指定了密码MYSQL\u ROOT\u password:secret。因此,我的设置中有这个用户,但它仍然不起作用。不,这不是问题所在,我也可以连接dbuser。@标记我的意思是,如果您将root作为用户放在撰写文件中。这样行吗?如果没有,请尝试image:mysql:5.7我确信它不会改变任何东西,root默认情况下已经创建了,我为它设置了密码。@标记root用户可能能够从所有源连接进行连接,但dbuser可能没有此权限,假设您没有授予此权限是的,当然。但它是默认创建的,我甚至为它指定了密码MYSQL\u ROOT\u password:secret。所以我有这个用户在我的设置,但它仍然不工作