无法在docker中的mysql容器和php之间建立连接

时间:2019-01-27 21:37:44

标签: php mysql docker

尝试从php:最新映像(没有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 workbench或DataGrid毫无问题地进行连接:

  

服务器:localhost用户: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:我在Mac上使用docker

经过5个小时的研究,我真的不知道该怎么办,并且由于我不是Docker专家,所以希望能为我指出修复的方向。

谢谢!

2 个答案:

答案 0 :(得分:1)

能够找到解决方案。事实证明,在启动php脚本之前,我需要等待mysql服务可用。因此,我使用了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"

感谢您的帮助

答案 1 :(得分:0)

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

您必须通过容器名称进行连接。或docker inspect您的mysql容器并获得容器IP。例如,使用docker-compose

database:
    container_name: mysql

现在,您的mysql数据库主机为mysql-容器名称为localhost