【问题标题】:Can't connect to between mysql container and php in docker无法在 docker 中的 mysql 容器和 php 之间连接
【发布时间】:2019-01-27 21:37:43
【问题描述】:

尝试从 php:latest 映像(没有 apache 或 nginx)连接到 mysql 8 (mysql:latest),我收到了这个烦人的错误:

Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] Connection refused in /src/conn.php:5
Stack trace:
#0 /src/conn.php(5): PDO->__construct('mysql:host=data...', 'root', '12345678')
#1 {main}
  thrown in /src/conn.php on line 5

我在 stackoverflow 上找到了 +20 个解决方案,但没有一个能够解决我的问题。我可以使用以下凭据使用 mysql 工作台或 DataGrid 毫无问题地连接:

服务器:本地主机用户:root 密码:12345678

但是我在 php 图像上使用的任何配置都无法使它们相互连接。

我的 docker-compose 文件:

version: '3'
services:
  composer:
    container_name: composer
    networks:
      - backend
    image: composer
    volumes:
      - .:/app
    command: install
  database:
    container_name: mysql
    networks:
      - backend
    image: mysql:latest
    volumes:
      - ./database/mysqldata:/var/lib/mysql
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: 12345678
      MYSQL_DATABASE: testdb
    ports:
      - "3306:3306"
  php:
    build:
      context: .
    container_name: php
    networks:
      - backend
    image: php:apache
    links:
      - database
    env_file:
      - .env
    volumes:
      - .:/
    command:
      php /src/conn.php
    depends_on:
      - composer
      - database
networks:
  backend:

我的 conn.php:

<?php
    $db = new PDO('mysql:host=database;dbname=testdb', 'root', '12345678');

到目前为止我为解决问题所做的工作:

  1. 将 conn.php 主机改为 127.0.0.1
  2. 将 conn.php 主机更改为 localhost
  3. 尝试使用 mysqli(连接也被拒绝)
  4. 尝试了另一个 php 图片(使用 apache、nginx 等)
  5. 尝试使用mysql作为主机

PS:我正在使用 docker for mac

经过 5 个小时的研究,我真的不知道还能做什么,而且由于我不是 docker 专家,如果能帮助我指出修复的方向,我将不胜感激。

谢谢!

【问题讨论】:

  • 你可以试试127.0.0.1:3306 或localhost:3306 吗?
  • @OmerTekbiyik 得到一个不同的错误:致命错误:未捕获的 PDOException:SQLSTATE[HY000] [2002] 无法在 /src/conn.php:5 中分配请求的地址

标签: php mysql docker


【解决方案1】:

在您的情况下,您无法通过localhost 或127.0.0.1 连接到mysql。如果你这样连接。它调用 localhost inside php 容器。但是你的 php 容器中没有安装 mysql。

您必须通过容器名称连接。或者docker inspect你的mysql容器并获取容器IP。例如使用你的 docker-compose

database:
    container_name: mysql

现在您的 mysql 数据库主机是 mysql - 容器名称而不是 localhost

【讨论】:

  • 我确实尝试过这个我得到了同样的错误。看看我的 conn.php 我已经在尝试使用服务名或者容器名了
  • 我也尝试使用 docker inspect (172.21.0.2) 的 ip 并得到完全相同的错误
【解决方案2】:

能够找到解决方案。原来我需要等待 mysql 服务可用,然后再启动 php 脚本。所以我使用了wait-for-it 解决方案,并在 docker-compose 上做了这个:

 command: >
      bash -c "chmod +x /docker/./wait-for-it.sh
      && /docker/./wait-for-it.sh database:3306 -- echo 'database is up'
      && php phpscript.php"

感谢您的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2020-03-28
    • 1970-01-01
    • 2017-08-10
    • 2016-04-26
    • 2016-07-22
    • 2019-07-22
    • 2021-04-04
    相关资源
    最近更新 更多