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

Lin*_*oln 2 php mysql docker

尝试从 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
Run Code Online (Sandbox Code Playgroud)

我在 stackoverflow 上寻找了超过 20 个解决方案,但没有一个能够解决我的问题。我可以使用以下凭据使用 mysql Workbench 或 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:
Run Code Online (Sandbox Code Playgroud)

我的 conn.php:

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

到目前为止我所做的尝试解决这个问题:

  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 专家,因此希望能得到任何帮助来指出修复的方向。

谢谢你!

Tru*_*ang 6

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

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

database:
    container_name: mysql
Run Code Online (Sandbox Code Playgroud)

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