You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下PHP容器连接MariaDB容器提示‘名称或服务未知’问题

问题详情

手动创建两个Docker容器:

  • 名为mariadb-1,运行mariadb:latest,端口映射3307:3306
  • 名为php-apache-1,运行php:apache,端口映射81:80

目标是通过PHP网页展示SQL表内容,但访问页面时出现以下错误:

Warning: mysqli::__construct(): php_network_getaddresses: getaddrinfo for mariadb-1 failed: Name or service not known in /var/www/html/display_data.php on line 9

Fatal error: Uncaught mysqli_sql_exception: php_network_getaddresses: getaddrinfo for mariadb-1 failed: Name or service not known in /var/www/html/display_data.php:9 Stack trace: #0 /var/www/html/display_data.php(9): mysqli->__construct('mariadb-1', 'root', Object(SensitiveParameterValue), 'test_db', 3307) #1 {main} thrown in /var/www/html/display_data.php on line 9

使用的PHP代码:

<?php
  $host = 'mariadb-1';
  $port = 3307;
  $username = 'root';
  $password = 'xxxxxxxx';
  $database = 'test_db';
  
  // Create a connection
  $conn = new mysqli($host, $username, $password, $database, $port);

  // Check for connection errors
  if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
  }
  
  // Query to fetch all entries from the table
  $query = "SELECT * FROM test_table";
  $result = $conn->query($query);
  
  // Check for query errors
  if (!$result) {
      die("Query error: " . $conn->error);
  }
  
  // Output the entries
  while ($row = $result->fetch_assoc()) {
      echo "ID: " . $row['id'] . " | Text: " . $row['text_field'] . "<br>";
  }
  
  // Close the connection
  $conn->close();
?>

当前排查情况:

  • Docker Desktop(M1 Mac)环境下,两个容器可互相ping通
  • 在php-apache-1容器内安装mariadb客户端后,用MariaDB容器的内部IP能成功连接数据库
  • 但PHP代码无论用容器名mariadb-1还是内部IP,均无法连接;更换端口为3306或省略端口参数,问题依旧
  • 未使用Docker Compose,为手动创建容器的学习实验
解决步骤

1. 确保容器在同一Docker网络

Docker默认bridge网络的容器名解析可能不稳定,建议使用自定义网络,或确保两个容器在同一网络:

  • 查看容器所在网络:
    docker inspect mariadb-1 | grep NetworkMode
    docker inspect php-apache-1 | grep NetworkMode
    
  • 若不在同一网络,将php容器连接到mariadb的网络:
    docker network connect <mariadb的网络名称> php-apache-1
    
  • 更稳妥的方式是创建自定义网络,重新启动两个容器:
    # 创建自定义网络
    docker network create my-app-net
    # 启动mariadb容器并加入自定义网络,同时允许外部连接
    docker run --name mariadb-1 --network my-app-net -p 3307:3306 -e MYSQL_ROOT_PASSWORD=你的密码 -d mariadb:latest --bind-address=0.0.0.0
    # 启动php-apache容器并加入自定义网络
    docker run --name php-apache-1 --network my-app-net -p 81:80 -v ./你的本地html目录:/var/www/html -d php:apache
    

2. 修正PHP连接端口

容器间通信使用容器内部的端口,而非宿主机映射的端口。MariaDB容器内部端口是3306,修改PHP代码中的端口参数:

$host = 'mariadb-1';
$port = 3306; // 或者直接省略该参数,mysqli默认使用3306

3. 安装PHP的mysqli扩展

php:apache镜像默认未安装mysqli扩展,需手动安装:

# 进入php容器
docker exec -it php-apache-1 bash
# 安装mysqli扩展
docker-php-ext-install mysqli
# 重启apache服务
apache2ctl restart

4. 确认MariaDB允许外部连接

确保MariaDB容器绑定了0.0.0.0(允许所有IP连接),启动容器时添加--bind-address=0.0.0.0参数(如步骤1中的命令),避免仅绑定127.0.0.1导致容器间无法连接。

内容的提问来源于stack exchange,提问作者teddyringo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:29:57