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

Deo*_*nna 0 php mysql mysqli docker docker-compose

好的,事情是这样的:我正在使用 Docker-Compose 创建 3 个服务:一个用于平台,一个用于 db (mysql),第三个用于 PHPMyAdmin

\n\n

我正在尝试使用 mysqli 连接到端口 5001 上的数据库。

\n\n

\xe2\x80\x99s 有趣的是,我可以使用具有相同参数的 SQL Workbench 和 PHPMyAdmin 连接到数据库,但是在使用 PHP MySQLi 连接时出现错误(如下所示)

\n\n

平台:

\n\n
  $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT);\n
Run Code Online (Sandbox Code Playgroud)\n\n

主机是 127.0.0.1,DB_USER 是 root 及其各自的密码,我提供了 DB_Name,端口是 5001。

\n\n

我的 Docker-Compose.yml 如下所示:

\n\n
version: \'3.3\'\n\nservices:\n  platform:\n    build: .\n    ports:\n      - "5000:80"\n    links:\n      - db:mysql\n\n  db:\n     image: mysql:5.7\n     volumes:\n       - db_data:/var/lib/mysql\n     restart: always\n     ports:\n       #- "5001:80"\n       - "5001:3306"\n     environment:\n       MYSQL_ROOT_PASSWORD: some_great_password_here\n       MYSQL_DATABASE: DB_NAME_HERE\n       MYSQL_USER: USERNAME\n       MYSQL_PASSWORD: PASSWORD\n\n  phpmyadmin:\n    image: phpmyadmin/phpmyadmin\n    links:\n      - db:mysql\n    ports:\n      - 8181:80\n    environment:\n      MYSQL_USERNAME: USERNAME\n      MYSQL_ROOT_PASSWORD: PASSWORD\n\nvolumes:\n    db_data:\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于某种原因,我不断收到错误:

\n\n
mysqli::mysqli(): (HY000/2003): Can\'t connect to MySQL server on \'127.0.0.1\' (111) in ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

Deo*_*nna 5

在翻阅文档和其他 Stackoverflow 帖子后,我找到了问题的解决方案。

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

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

$db = new mysqli("db", DB_USER, DB_PASS, DB_NAME, DB_PORT);
Run Code Online (Sandbox Code Playgroud)

请注意,主机名是容器名称“db”,如 docker-compose.yml 文件中所定义。这是因为在容器之间创建了 docker 网桥。该端口是 MySQL 默认端口 3306。

但值得注意的是,如果我们想使用像 Sequel Pro 或 Workbench 这样的“外部”应用程序来连接到数据库,我们可以使用 localhost 或 127.0.0.1 来连接到数据库,因为我们不直接处理容器。但需要注意的是,默认端口 3306 在这种情况下将不起作用。我们需要将外部端口映射为 3306。在我的例子中,该端口为 5001,如我的 docker-compose.yml 文件中所示。