Laravel Sail 安装
Laravel Sail 是为 Laravel 提供的基于 Docker 的开发环境,可同时搭建包含 PHP、MySQL、Redis,XDebug 在内的开发环境,优势:
- 降低开发环境的搭建难度
- 将对主机已有环境的影响降至最低
- 统一团队开发环境
在 WSL 内使用指令:
curl -s https://laravel.build/<项目名称> | bash
执行后,将在当前目录下建立一个 <项目名称>
的文件夹,并在里面构建一个 Laravel Sail 项目。
成功创建 Laravel 项目后,我们通过 cd 指令进入项目目录
cd <项目名称>
Dockerfile 修改
安装 Laravel Sail 后,不要马上按照提示执行 vendor/bin/sail up
,还需要针对国内网络环境对 Dockerfile 进行调整,也就是将其中 Composer 等包管理工具的包来源修改为国内镜像网站。
Laravel Sail 支持用户自定义 Dockerfile 文件,只需使用以下指令发布 Dockerfile 文件即可
php artisan sail:publish
发布后,可在项目根目录的 docker
文件夹中找到对应的 Dockerfile,共有三个版本,具体是哪个版本可打开项目根目录的 docker-compose.yml
查看。
# For more information: https://learnku.com/docs/laravel/sail
version: '3'
services:
laravel.test:
build:
# 此处即为执行的 Dockerfile 所在的文件夹
context: ./docker/8.1
# 此处为 Dockerfile 的文件名
dockerfile: Dockerfile
# 此处记录 Dockerfile 的参数,${var} 表示 .env 文件中 var 对应的值
args:
WWWGROUP: '${WWWGROUP}'
这里我们使用的是 8.1 版本,打开 ./docker/8.1/Dockerfile
将其中的内容替换为:
Dockerfile
FROM ubuntu:21.10
LABEL maintainer="Taylor Otwell"
ARG WWWGROUP
ARG NODE_VERSION=16
WORKDIR /var/www/html
ENV DEBIAN_FRONTEND noninteractive
ENV TZ=Asia/Shanghai
ENV APT_MIRROR http://mirrors.ustc.edu.cn
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN echo 'APT::Acquire::Retries "5";' > /etc/apt/apt.conf.d/80-retries \
&& sed -i "s|http://archive.ubuntu.com|$APT_MIRROR|g; s|http://security.ubuntu.com|$APT_MIRROR|g" /etc/apt/sources.list \
&& sed -i "s|http://ports.ubuntu.com|$APT_MIRROR|g" /etc/apt/sources.list \
&& apt-get update
RUN apt-get update \
&& apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 \
&& mkdir -p ~/.gnupg \
&& chmod 600 ~/.gnupg \
&& echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf \
&& apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys E5267A6C \
&& apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C300EE8C \
&& echo "deb https://launchpad.proxy.ustclug.org/ondrej/php/ubuntu impish main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
&& apt-get update \
&& apt-get install -y php8.1-cli php8.1-dev \
php8.1-pgsql php8.1-sqlite3 php8.1-gd \
php8.1-curl \
php8.1-imap php8.1-mysql php8.1-mbstring \
php8.1-xml php8.1-zip php8.1-bcmath php8.1-soap \
php8.1-intl php8.1-readline \
php8.1-ldap \
php8.1-msgpack php8.1-igbinary php8.1-redis php8.1-swoole \
php8.1-memcached php8.1-pcov php8.1-xdebug \
&& php -r "readfile('https://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \
&& curl -sL https://deb.nodesource.com/setup_$NODE_VERSION.x | bash - \
&& apt-get install -y nodejs \
&& npm install -g npm \
# npm 镜像
&& npm config set registry https://registry.npm.taobao.org \
&& curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
&& apt-get update \
&& apt-get install -y yarn \
# Yarn 镜像
&& yarn config set registry https://registry.npm.taobao.org \
&& apt-get install -y mysql-client \
&& apt-get install -y postgresql-client \
&& apt-get -y autoremove \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.1
RUN groupadd --force -g $WWWGROUP sail
RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail
COPY start-container /usr/local/bin/start-container
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY php.ini /etc/php/8.1/cli/conf.d/99-sail.ini
RUN chmod +x /usr/local/bin/start-container
EXPOSE 8000
ENTRYPOINT ["start-container"]
修改后,即可启动容器
vendor/bin/sail up
若容器尚未构建的话,该指令会自动构建容器后启动。也可以使用 -d
参数使其在后台运行。
vendor/bin/sail up -d
启动后可以查看我们容器内的 PHP 版本
vendor/bin/sail php -v
可以通过下面的指令来停止在后台运行的 Sail 容器
vendor/bin/sail stop
如果在此前你已经构建过容器且希望重新构建一个,可以使用以下命令重新构建:
vendor/bin/sail build --no-cache
成功启动容器后,使用主机访问 localhost
即可看到 Laravel 的初始界面
如果出现 Permission Denied 的情况,请赋予项目目录 777 权限,在项目目录根目录下执行
sudo chmod 777 ./ -R
PhpStorm 打开项目
File >> Open 在子系统的目录中选择我们的项目
打开项目后,可以直接在 Terminal 中运行需要在子系统中运行的指令,从而摆脱来回切换 PhpStorm 和 Windows Terminal 的麻烦。
将项目目录及内其内的文件权限修改为 777,方便使用 PhpStorm 进行编辑。
sudo chmod 777 ./ -R
这样之后就可以关闭独立的 WSL 窗口了,直接在 PhpStorm 的 Terminal 窗口启动即可。
.env 修改
为了能够使用 Xdebug ,我们需要在容器启动之前,在 .env 文件中启用这个功能,加入以下键值即可
SAIL_XDEBUG_MODE=develop,debug
加入后启动容器
vendor/bin/sail up -d
PhpStorm 配置 PHP 解释器
由于通过 Laravel Sail 的开发环境,位于主机的 PhpStorm 并无法直接访问到 PHP 解释器,但是 PhpStorm 支持通过 Docker 配置它
按如图所示操作添加位于 Docker 内的 PHP 解释器,注意 PHP language level 一项也需要手动选择为与 Docker 内一致的版本。
浏览器 XDebug Helper 扩展
访问浏览器的扩展商店搜索 XDebug Helper 并安装
如果使用 Edge 可以直接访问 Xdebug helper - Microsoft Edge Addons
PhpStorm 配置 Servers
在 File >> Setting >> PHP >> Servers 按如图配置
Enjoy it~
打开 PhpStorm 的 XDebug 监听
随机修改 routes/web.php
中的代码,这里使用
Route::get('/', function () {
$a = 1;
return view('welcome');
});
在 return 语句打上断点
启用 XDebug Helper 的 Debug 模式,并刷新 localhost 页面
此时 PhpStorm 可能弹出 Debug 连接的窗口,连接即可,便可以看到断点的 Debug 信息:
可能的误区
缓存了路由又在 web.php 打断点
使用了 sail php artisan route:cache
后,路由将直接由缓存加载,将无法访问到代码中的断点。可使用以下命令清除路由缓存:
sail php artisan route:clear
PhpStorm 路径映射配置错误
在配置 PhpStorm 的 Server 时,远程的绝对路径应该是 /var/www/html
,这是项目在容器中的路径,而非项目在子系统中的路径。
参考资料
Laravel Sail 官方文档
将 Laravel 开发环境由 Homestead 迁移到 Laravel Sail ( Docker ) 完整详细教程 | myhui0926 | LearnKu