使用Docker host网络模式时无法从宿主机访问容器内Laravel开发服务
问题根因
- Docker Desktop(Mac/Windows版本)不原生支持
network_mode: host:该模式仅在Linux原生Docker环境下可直通宿主机网络栈,Mac/Windows平台的Docker运行在虚拟化Linux内核中,host模式只会绑定到虚拟化层的网络,不会暴露到宿主机本地网络。 - 默认
php artisan serve仅监听容器内的127.0.0.1回环地址,即使添加--host 0.0.0.0参数,也会因为host模式在非Linux平台不生效,导致端口无法被宿主机访问。
解决方案
方案1:改用端口映射(推荐,全平台兼容)
该方案适配Mac/Windows/Linux所有Docker运行环境,不需要依赖host模式:
- 修改docker-compose.yml配置,删除所有服务的
network_mode: host配置,给web服务添加端口映射规则:
version: '3' services: setup: image: mariadb:latest command: - mysql -u root -proot -e "CREATE DATABASE central;" web: image: waryor/laravel-8.0:latest volumes: - '..:/var/www/html' depends_on: - mariadb - redis stdin_open: true tty: true # 新增端口映射 ports: - "8000:8000" mariadb: image: mariadb:latest environment: MYSQL_ROOT_PASSWORD: 'root' MYSQL_DATABASE: 'central' MYSQL_USER: 'root' MYSQL_PASSWORD: 'root' restart: always # 可以按需添加端口映射供宿主机访问数据库 # ports: # - "3306:3306" redis: image: arm64v8/redis:alpine restart: always healthcheck: test: ["CMD", "redis-cli", "ping"] retries: 3 timeout: 5s
- 进入容器启动Laravel服务时指定监听0.0.0.0:
php artisan serve --host 0.0.0.0 - 宿主机直接访问
http://localhost.com:8000即可正常访问。
方案2:Linux宿主机保留host模式的修正方法
如果你使用Linux作为宿主机,network_mode: host可正常生效,只需执行以下操作即可:
启动Laravel服务时添加--host 0.0.0.0参数:php artisan serve --host 0.0.0.0
启动后直接在宿主机访问http://localhost.com:8000即可。
额外排查步骤
配置完成后可在宿主机执行netstat -an | grep 8000或lsof -i :8000确认8000端口处于监听状态,排除端口被其他进程占用的问题。
内容的提问来源于stack exchange,提问作者Felix D.
相关产品推荐
相关产品推荐

