Docker-Compose启动正常但VS Code开发容器无法访问PHP服务
我来一步步帮你拆解并解决这些问题,毕竟你刚接触Docker和容器开发,我会尽量说得直白好操作~
1. 先搞定localhost:80无法访问的问题
你遇到的访问不了的核心原因是:VS Code Dev Containers会生成自己的docker-compose配置文件,可能覆盖了你原有的端口映射或者网络设置。按下面的步骤调整:
- 首先检查
.devcontainer/devcontainer.json的端口转发配置,确保它明确指定了要转发80端口:"forwardPorts": [80], "portsAttributes": { "80": { "label": "PHP Apache服务" } } - 然后查看
.devcontainer/docker-compose.yml,确认php服务的端口映射没有丢失。如果里面没有这行,手动加上:services: php: # 其他原有配置... ports: - "80:80" - 更省心的方式是让Dev Containers同时加载你原来的compose文件和devcontainer的配置文件,这样不用重复写配置。修改
devcontainer.json里的dockerComposeFile字段:"dockerComposeFile": [ "../docker-compose.yml", // 你的原始compose文件路径 "docker-compose.yml" // devcontainer目录下的配置文件,用来覆盖或新增开发环境配置 ] - 最后验证:重启容器后,运行
docker ps看php容器的PORTS列是不是显示0.0.0.0:80->80/tcp,如果是,再用127.0.0.1:80试试访问(有时候localhost解析会有小问题)。
2. 搞懂.devcontainer下的docker-compose.yml为什么不一样
这个文件是VS Code专门为开发环境生成的配置,和你原来的compose文件分工不同:
- 你原来的compose是用来跑生产/测试环境的,追求简洁稳定;
.devcontainer下的这个文件是用来做开发适配的——比如挂载本地代码目录、添加调试工具、调整用户权限让你能在容器里正常编辑文件等等。
它相当于原始compose的「补丁文件」,Dev Containers会自动合并两个文件的配置:原始文件有的配置,这里没写就用原始的;这里写了的,就覆盖原始的。这样你既能保持生产配置的纯净,又能灵活调整开发环境。
3. 实现「编辑PHP脚本 + 双容器独立运行 + 数据库连接」的需求
这三个需求其实可以一次性搞定,核心是利用Docker的目录挂载和网络特性:
(1)在VS Code里编辑容器内的PHP脚本
不用直接修改容器里的文件,最方便的是把本地代码目录挂载到容器的Apache根目录。在.devcontainer/docker-compose.yml里给php服务加个挂载配置:
services: php: volumes: - ../你的本地代码文件夹:/var/www/html # 把左边的路径换成你本地存放PHP代码的文件夹
这样你在VS Code里编辑本地的PHP文件,容器里的/var/www/html会实时同步,刷新浏览器就能看到效果。
(2)让两个容器分开运行
只要你按照前面的方法,让Dev Containers加载原始的compose文件,启动时php和mariadb两个容器会自动独立运行,而且处于同一个Docker网络里——Docker会自动管理它们的网络通信,不用你手动配置IP。
(3)PHP连接MariaDB的正确姿势
不要用localhost作为数据库地址!因为在php容器里,localhost指的是容器本身,而不是主机或者mariadb容器。正确的做法是用mariadb服务的名称(比如你原始compose里mariadb服务叫db,就写db)。
举个PHP连接的例子:
<?php // 替换成你原始compose里设置的数据库参数 $dbHost = 'db'; // 这里是mariadb服务的名称 $dbName = '你的数据库名'; $dbUser = '你的数据库用户名'; $dbPass = '你的数据库密码'; try { $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass); echo "数据库连接成功!"; } catch(PDOException $e) { die("连接失败: " . $e->getMessage()); } ?>
确保你原始compose里的mariadb服务配置了正确的环境变量,比如:
services: db: image: mariadb environment: MYSQL_ROOT_PASSWORD: 你的root密码 MYSQL_DATABASE: 你的数据库名 MYSQL_USER: 你的数据库用户名 MYSQL_PASSWORD: 你的数据库密码 volumes: - db-data:/var/lib/mysql # 持久化数据库数据,重启容器不会丢失
最后一步:重启容器生效
修改完所有配置后,在VS Code里按F1,搜索「Dev Containers: Rebuild and Reopen in Container」,等待容器重建完成。之后你就能:
- 正常访问
http://localhost:80的PHP站点 - 在VS Code里编辑本地代码,实时同步到容器
- PHP脚本能正常连接mariadb数据库
内容的提问来源于stack exchange,提问作者GreNait

