运行docker exec时如何映射端口?Windows容器内Laravel测试连8000被拒
问题解决
核心原因梳理
你遇到的连接拒绝本质是「访问地址指向的环境,没有运行监听8000端口的Laravel服务」,和docker exec无关:docker exec只是进入已经运行的容器执行命令的工具,本身不支持也不需要配置端口映射,端口映射只能在容器启动时通过docker run -p参数配置。
另外先明确两个概念的区别:
EXPOSE是Dockerfile里的声明性配置,仅用来标注容器预期使用的端口,没有实际网络控制效果,不配置也不影响端口使用Publish(即-p参数)是将容器端口映射到宿主机端口的实际配置,只有需要宿主机/外部网络访问容器端口时才需要配置
分场景解决
场景1:Laravel服务运行在容器内部
这是最常见的场景,你不需要配置任何端口映射即可解决问题:
- 先执行
docker exec -it crawler-php bash进入容器 - 在容器内执行命令启动Laravel开发服务,必须指定监听
0.0.0.0避免只能本地回环访问:
php artisan serve --host=0.0.0.0 --port=8000
- 保持这个终端不关闭,新开一个终端再次exec进入容器,执行phpunit测试即可。如果是Laravel Dusk测试,额外确认你的测试环境配置文件(比如
.env.dusk.local)里的APP_URL参数值为http://127.0.0.1:8000即可。
如果后续需要在Windows宿主机访问容器内的8000端口,你需要销毁当前容器,重新执行run命令时添加端口映射参数:
docker run -p 8000:8000 [你的其他原有启动参数] crawler-php
场景2:Laravel服务运行在Windows宿主机上
如果你的Laravel服务本身是在宿主机启动的,只需要把测试代码里WebDriver初始化的地址从http://localhost:8000改为http://host.docker.internal:8000即可,Docker Desktop for Windows会自动将这个域名解析到宿主机的本地地址,不需要额外配置端口映射。
内容的提问来源于stack exchange,提问作者Tomk07
相关产品推荐
相关产品推荐

