【问题标题】:Docker PHP MySQL connection refusedDocker PHP MySQL连接被拒绝
【发布时间】:2018-06-08 04:20:20
【问题描述】:

我正在尝试使用多个容器配置运行一个站点 - 一个用于 apache,第二个用于 mysql,第三个用于 myadmin。一切正常,安装程序运行顺利,但是当我尝试运行 PHP 应用程序时,我收到 mysqli::__construct(): (HY000/2002): Connection refused in system/libraries/drivers/Database/Mysqli.php [54] 错误。

似乎连接设置有问题,但我通过在单独容器上运行的 PHP MyAdmin 检查了站点,并从那里复制了数据库主机 IP 以确保安全。我/应该如何从 PHP 容器连接到 MySQL 数据库?

这是我的docker-compose.yml 文件:

version: '3'
services:
  web:
    build:
      context: ./etc/php
      args:
         - APP_HOST=${APP_HOST}
         - MYSQL_USER=${MYSQL_USER}
         - MYSQL_PASSWORD=${MYSQL_PASSWORD}
         - MYSQL_PORT=${MYSQL_PORT}
         - MYSQL_DATABASE=${MYSQL_DATABASE}
    ports:
      - ${APP_PORT}:80
      - ${APP_PORT_SSL}:443
    volumes:
      - ./var/bin/:/tmp/bin/
      - ./app/:/var/www/html/
      - ./log/apache2/:/var/log/apache2/
      - ./etc/php/conf/:/usr/local/etc/php/conf.d/
    environment:
      - VIRTUAL_HOST=${VIRTUAL_HOST}
  db:
    build:
      context: ./etc/mysql
      args:
        - MYSQL_DATABASE=${MYSQL_DATABASE}
        - MYSQL_USER=${MYSQL_USER}
        - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
        - DUMP_FILE=${DUMP_FILE}
    volumes:
      - ./etc/mysql/conf:/etc/mysql/conf/conf.d
      - ./data:/var/lib/mysql
      - ./log/:/var/log/
    ports:
      - "${MYSQL_PORT}:3306"
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports:
      - ${MYADMIN_PORT}:80
    environment:
      - VIRTUAL_HOST=phpmyadmin.localhost

还有带有变量的.env

VIRTUAL_HOST=foo.local

APP_PORT=80
APP_PORT_SSL=443
MYADMIN_PORT=8081

APP_HOST=foo.local
ADMIN_APP_HOST=admin-foo.local

MYSQL_DATABASE=foo_local
MYSQL_USER=root
MYSQL_HOST=172.26.0.2
MYSQL_PASSWORD=root
MYSQL_ROOT_PASSWORD=root
MYSQL_PORT=3306

哦,这是我尝试运行的代码:

 $this->link = $socket ? new mysqli(null, $user, $pass, $database, $port, $socket) :
new mysqli($host, $user, $pass, $database, $port);

echo $host.'<br>'.$user.'<br>'.$pass.'<br>'.$database.'<br>'.$port.'<br>'.$socket; 的输出如下:

172.26.0.2
root
root
hq_local
3306

【问题讨论】:

  • 你检查过数据库容器的IP地址吗?

标签: php mysql docker mysqli docker-compose


【解决方案1】:

使用docker inspect [container name] 检查您的容器 IP,但将 IP 写入文件不是很好。用您的数据库容器的名称替换 IP。

【讨论】:

  • 好的。 IP错了。我从myadmin 面板复制了它......但是容器名称确实是更好的主意。我可以使用docker-compose.yml 的名称代替docker ps 给出的名称吗?
  • 是的,您可以使用来自 docker-compose.yml 的名称
【解决方案2】:

您始终可以使用host.docker.internal 作为 IP,因此您可以使用如下内容:

$db = new \PDO('mysql:host=host.docker.internal;port=3306;dbname=db', 'root', 'pass');

【讨论】:

    【解决方案3】:

    查看 Web 服务容器内的 /etc/hosts 配置以进行容器链接。

    docker exec -it <container_name> cat /etc/hosts
    

    Docker 网络不会一直为您为 MYSQL_HOST 指定的 db 容器分配相同的 IP。所以最好使用容器名称以便从 Web 容器连接。

    另外,根据您在 docker-compose.yml 中指定的上下文,试试这个:

    new mysqli('etc/mysql', $user, $pass, $database, $port);
    

    【讨论】:

      【解决方案4】:

      将所有内容放入.env 文件并从那里调用环境变量。如果您将其编写为,请不要担心更改代码:

      $mylink = mysqli_connect(
          env("DB_HOST"),
          env("DB_USER"),
          env("DB_PASS"),
          env("DB_NAME"),
          env("DB_PORT",3306)
      )
      

      【讨论】:

        【解决方案5】:

        你需要做的就是在mysql中指定主机的值,官方环境变量是MYSQL_ROOT_HOST: localhost,如果你不这样做,那么主机将成为服务的名称,在你的情况下它是db .

        【讨论】:

          猜你喜欢
          • 2020-07-04
          • 2020-10-07
          • 1970-01-01
          • 2020-01-19
          • 2016-03-08
          • 2020-10-08
          • 1970-01-01
          • 2021-06-24
          • 1970-01-01
          相关资源
          最近更新 更多