【问题标题】:PHP container can't connect to MySQL containerPHP 容器无法连接到 MySQL 容器
【发布时间】:2020-01-20 14:05:12
【问题描述】:

我正在尝试从 PHP 容器连接到容器化 MySQL DB,尽管所有容器都在同一个网络上,但问题是当我点击http://localhost:8080/dbTest.php 时,我一直收到Connection failed: invalid data source name,尽管我已经检查过凭据是否正确demo DB 使用mysql -u root -p

我在 mysql 日志中看到此消息 mbind: Operation not allowed 可能相关吗?
谢谢

Apache Dockerfile

FROM httpd:latest
RUN apt-get update
RUN apt-get upgrade
COPY demo.apache.conf /usr/local/apache2/conf/demo.apache.conf
RUN echo "Include /usr/local/apache2/conf/demo.apache.conf"  >> /usr/local/apache2/conf/httpd.conf

cmddocker run -p 8080:80/tcp -v /home/hmalabeh/tutorial/docker/lamp/files/:/usr/local/apache2/htdocs/ - -link=php --name apache --network backend -i 8f704f51962d


PHP Dockerfile

FROM php:7.2.7-fpm-alpine3.7
RUN docker-php-ext-install mysqli
RUN docker-php-ext-enable mysqli
RUN docker-php-ext-install pdo pdo_mysql
EXPOSE 9000

cmd: docker run -p 9000:9000 -v /home/hmalabeh/tutorial/docker/lamp/files/:/var/www/html/ --name php - -网络后端 -i 1cc049496b03


MySQL Dockerfile

FROM mysql:latest
RUN apt-get update
RUN apt-get upgrade
ENV MYSQL_ROOT_PASSWORD=root

cmddocker run -p 3306:3306 -p 33060:33060 --name mysql --network backend --link=php -i 7bb7d4985301


dbTest.php

<?php
class DBConnect
{
    private $dsn = "mysql:dbname=demo;host=127.0.0.1;port=3306;";
    private $dbUsername = "root";
    private $dbPassword = "root";
    private $conn;

    public function connect()
    {
        try {
            echo 'Attempt Connection.     ';
            $this->conn = new PDO($dsn, $dbUsername, $dbPassword);

            echo 'Connected successfully.      ';
        } catch (PDOException $exception) {
            echo 'Connection failed: ' . $exception->getMessage();
        }
        return $this->conn;
    }
}


$co = new DBConnect();
$co->connect();
?>

我正在运行的容器

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                              NAMES
9639160c0824        8f704f51962d        "httpd-foreground"       2 hours ago         Up 2 hours          0.0.0.0:8080->80/tcp                               apache
38e630a9cb01        7bb7d4985301        "docker-entrypoint.s…"   2 hours ago         Up 2 hours          0.0.0.0:3306->3306/tcp, 0.0.0.0:33060->33060/tcp   mysql
c7f6e8db26a9        1cc049496b03        "docker-php-entrypoi…"   2 hours ago         Up 2 hours          0.0.0.0:9000->9000/tcp                             php

【问题讨论】:

  • 127.0.0.1localhost 在 Docker 中几乎总是意味着“这个容器”。
  • 如果某个答案解决了您的问题,请考虑接受该答案。以下是meta.stackexchange.com/questions/5234/… 然后返回此处并对勾号/复选标记执行相同操作直到它变为绿色的方法。这通知社区,找到了解决方案。否则,其他人可能会认为问题仍然悬而未决,可能想要发布(更多)答案。您将获得积分,并鼓励其他人帮助您。 欢迎来到 Stack!
  • @DavidMaze 为解决我的连接问题(redis 和 mysql)而受苦的日子以您的小评论结束;非常感谢

标签: php mysql apache docker dockerfile


【解决方案1】:

使用容器名称将host 添加到 DSN,因为它们位于同一网络中:

private $dsn = "mysql:host=mysql;dbname=demo;port=3306;";

Reference

【讨论】:

  • @HassanMalabeh 你确定他们都在同一个网络中吗?
  • 运行命令docker network inspect backend可以看到这三个容器在同一个网络上。
  • 你运行的是什么版本的 Docker @HassanMalabeh?
  • 这是我使用的版本Docker version 19.03.2, build 6a30dfc
  • 我刚刚检查过,我能够在使用 MySQLi 和 PDO 的同一网络中仅使用容器名称连接到容器(这里是 PDO $dbh = new PDO('mysql:host=mysql5725;dbname=grocery;charset=utf8', USER, PASS); 所以一定有问题与您的网络。
【解决方案2】:

您是否在 mySql 中启用了远程访问?

纳米/etc/mysql/mysql.conf.d/mysqld.cnf

替换: bind-address= 127.0.0.1 为了 bind-address= 0.0.0.0

【讨论】:

  • 感谢您的帮助,但这也没有解决问题。
  • 请检查:- root@01c710675b48:/# mysqld --verbose --help | grep bind-address ` --bind-address=name 要绑定的 IP 地址。语法:地址[,地址]...,` ` --mysqlx-bind-address[=name] ` bind-address 0.0.0.0 mysqlx-bind-address 0.0.0.0
【解决方案3】:

我忘记在变量前添加$-&gt;this,代码应该如下所示。

<?php
class DBConnect
{
    private $dsn = "mysql:host=mysql;dbname=demo;port=3306;charset=utf8";
    private $dbUsername = "root";
    private $dbPassword = "root";
    private $conn;

    public function connect()
    {
        try {
            echo 'Attempt Connection.     ';
            $this->conn = new PDO($this->dsn, $this->dbUsername, $this->dbPassword);

            echo 'Connected successfully.      ';
        } catch (PDOException $exception) {
            echo 'Connection failed: ' . $exception->getMessage();
        }
        return $this->conn;
    }
}


$co = new DBConnect();
$co->connect();
?>

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 2020-02-25
    • 2020-12-30
    • 2020-07-29
    • 1970-01-01
    • 2022-01-22
    • 2019-11-25
    • 1970-01-01
    • 2020-03-28
    相关资源
    最近更新 更多