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
相关产品推荐
相关产品推荐

