Docker PHP 最佳实践
时间:2022-05-03
本文章向大家介绍Docker PHP 最佳实践,主要内容包括Docker 化 PHP 项目最佳实践、CI/CD 服务搭建、二、测试(全自动)、三、开发、测试循环、git 添加 tag、四、部署 (全自动)、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
Docker 化 PHP 项目最佳实践
完全使用 Docker 开发、部署 PHP 项目
一、开发
环境
- LNMP khs1994-docker/lnmp
- IDE
PHPStorm
- git 分支
dev
1. 新建 PHP 项目
并初始化 git 仓库。
$ cd lnmp
$ mkdir -p app/demo
$ cd app/demo
$ git init
$ git remote add origin git@github.com:username/repo.git
$ git checkout -b dev
$ echo -e "<?phpnphpinfo();" >> app/demo/index.php
2. 新增 NGINX 配置
参考示例配置文件在 config/nginx
新建 *.conf
NGINX 配置文件
3. 启动 khs1994-docker/lnmp
$ ./lnmp-docker.sh development
4. 浏览器验证
浏览器打开页面,出现 php 信息
5. PHPStorm 打开已有项目
6. 设置 CLI
PHPStorm 设置
-> Languages & ...
-> PHP
-> CLI Interpreter
-> 点击后边三个点
-> `左上角添加` -> `From Docker ...` -> `Remote` -> `选择 Docker`
-> `Image name` -> `选择 khs1994/php-fpm:7.2.3-alpine3.7`
-> `点击 OK 确认`
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
9. 编写 PHP 代码
10. 编写 PHPUnit 测试代码
11. 使用 PHPUnit 测试
使用 PHPStorm
PHPStorm 设置
-> Languages & ...
-> PHP
->Test Frameworks
-> 左上角添加
-> `PHPUnit by Remote Interpreter` -> `选择第五步添加的 Docker 镜像`
-> `点击 OK` -> `PHPUnit Library` -> `选择 Use Composer autoloader`
-> `Path to script` -> `填写 /opt/project/vendor/autoload.php`
-> `点击右边刷新` -> `点击 OK 确认`
在测试函数名单击右键 run FunName
开始测试。
使用命令行
$ lnmp-phpunit
在笔记本需要与数据库交互的测试流程暂未发布。
12. 测试构建 PHP 及 NGINX 镜像
将 PHP 项目打入镜像,镜像中严禁包含配置文件
自行修改 .env
docker-compose.yml
文件,保留所需的 PHP 版本,其他的注释
$ docker-compose build
13. 将项目提交到 Git
$ git add .
$ git commit -m "First"
$ git push origin dev:dev
CI/CD 服务搭建
khs1994.com
CI/CD 由 khs1994-docker/ci 提供。
Drone + Gogs
暂不支持挂载本地 Volume
本例 CI/CD 由 Travis
提供。
二、测试(全自动)
1. Git 通知到 CI/CD 服务器
- Travis CI (公共的、仅支持 GitHub CI/CD)
- Drone (私有化 CI/CD)
2. CI/CD 服务器测试
三、开发、测试循环
git 添加 tag
- 只有添加了
tag
的代码才能部署到生产环境 - Docker 镜像名必须包含 git
tag
- CI/CD 服务器构建并推送镜像到 Docker 仓库。
四、部署 (全自动)
生产环境部署 khs1994-docker/lnmp 请查看 https://github.com/khs1994-docker/lnmp/tree/master/docs/production
1. Docker 私有仓库通知到指定地址
2. Swarm mode 或 k8s 集群调用相应的 API 自动更新服务
Swarm mode
#
# 管理员通过 API 新增配置文件、密钥, 并更新
#
$ docker config create nginx_khs1994_com_conf_vN config/nginx/khs1994.com.conf
#
# 更新配置的时候也可以同时更新镜像
#
$ docker service update
--config-rm nginx_khs1994_com_conf
--config-add source=nginx_khs1994_com_conf_vN,target=/etc/nginx/conf.d/khs1994.com.conf
--image khs1994/nginx:swarm-alpine-NEW_GIT_TAG lnmp_nginx
lnmp_nginx
$ docker secret create khs1994_com_ssl_crt_vN config/nginx/ssl/khs1994.com.crt
$ docker service update
--secret-rm khs1994_com_ssl_crt
--secret-add source=khs1994_com_ssl_crt_vN,target=/etc/nginx/conf.d/ssl/khs1994.com.crt
lnmp_nginx
#
# 更新镜像
#
$ docker service update --image khs1994/nginx:swarm-alpine-NEW_GIT_TAG lnmp_nginx
#
# 其他项也可以更新,请查看帮助信息
#
$ docker service update --help
k8s
3. 完成部署
- 为经典版eclipse增加web and JavaEE插件
- 协议森林07 傀儡 (UDP协议)
- 【设计模式】—— 访问者模式Visitor
- JAVA EE Eclipse下配置Tomcat服务器
- CentOS6.5菜鸟之旅:文件权限详解
- CMD魔法堂:支持显示UTF8编码的中文
- 【设计模式】—— 模板方法Template
- 【设计模式】—— 策略模式Strategy
- MyBatis魔法堂:即学即用篇
- 【设计模式】—— 状态模式State
- php环境无法上传文件的解决方法
- Java魔法堂:JUnit4使用详解
- Windows魔法堂:解决“由于启动计算机时出现页面文件配置问题.......”
- Java魔法堂:自定义和解析注解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android底部导航栏的三种风格实现
- Android Studio3.2中导出jar包的过程详解
- Android自定义view实现标签栏功能(只支持固定两个标签)
- python 爬虫之selenium可视化爬虫
- Android Studio3.6.+ 插件搜索不到终极解决方案(图文详解)
- Spring 整合 SpringDataRedis
- Android 实现可任意拖动的悬浮窗功能(类似悬浮球)
- Android仿抖音右滑清屏左滑列表功能的实现代码
- 利用织梦CMS0day注入漏洞渗透测试
- nodejs中追加内容到文件
- android实现滚动文本效果
- Android实现View的拖拽
- 诊断日志知多少 | DiagnosticSource 在.NET上的应用
- Android Studio 4.0新特性及升级异常问题的解决方案
- Android Studio 4.0 正式发布在Ubuntu 20.04中安装的方法