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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:37:38