正在尝试从另一个容器连接到一个停靠的MYSQL数据库



我创建了一个数据库,其中包含以下docker组成文件:

version: '3.8'
services:
php-apache-environment:
container_name: php-apache
build:
context: ./php
dockerfile: Dockerfile
depends_on:
- db
volumes:
- ./php/src:/var/www/html/
ports:
- 8000:80
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- '8080:80'
restart: always
environment:
PMA_HOST: db
depends_on:
- db
db:
container_name: db
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: MYSQL_ROOT_PASSWORD
MYSQL_DATABASE: MYSQL_DATABASE
MYSQL_USER: MYSQL_USER
MYSQL_PASSWORD: MYSQL_PASSWORD
ports:
- "9906:3306"

我正试图从另一个容器连接到它,运行如下所示的连接测试:

$conn = new mysqli(192.168.208.2, 'MYSQL_USER', 'MYSQL_PASSWORD', 'MYSQL_DATABASE', 9906);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
} else {
echo "Connected to MySQL server successfully!";
}

我已经使用docker inspect(容器id(访问了运行数据库的容器的IP地址,该容器在端口9906:3306运行"db"。然而,在尝试各种端口时,我经常会遇到以下错误:

Warning: mysqli::__construct(): (HY000/2002): Connection timed out in /var/www/html/index.php on line 12

我是不是做了一些根本不正确的事情?任何帮助都将不胜感激。

解决方案是在PHP代码中用db替换192.168.208.2

解释:每个容器就像一个封闭的小盒子,docker compose创建了一个小的"世界;其中这些盒子通过名称(服务名称(相互知道,并且可以连接到彼此的端口。容器不知道它们的世界(您的计算机主机(之外是什么。他们看到的只是其他的小盒子。为了正确理解隔离的概念,想象自己是这些盒子中的一员会有所帮助。

出于这个原因,你也可以删除这个:

ports:
- "9906:3306"

这就是";门户";从集装箱的世界到外面。因此,只有当您想从主机连接到数据库(例如MySQL Workbench客户端(时,它才有用。

最新更新