Laravel Sail容器正常运行但无法通过浏览器访问0.0.0.0:8000
Laravel Sail 容器端口映射正常但宿主机无法访问应用
环境配置
项目使用 Laravel Sail 创建的 docker-compose.yml 配置如下:
services: app: build: context: ./vendor/laravel/sail/runtimes/8.2 dockerfile: Dockerfile args: WWWGROUP: '${WWWGROUP}' image: sail-8.2/app extra_hosts: - 'host.docker.internal:host-gateway' ports: - '${APP_PORT:-80}:80' - '${VITE_PORT:-5173}:${VITE_PORT:-5173}' environment: WWWUSER: '${WWWUSER}' LARAVEL_SAIL: 1 XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}' XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}' IGNITION_LOCAL_SITES_PATH: '${PWD}' volumes: - '.:/var/www/html' networks: - sail depends_on: - mysql mysql: image: 'mysql/mysql-server:8.0' ports: - '${FORWARD_DB_PORT:-3306}:3306' environment: MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' MYSQL_ROOT_HOST: '%' MYSQL_DATABASE: '${DB_DATABASE}' MYSQL_USER: '${DB_USERNAME}' MYSQL_PASSWORD: '${DB_PASSWORD}' MYSQL_ALLOW_EMPTY_PASSWORD: 1 volumes: - 'sail-mysql:/var/lib/mysql' - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh' networks: - sail healthcheck: test: - CMD - mysqladmin - ping - '-p${DB_PASSWORD}' retries: 3 timeout: 5s networks: sail: driver: bridge volumes: sail-mysql: driver: local
问题现象
- 已设置
APP_PORT=8000,宿主机访问http://0.0.0.0:8000或http://127.0.0.1:8000提示「This site can’t be reached」 docker container ls显示容器运行正常,端口映射正确:CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 663fc79a5338 sail-8.2/app "start-container" 23 minutes ago Up 23 minutes 0.0.0.0:5173->5173/tcp, :::5173->5173/tcp, 8000/tcp, 0.0.0.0:8000->80/tcp, :::8000->80/tcp app_name-app-1 7311792e085f mysql/mysql-server:8.0 "/entrypoint.sh mysq…" 23 minutes ago Up 23 minutes (healthy) 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060-33061/tcp app_name-mysql-1- 其他 Docker 项目可正常访问,已尝试更换端口、关闭防火墙、检查代理,均无效
排查细节
- 宿主机执行
php artisan serve --host=0.0.0.0可正常访问应用 - 容器内执行
curl 0.0.0.0:80能获取 Laravel 首页,宿主机执行curl 0.0.0.0:8000返回curl: (56) Recv failure: Connection reset by peer - 容器日志显示 PHP 开发服务器仅绑定到
localhost:80:usermod: UID '0' already exists 2024-01-05 22:33:56,718 INFO Set uid to user 0 succeeded 2024-01-05 22:33:56,722 INFO supervisord started with pid 1 2024-01-05 22:33:57,727 INFO spawned: 'php' with pid 10 [Fri Jan 5 22:33:58 2024] PHP 8.2.10 Development Server (http://localhost:80) started 2024-01-05 22:33:59,005 INFO success: php entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) 2024-01-05 22:43:16,632 INFO reaped unknown pid 27 (terminated by SIGKILL) 2024-01-05 22:43:16,633 INFO reaped unknown pid 26 (terminated by SIGKILL)
解决方案
核心问题是容器内的 PHP 开发服务器仅绑定了 localhost,无法接收容器外部的请求,需修改绑定地址为 0.0.0.0:
方法1:临时修改 Sail 配置(易被 composer 更新覆盖)
找到 vendor/laravel/sail/runtimes/8.2/supervisord.conf 文件,将其中的命令行:
command=php -S localhost:80 -t public
修改为:
command=php -S 0.0.0.0:80 -t public
修改后重启容器:
sail restart
方法2:自定义 Dockerfile(持久化修改,推荐)
- 在项目根目录创建
Dockerfile:FROM sail-8.2/app COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf - 复制
vendor/laravel/sail/runtimes/8.2/supervisord.conf到项目根目录,将其中的localhost:80改为0.0.0.0:80 - 更新
docker-compose.yml中app服务的build配置:app: build: context: . dockerfile: Dockerfile args: WWWGROUP: '${WWWGROUP}' - 重新构建并启动容器:
sail build --no-cache sail up -d
修改完成后,宿主机即可通过 http://127.0.0.1:8000 正常访问 Laravel 应用。
内容的提问来源于stack exchange,提问作者Debuqer
相关产品推荐
相关产品推荐

