Php 无法连接到docker compose中的数据库

Php 无法连接到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

这是我的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
      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。所以我有这个用户在我的设置,但它仍然不工作