刚换笔记本,不想搞太多环境,什么 Apache、Mysql 啥的,想全部交给 Docker 管理,复杂一点的直接 Docker compose 编排一下就好了。乐得清闲,升级又容易,php 的环境也不例外,所以将它搭建一下:
环境准备
-
开发工具:Phpstorm
-
必备环境:Docker 或 Docker Compose
不需要安装 php,不需要安装 apach,也不需要配置 xdebug,啥都不用,安排。
开始
创建一个 phpstrom 空项目,然后创建一个 index.php
文件
<?php
$world = "World";
echo "hello,", $world;
Docker 方式
两种方式拉去镜像
-
去 Docker Hub 搜索 phpstorm 下的 php 镜像
-
去 Phpstorm Github 查找相应版本的 Docker 镜像
主要提供两种类型的镜像(以 7.4 php 为例,注意:7.4 版本官方没有传到 Docker Hub,可以使用 7.3 的):
-
php-74-cli-xdebug-29
:主要提供基础的php 7.4
+xdebug 2.9
mysqli
环境,不提供web环境与端口暴露。 -
php-74-apache-xdebug-29
:主要提供php 7.4
+xdebug 2.9
mysqli
+apache2
环境,同时安装了php
部分依赖(见 Docker 官方构建文件),提供web环境,内部暴露端口80
。
本次以 php-74-apache-xdebug-29
为例,在项目所在的目录启动并拉取容器:
docker run --name php-web-dev -p 80:80 -e XDEBUG_CONFIG=remote_host=host.docker.internal -v $(pwd):/var/www/html -d phpstorm/php-73-apache-xdebug-27
具体参数不做解释啦,能安装 Docker
的应该都能明白,可以通过 man
查一下。
需要注意以下两点:
其中的
${pwd}
是获取当前的工作目录路径,可以自己手动指定。或者
对于
Windows
的cmd
可以是%cd%
对于
Windows
的powershell
可以不变。如果不行可以尝试${PWD}
通过
-e
设置的环境变量XDEBUG_CONFIG
指定了远程的主机地址,对于windows
和Mac
来说,host.docker.internal
即是主机地址(参考 官网文档1 与 官网文档2)。而对于 Linux,则是无法进行识别的(参考 Github Issue),这个时候可以使用 主机名 来指定(通过hostname
获取),请自己根据情况修改 。
然后直接访问 127.0.0.1,结果如下:
这样就跑起来啦。
Docker Compose 方式
注意:如果你是一步一步的来,请先停止上一步的容器:
docker stop php-web-dev
项目根目录创建一个 docker-compose.yml
文件,如下:
version: '3.8'
services:
webserver:
image: phpstorm/php-73-apache-xdebug-27
ports:
- "80:80"
volumes:
- ./:/var/www/html
environment:
XDEBUG_CONFIG: remote_host=host.docker.internal
对于 Linux
,修改 environment
...
environment:
XDEBUG_CONFIG: remote_host=<hostname>
注意:Docker Compose 和 Docker 的版本有所关系,具体参见 官方文档。
创建完成直接运行即可
Tips:
phpstorm
和idea
一样,都有services
,可以直接通过services
进行容器管理。
访问测试 127.0.0.1,结果同上。
Debug
发生了什么
其实这个过程很好理解,通过查看他的构建方式就知道,主要有以下几步:
-
拉取
php7.4
镜像,完成基本的依赖安装、apache
、`xdebug`安装 -
指定当前工作目录映射到容器内的
apache
下,端口80
进行映射 -
指定
xdebug
的主机地址为我们宿主机 -
开启
phpstorm
的监听,以及文件的 `debug`映射
这里需要提一下,其实我们在倒数第二部 ACCEPT
那里,主要是配置了一个
php server
:
这个配置是十分重要的,你可以提前将它配置好,然后倒数第二部里面进行选择即可。如果是
Zend Debugger
,无非就是修改 Debugger
,但是*没有官方镜像支持*。
Docker Compose 编排
下面我们加上另外一个容器:Mysql8,很简单:
version: '3.8'
services:
mysql-php-dev:
container_name: mysql-php-dev
image: mysql:8
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: 123456
networks:
- php-mysql
webserver:
container_name: php-web-dev-1
depends_on:
- mysql-php-dev
image: phpstorm/php-73-apache-xdebug-27
ports:
- "80:80"
volumes:
- ./:/var/www/html
environment:
XDEBUG_CONFIG: remote_host=host.docker.internal
networks:
- php-mysql
networks:
php-mysql:
修改代码:
<?php
$world = "World";
echo "Hello,", $world;
$servername = "mysql-php-dev";
$username = "root";
$password = "123456";
$conn = mysqli_connect($servername, $username, $password);
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "连接成功";
访问测试一下:
搞定!