Docker PHP MySQL连接被拒绝

问题描述 投票:1回答:2

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

似乎连接设置有问题,但我通过在单独容器上运行的PHP MyAdmin检查了网站,并从那里复制了db主机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
php mysql docker mysqli docker-compose
2个回答
1
投票

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


0
投票

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

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

Docker网络不会将相同的IP分配给您始终为MYSQL_HOST指定的db容器。因此,最好使用conatiner名称以便从Web容器连接。

此外,根据您在docker-compose.yml中指定的上下文,请尝试以下操作:

new mysqli('etc/mysql', $user, $pass, $database, $port);
© www.soinside.com 2019 - 2024. All rights reserved.