好的,事情是这样的:我使用Docker-Compose创建了3个服务:一个用于平台,一个用于db (mysql),第三个用于PHPMyAdmin
我正在尝试使用mysqli连接到端口5001上的数据库。
有趣的是,我可以使用SQL Workbench和PHPMyAdmin以相同的参数连接到数据库,但在使用PHP MySQLi连接时出现错误(如下所示
平台:
$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT);
主机是127.0.0.1,DB_USER是根用户,使用相应的密码,我提供了一个DB_Name,端口是5001。
我的Docker-Compose.yml如下所示:
version: '3.3'
services:
platform:
build: .
ports:
- "5000:80"
links:
- db:mysql
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
ports:
#- "5001:80"
- "5001:3306"
environment:
MYSQL_ROOT_PASSWORD: some_great_password_here
MYSQL_DATABASE: DB_NAME_HERE
MYSQL_USER: USERNAME
MYSQL_PASSWORD: PASSWORD
phpmyadmin:
image: phpmyadmin/phpmyadmin
links:
- db:mysql
ports:
- 8181:80
environment:
MYSQL_USERNAME: USERNAME
MYSQL_ROOT_PASSWORD: PASSWORD
volumes:
db_data:
由于某些原因,我一直收到以下错误:
mysqli::mysqli(): (HY000/2003): Can't connect to MySQL server on '127.0.0.1' (111) in ...
任何技巧或解决方案都将不胜感激!
发布于 2018-07-31 00:08:54
在翻阅了文档和其他Stackoverflow帖子后,我找到了解决问题的方法。
当尝试从容器内部连接到数据库时,我们需要使用容器/服务名称,而不是'localhost‘或127.0.0.1。这是因为当我们调用"localhost“时,它会在每个容器中查找localhost。我们需要通过网桥连接到不同容器中的MySQL数据库。
我们做到这一点的方法是简单地将容器名称别名为主机,这样:
$db = new mysqli("db", DB_USER, DB_PASS, DB_NAME, DB_PORT);
请注意,Hostname是容器名称"db“,如docker-compose.yml文件中所定义。这是因为在容器之间创建了docker网桥。该端口是默认的MySQL端口3306。
但是,重要的是要注意,如果我们想使用像Sequel Pro或Workbench这样的“外部”应用程序来连接到数据库,我们可以使用localhost或127.0.0.1来连接到数据库,因为我们不是直接处理容器。然而,需要注意的是,默认端口3306在这种情况下将不起作用。我们需要用3306映射一个外部端口。在我的例子中,应该是5001,如我的docker-compose.yml文件所示。
发布于 2018-07-28 09:39:06
您已将mysql端口映射到3306
- "5001:3306"
您应该尝试使用端口3306而不是5001进行连接。确保您的容器正在使用Bridge Networking,以便它们彼此通信。
$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, 3306);
https://stackoverflow.com/questions/51566115
复制相似问题