通过 PDO 在 docker 容器上连接到 Mysql 时出现问题,但命令行有效

我的问题的简要总结:我的 docker-compose 的什么特征与 PDO 发生冲突,通过 PDO 阻止 Host -> mysql-docker,但允许来自所有其他工具的 Host -> mysql-docker?


我的应用程序的配置文件:


database:

  host: mysql

  port: 3306

  name: <name>

  username: <username>

  password: <pass>

  outsideContainerConnections:

    host: 127.0.0.1

    port: 3307

容器内一切正常,我可以在命令行上使用 PHPStorm 或 Mysql 从主机访问数据库。


如果我从主机运行此命令,它会连接


mysql --port=3307 -h 127.0.0.1 -u <username> -p

但是,如果我尝试使用 PDO 从主机上的 php 连接,则会失败


PDOException: SQLSTATE[HY000] [2002] 连接被拒绝


我尝试过的 PDO DSN:


mysql:host=127.0.0.1:3307;port=;dbname=<name>;&charset=utf8;

    or

mysql:host=127.0.0.1;port=3307;dbname=<name>;&charset=utf8;

    or

mysql:host=127.0.0.1:3307;dbname=<name>;&charset=utf8;

我已经阅读了有关使用 localhost 与 127.0.0.1 强制 TCP 的信息,我在这里这样做。


这也是我的 docker-composer 的相关部分。同样,使用主机中的命令行或其他工具可以正常工作,似乎只有 PDO 有问题。值得一提的是,docker-compose 网络中另一个容器上的 PDO 正在运行。


mysql:

  build: './mysql_docker'

  command: --lower_case_table_names=0

  ports:

    - '3307:3306'

  volumes:

    - ./volumes/mysql:/var/lib/mysql

    - ./volumes/my.cnf:/etc/my.cnf

  networks:

    - app-tier

感谢您的阅读。


慕尼黑的夜晚无繁华
浏览 170回答 2
2回答

富国沪深

我已经解决了——它很简单,但希望是一个很好的教训。在一种情况下,PHP 文件由 cron 运行,因此它在本地运行,在 docker 容器之外。我的文件中有一个小语法或其他错误,因此 cron 遇到了一些问题。为了调试这种情况,我在我的网络浏览器中打开了文件——这就是关键。我在 Web 浏览器中看到的连接错误与 cron 遇到的问题不同,因为该页面是由 docker 容器提供的。因此,连接细节必须不同。相同的设置不能同时从主机和邻居容器工作。我学到的是这个;似乎是一个非常令人头疼的技术问题,需要大量的人工阅读和研究,这可能是一个简单的错误假设。有时值得回到绘图板上,从头开始勾勒出情况的轮廓。在某种程度上,这就是我提出这个问题时所做的,所以感谢您提供空间。

慕后森

如果没有,请从客户端尝试“mysql --port=3307 -h 127.0.0.1 -u -p”
打开App,查看更多内容
随时随地看视频慕课网APP