Php Lumen/Docker/MySQL(SQLSTATE[HY000][2002]连接被拒绝),但我可以进行外部连接

Php Lumen/Docker/MySQL(SQLSTATE[HY000][2002]连接被拒绝),但我可以进行外部连接,php,mysql,docker,lumen,Php,Mysql,Docker,Lumen,我在这件事上疯了 我在Docker容器中安装了Lumen和MySQL。大多数情况下,一切都很好。我可以运行容器并通过浏览器访问流明。我可以通过Sequel Pro访问MySQL,没问题。我可以运行phpartisan-migrate,效果很好 但如果我试图通过浏览器中的Lumen执行任何操作,它将无法连接到数据库,并且它会给我连接拒绝错误 我使用的Lumen 5.7.7和.env文件如下所示: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306

我在这件事上疯了

我在Docker容器中安装了Lumen和MySQL。大多数情况下,一切都很好。我可以运行容器并通过浏览器访问流明。我可以通过Sequel Pro访问MySQL,没问题。我可以运行
phpartisan-migrate
,效果很好

但如果我试图通过浏览器中的Lumen执行任何操作,它将无法连接到数据库,并且它会给我连接拒绝错误

我使用的Lumen 5.7.7和.env文件如下所示:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=root
version: '3'
services:
  api:
    build:
      context: .
      dockerfile: .docker/Dockerfile
    image: laravel-docker
    ports:
      - 8080:80
    depends_on:
      - mysqldb
    volumes:
      - .:/srv/app
    # container_name:
  mysqldb:
    image: mysql:5.7
    container_name: mysqldb
    command: mysqld --user=root --verbose
    volumes:
       - ./schemadump.sql:/docker-entrypoint-initdb.d/schemadump.sql
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
version: '3'
services:
  api:
    build:
      context: .
      dockerfile: .docker/Dockerfile
    image: laravel-docker
    ports:
      - 8080:80
    links:
      - mysql
    volumes:
      - .:/srv/app
    environment:
      DB_HOST: mysql
      DB_DATABASE: test
      DB_USERNAME: test
      DB_PASSWORD: test
  mysql:
    image: mysql:5.7
    ports:
      - 13306:3306
    environment:
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: root
docker-compose.yml如下所示:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=root
version: '3'
services:
  api:
    build:
      context: .
      dockerfile: .docker/Dockerfile
    image: laravel-docker
    ports:
      - 8080:80
    depends_on:
      - mysqldb
    volumes:
      - .:/srv/app
    # container_name:
  mysqldb:
    image: mysql:5.7
    container_name: mysqldb
    command: mysqld --user=root --verbose
    volumes:
       - ./schemadump.sql:/docker-entrypoint-initdb.d/schemadump.sql
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
version: '3'
services:
  api:
    build:
      context: .
      dockerfile: .docker/Dockerfile
    image: laravel-docker
    ports:
      - 8080:80
    links:
      - mysql
    volumes:
      - .:/srv/app
    environment:
      DB_HOST: mysql
      DB_DATABASE: test
      DB_USERNAME: test
      DB_PASSWORD: test
  mysql:
    image: mysql:5.7
    ports:
      - 13306:3306
    environment:
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: root

编辑:在站点和命令行上运行phpinfo(),发现它们甚至不是相同的版本,更不用说相同的详细信息了。这就是问题所在吗?再看一看…

嗯,它现在在某种程度上起作用了。我现在可以从浏览器而不是命令行使用它,我可以使用命令行。从上面的评论来看,问题似乎在于缺少一个连接api和数据库的“链接”部分。env文件未更改,但docker-compose.yml现在看起来如下所示:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=root
version: '3'
services:
  api:
    build:
      context: .
      dockerfile: .docker/Dockerfile
    image: laravel-docker
    ports:
      - 8080:80
    depends_on:
      - mysqldb
    volumes:
      - .:/srv/app
    # container_name:
  mysqldb:
    image: mysql:5.7
    container_name: mysqldb
    command: mysqld --user=root --verbose
    volumes:
       - ./schemadump.sql:/docker-entrypoint-initdb.d/schemadump.sql
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
version: '3'
services:
  api:
    build:
      context: .
      dockerfile: .docker/Dockerfile
    image: laravel-docker
    ports:
      - 8080:80
    links:
      - mysql
    volumes:
      - .:/srv/app
    environment:
      DB_HOST: mysql
      DB_DATABASE: test
      DB_USERNAME: test
      DB_PASSWORD: test
  mysql:
    image: mysql:5.7
    ports:
      - 13306:3306
    environment:
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: root

将“环境”部分添加到yml文件的api部分。这有帮助。并更改了端口,使其具有与内部端口不同的外部端口。不是100%哪个部分使它工作正常,但它现在工作正常,我不打算再做更多的更改。

嗯,它现在工作了,有点像。我现在可以从浏览器而不是命令行使用它,我可以使用命令行。从上面的评论来看,问题似乎在于缺少一个连接api和数据库的“链接”部分。env文件未更改,但docker-compose.yml现在看起来如下所示:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=root
version: '3'
services:
  api:
    build:
      context: .
      dockerfile: .docker/Dockerfile
    image: laravel-docker
    ports:
      - 8080:80
    depends_on:
      - mysqldb
    volumes:
      - .:/srv/app
    # container_name:
  mysqldb:
    image: mysql:5.7
    container_name: mysqldb
    command: mysqld --user=root --verbose
    volumes:
       - ./schemadump.sql:/docker-entrypoint-initdb.d/schemadump.sql
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
version: '3'
services:
  api:
    build:
      context: .
      dockerfile: .docker/Dockerfile
    image: laravel-docker
    ports:
      - 8080:80
    links:
      - mysql
    volumes:
      - .:/srv/app
    environment:
      DB_HOST: mysql
      DB_DATABASE: test
      DB_USERNAME: test
      DB_PASSWORD: test
  mysql:
    image: mysql:5.7
    ports:
      - 13306:3306
    environment:
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: root

将“环境”部分添加到yml文件的api部分。这有帮助。并更改了端口,使其具有与内部端口不同的外部端口。不是100%哪一部分使它工作正常,但它目前工作正常,我不打算对其进行更多更改。

为什么不使用link链接api和mysqldb服务。在api上添加链接,以便它可以访问mysqldb。目前,我正在使用link连接docker上运行的多个服务,但将来可能会被弃用future@TaraPrasadGurung谢谢这帮助我认识到我使用的新.yml文件的不同之处!缺少的“link”部分一定是问题所在。为什么不使用link链接api和mysqldb服务。在api上添加链接,以便它可以访问mysqldb。目前,我正在使用link连接docker上运行的多个服务,但将来可能会被弃用future@TaraPrasadGurung谢谢这帮助我认识到我使用的新.yml文件的不同之处!丢失的“链接”部分一定是问题所在。