Docker容器连接MariaDB的IP权限与网络问题咨询
Docker容器连接主机MariaDB的权限与网络疑问
背景与环境配置
我是MariaDB和Docker新手,需将Laravel 5网站升级至10.x,但Laravel 10.x依赖的PHP 8.2无法从官方仓库直接获取,尝试安装后无法使用phpmyadmin。因此保留本地正常运行的apache/php7.4/mariadb/phpmyadmin环境及现有数据库,通过Docker容器搭建PHP 8.2环境。
生成PHP 8.2镜像的Dockerfile
FROM php:8.2-apache # Set working directory WORKDIR /var/www/html # 安装Laravel与MariaDB通信所需的PDO及PDO MySQL扩展 RUN docker-php-ext-install pdo pdo_mysql # 将Laravel项目文件复制到容器内 COPY . /var/www/html # 安装依赖工具 RUN apt-get update && apt-get install -y git zip unzip && rm -rf /var/lib/apt/lists/* # 安装Composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # 安装Laravel依赖 RUN composer install ### 无用配置### # Expose the port # EXPOSE 80 # Start Apache server # CMD ["apache2-foreground"]
启动容器的命令
sudo docker run --rm -it --name php_container -v $(pwd):/var/www/html -p 8000:8000 php8-2_laravel10_image php artisan serve --host=0.0.0.0 --port=8000
测试与问题现象
容器启动后Laravel欢迎页可正常显示,但始终出现Mysql Connection refused错误。编写了如下测试脚本test.php:
<?php $host = '172.17.0.1'; // Docker bridge network IP #$host = "localhost"; $port = 3306; // MySQL port $your_db_name = "awesomeDB"; $your_db_username = "user"; $your_db_password = "password"; try { $conn = new PDO("mysql:host=$host;port=$port;dbname=$your_db_name", $your_db_username, $your_db_password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Connected successfully!"; } catch (PDOException $e) { echo "Connection failed: " . $e->getMessage(); }
通过命令在容器内执行该脚本:
docker exec -it php_container php test.php
通过命令docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' php_container获取到容器IP为172.17.0.2,并在Debian主机的MariaDB中执行了授权:
mysql -u root -p
随后执行:
GRANT ALL PRIVILEGES ON *.* TO 'user'@'172.17.0.2' IDENTIFIED BY 'password';
和FLUSH PRIVILEGES
出现以下困惑现象:
test.php中填写网关IP172.17.0.1可成功连接数据库,若填写容器IP172.17.0.2则报错连接拒绝- 主机上能ping通
172.17.0.1和172.17.0.2,但docker container ps仅显示一个运行中的容器
核心疑问
- 为何容器使用网关IP(172.17.0.1)连接主机MariaDB,却能通过授权给容器IP(172.17.0.2)的权限访问?
- 主机
ifconfig显示docker0的inet为172.17.0.1,为何还能ping通容器的172.17.0.2?
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

