Docker部署Laravel执行php artisan migrate报getaddrinfo域名解析错误
问题根因
你的报错核心是php容器无法通过容器名docker_database解析到数据库服务的地址,主要有两个常见原因:
- 数据库服务未加入php所在的自定义网络
- 执行迁移命令的环境不对/配置未生效
具体解决步骤
第一步:修正docker-compose.yml的网络配置
你当前配置里只有nginx、php服务加入了自定义的laravel桥接网络,database服务没有指定网络,Docker会默认将它放到全局默认的bridge网络,和php服务网络隔离,自然无法通过容器名互访。在database服务的配置块中添加网络配置即可:database: image: mysql:8.0 container_name: docker_database # 保留你原来的所有配置,新增下面两行 networks: - laravel第二步:重启Docker服务加载配置
执行以下命令重启所有容器:docker-compose down && docker-compose up -d第三步:验证网络连通性
进入php容器测试是否能解析到数据库地址:docker exec -it my_app ping docker_database正常返回ping的响应包说明网络已经打通。
第四步:清除Laravel配置缓存后执行迁移
先清理旧的配置缓存,再执行迁移命令:docker exec -it my_app php artisan config:clear docker exec -it my_app php artisan migrate
补充说明
你本地Sequel Pro能正常连接,是因为你访问的是宿主机的127.0.0.1:3306端口(Docker已经把数据库的3306端口映射到宿主机了),和容器内的网络访问逻辑不同,所以才会出现本地能连、容器内连不上的情况。
如果后续网络通了之后报认证错误,是因为MySQL8.0默认使用caching_sha2_password认证插件,部分PHP版本不支持,只需要在database服务的environment配置中新增一行MYSQL_DEFAULT_AUTHENTICATION_PLUGIN=mysql_native_password,重启容器即可。
内容的提问来源于stack exchange,提问作者oluwatyson
相关产品推荐
相关产品推荐

