Home

Awesome

Docker 化 PHP 项目最佳实践

完全使用 Docker 开发、部署 PHP 项目。本指南只是简单列出,具体内容请查看 文档

IDE

本页面以 PHPStorm 为例进行介绍。

如果你使用的是 VSCode 请参考 这里

Create PHP Application by Composer

GitHub stars PHP from Packagist GitHub (pre-)release StyleCI

$ composer create-project --prefer-dist khs1994/example demo

$ cd demo

微信订阅号

<p align="center"> <img width="200" src="https://user-images.githubusercontent.com/16733187/46847944-84a96b80-ce19-11e8-9f0c-ec84b2ac463e.jpg"> </p> <p align="center"><strong>关注项目作者微信订阅号,接收项目最新动态</strong></p>

说明

初始化

准备

建立一个自己的 PHP 项目模板(即 composer 包类型为 project),里面包含了常用的文件的模板。

示例:https://github.com/khs1994-docker/php-demo

内置文件模板

FilenameDescription
.github/workflowsGitHub Actions CI 工具
.gitattributesgit 打包时排除文件(例如 测试代码)
.drone.ymlDrone CI 工具
.editorconfig定义文件格式规则(例如 缩进方式)
.pcit.ymlPCIT CI 工具
.php_csPHP 代码格式化工具
.doctum.phpPHP 文档生成工具
.styleci.ymlStyle CI PHP 代码格式化 CI 工具

一、开发

环境(以下步骤缺一不可)

1. 新建 PHP 项目

使用自己的模板项目初始化 PHP 项目。

$ cd lnmp/app

$ lnmp-composer create-project --prefer-dist khs1994/example:dev-master demo

$ cd demo

$ git init

$ git remote add origin git@url.com:username/PROJECT_NAME.git

$ git checkout -b dev

$ echo -e "<?php\nphpinfo();" >> public/index.php

2. 新增 NGINX 配置

一个 PHP 项目, 一个 网址,一个 NGINX 子配置文件

参考示例配置文件在 config/nginx 新建 *.conf NGINX 配置文件

3. 启动 khs1994-docker/lnmp

$ ./lnmp-docker up

# $ ./lnmp-docker restart

4. 浏览器验证

浏览器打开页面出现 php 信息

5. PHPStorm 打开 PHP 项目

注意 打开的是 PHP 项目(避免文件层次过深,IDE 直接打开 PHP 项目),不是 khs1994-docker/lnmp

要配置 khs1994-docker/lnmp 建议使用另外的文本编辑器。

你可以通过设置 APP_ROOT 变量来实现 app 文件夹与 khs1994-docker/lnmp 并列。

.
├── app    # 项目文件夹
└── lnmp   # khs1994-docker/lnmp

6. CLI settings

由于 PHP 环境位于 Docker 中,必须进行额外的配置

生成 docker-compose.yml

# 在 khs1994-docker/lnmp 项目根目录执行
$ lnmp-docker config > docker-compose.yml

如果使用 Docker Compose V2,请使用 PHPStorm 2021.3 及以上版本

PHPStorm 设置 -> PHP -> CLI Interpreter -> 点击后边三个点 -> 点击左上角 + 号 -> From Docker ... -> 选择 Docker Compose -> Configuration file(s) -> 选择 docker-compose.yml(khs1994-docker/lnmp项目根目录) -> Services -> 选择 workspace -> 点击 OK 确认

点击 ok 之后跳转的页面上 Additionl -> Debugger extension-> 填写 xdebug

具体请查看 https://github.com/khs1994-docker/lnmp/issues/260#issuecomment-373964173

再点击 ok 之后跳转到了 PHPStorm 设置-> PHP -> CLI Interpreter 这个页面

配置本地路径与容器内路径对应关系

这里的配置 PHPStorm 可能会自动生成,保证正确即可。

这里以 Windows 为例,其他系统同理(添加本机路径与容器路径对应关系即可)。

由于 Windows 与 Linux 路径表示方法不同,我们必须另外添加路径对应关系。配置本地项目与容器目录之间的路径对应关系。

假设本地项目目录位于 C:/Users/username/app/demo 对应的容器目录位于 /app/demo 假设本地项目目录位于 WSL2 \\wsl$\Ubuntu\app\demo 对应的容器目录位于 /app/demo

PHPStorm 设置 -> PHP -> Path mappings 添加一个条目 C:/Users/username/app/demo => /app/demo

7. 设置 Xdebug

请查看 https://github.com/khs1994-docker/lnmp/blob/master/docs/xdebug.md

8. 依赖管理 Composer

容器化 PHPer 常用命令请查看 https://github.com/khs1994-docker/lnmp/blob/master/docs/command.md

# 引入依赖
$ lnmp-composer require phpunit/phpunit

# 或安装依赖
$ lnmp-composer install [--ignore-platform-reqs]

9. 编写 PHP 代码

10. 编写 PHPUnit 测试代码

11. 使用 PHPUnit 测试

在 PHPStorm 中使用

PHPStorm 设置 -> PHP ->Test Frameworks -> 左上角添加 -> PHPUnit by Remote Interpreter -> 选择第五步添加的 workspace -> 点击 OK -> PHPUnit Library -> 选择 Use Composer autoloader -> Path to script -> 点击右边刷新按钮即可自动识别,或者手动 填写 /app/PROJECT_NAME/vendor/autoload.php -> 点击 OK 确认

在测试函数名单击右键 run FunName 开始测试。

在 命令行 中使用

# 项目目录必须包含 PHPUnit 配置文件 phpunit.xml
$ lnmp-phpunit [参数]

12. 本地测试构建 PHP 及 NGINX 镜像

此示例将 PHP 代码打入了镜像中,如果你选择将代码放入宿主机,那么无需进行此步骤。两种方法自行取舍。

关于代码放到哪里?代码放入宿主机,上线时需要在服务器 pull 代码(或者参考 git-sync 周期性监听 git 变化并克隆到本地)。代码放入镜像中,上线时直接拉取镜像之后启动容器,无需 pull 代码。

若将 PHP 项目打入镜像,镜像中严禁包含配置文件

Docker 镜像必须由 CI 服务器构建,而不是本地人工构建!

自行修改 .env docker-compose.yml 文件,保留所需的 PHP 版本,其他的注释

$ docker compose build php nginx

13. 将项目提交到 Git

$ git add .

$ git commit -m "First"

$ git push origin dev:dev

CI/CD 服务搭建

CI/CD 可以到 khs1994-docker/ci 查看。

二、测试

CI/CD 服务器收到 Git Push 事件,进行代码测试

三、开发、测试循环

四、在 Kubernetes 中部署生产环境 (全自动)

可以在生产环境之前加一个 预上线 环境,这里省略。

1. git 添加 tag,并推送到远程仓库

2. CI/CD 服务器收到 Git Tag 事件,自动构建镜像并推送镜像到 Docker 仓库(代码在镜像中)

3. CI/CD 服务器中使用 Helmkustomize 在 k8s 集群更新服务(代码在镜像中)

4. 使用 daemonset 部署 gti-sync(代码不在镜像中)

每个节点 都拥有一份代码,这样就不用关心 pod 调度到哪个节点。

BUG