繁体   English   中英

Docker-使用PHP(MySQLi)连接到MySQL数据库

[英]Docker-Compose Using PHP (MySQLi) to Connect to MySQL database

好的,这就是问题所在:我正在使用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是具有各自密码的root用户,我提供了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 ...

任何提示或解决方案将不胜感激!

您已将mysql端口映射为3306

- "5001:3306"

您应该尝试在端口3306而不是5001上进行连接。请确保您的容器使用网桥网络来使它们彼此通信。

$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, 3306);

在浏览文档和其他Stackoverflow帖子之后,我找到了解决问题的方法。

尝试从容器内部连接到数据库时,我们需要使用容器/服务名称,而不是“ localhost”或127.0.0.1。 这是因为当我们调用“ localhost”时,它正在每个容器内寻找localhost。 我们需要通过网桥连接到不同容器内的MySQL数据库。

我们这样做的方法是简单地将容器名称作为主机的别名,例如:

$db = new mysqli("db", DB_USER, DB_PASS, DB_NAME, DB_PORT);

请注意,主机名是容器名称“ db”,如docker-compose.yml文件中所定义。 由于容器之间创建了docker网络桥,因此可以使用。 该端口是默认的MySQL端口3306。

但是,需要特别注意的是,如果我们要使用Sequel Pro或Workbench之类的“外部”应用程序来连接数据库,则可以使用localhost或127.0.0.1来连接数据库,因为我们没有直接处理容器。 但是应注意,在这种情况下默认端口3306不起作用。 我们需要使用3306映射一个外部端口。在我的情况下,该端口应为5001,如我的docker-compose.yml文件所示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM