Docker PHP MySQL连接被拒绝

我想运行一个站点使用多个容器configuration – 一个用于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 

.envvariables:

 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与docker inspect [container name]但写在一个文件中的IP不是很好。 用您的数据库容器的名称replaceIP。

查看您的Web服务容器内的/etc/hostsconfiguration以进行容器链接。

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

Dockernetworking将不会为您为MYSQL_HOST指定的db容器始终分配相同的IP。 所以更好的使用conatiner的名字来连接web容器。

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

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