我正在尝试使用多个容器配置来运行一个站点 - 一个用于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
答案 0 :(得分:1)
使用docker inspect [container name]
检查容器IP,但在文件中写入IP不是很好。按数据库容器的名称替换IP。
答案 1 :(得分:1)
您始终可以将__len__
用作IP,因此可以使用以下内容:
array.array.__len__(self) - 1
答案 2 :(得分:0)
查看Web服务容器内的/etc/hosts
配置以获取容器链接。
docker exec -it <container_name> cat /etc/hosts
Docker网络不会将相同的IP分配给您始终为MYSQL_HOST指定的数据库容器。因此,最好使用conatiner名称以便从Web容器连接。
另外,根据您在docker-compose.yml中指定的上下文,试试这个:
new mysqli('etc/mysql', $user, $pass, $database, $port);
答案 3 :(得分:0)
将所有内容放入 .env
文件并从那里调用环境变量。
如果您将其编写为:
$mylink = mysqli_connect(env("DB_HOST"), env("DB_USER"), env("DB_PASS"), env("DB_NAME"), env("DB_PORT",3306)))