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

Docker容器内Laravel执行php artisan migrate无法连接宿主机MySQL

解决Docker容器内Laravel执行php artisan migrate连接宿主机MySQL失败的问题

排查方向及解决方案

1. 容器内环境变量未正确加载

通过docker exec进入容器时,可能未自动加载.env文件的配置,导致artisan无法读取数据库连接信息。

  • 执行命令时显式指定环境配置:
    php artisan migrate --env=local
    
    或者临时导出环境变量后执行:
    export DB_HOST=172.17.0.1 DB_PORT=33161 DB_DATABASE=laravel_db DB_USERNAME=laravel_user DB_PASSWORD=password && php artisan migrate
    

2. MySQL绑定地址限制

宿主机VM上的MySQL可能仅绑定了127.0.0.1,拒绝外部(容器)访问请求。

  • 修改MySQL配置文件(通常是/etc/mysql/mysql.conf.d/mysqld.cnf),将bind-address改为0.0.0.0,然后重启服务:
    sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
    # 修改 bind-address = 0.0.0.0
    sudo systemctl restart mysql
    
    同时为数据库用户授予容器网段的访问权限:
    GRANT ALL ON laravel_db.* TO 'laravel_user'@'172.17.0.%' IDENTIFIED BY 'password';
    FLUSH PRIVILEGES;
    
    (172.17.0.%限制仅Docker默认子网访问,比%更安全)

3. Docker网络网关IP变化

若容器使用自定义网络,172.17.0.1可能不是该网络的宿主机网关IP。

  • 查看容器所在网络的网关地址:
    docker inspect ContainerName | grep Gateway
    
    将.env中的DB_HOST替换为该网关IP,再执行迁移命令。

4. 宿主机防火墙拦截端口

宿主机VM的防火墙可能阻止了容器对33161端口的访问。

  • 开放对应端口:
    # Ubuntu/Debian 系统
    sudo ufw allow 33161/tcp
    # CentOS/RHEL 系统
    sudo firewall-cmd --add-port=33161/tcp --permanent
    sudo firewall-cmd --reload
    

5. 先验证容器内网络连通性

在容器内先测试基础网络是否正常,再排查数据库连接:

# 测试能否ping通宿主机
ping 172.17.0.1
# 测试端口是否可达(需容器内有telnet或nc)
telnet 172.17.0.1 33161
# 或用nc命令
nc -zv 172.17.0.1 33161

如果ping不通,检查Docker网络配置;如果端口不通,回到MySQL绑定地址或防火墙步骤排查。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:05:41