繁体   English   中英

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

[英]Can't connect to between mysql container and php in 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

我已经在 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:

我的 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 专家,如果您能帮助我指明修复的方向,我将不胜感激。

谢谢!

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

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

database:
    container_name: mysql

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

能够找到解决方案。 原来我需要等待 mysql 服务可用,然后才能启动 php 脚本。 所以我使用了等待解决方案并在 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"

感谢您的帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM