# ul-php-docker-env **Repository Path**: ztao/ul-php-docker-env ## Basic Information - **Project Name**: ul-php-docker-env - **Description**: 使用docker部署通用php环境的资料。 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-03-21 - **Last Updated**: 2025-03-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## ul-php-docker-env 使用docker实现通用php环境搭建的配置资料。 ### 这是什么 - 使用docker搭建环境的具体的配置文件(已踩坑) - php构建docker配置 - caddy服务器配置 - mysql部署文件 - redis部署文件 - 项目部署规范指导 - 日志管理(暂未实现) - 定时任务管理(暂未实现) - 备份方案(暂未实现) - 数据备份 - 程序备份 - 安全规范(未实现) - 接入更多的常见配套服务 - PostgreSQL - MongoDB ### 为什么有这个项目 目前php最主流的部署方式就是使用面板,再一个就是把项目打包为的docker镜像(参考ulthon_admin),不过后者的方式也不是特别主流。 本项目希望实现一套无其他因素的简单好用的部署方式,希望所有的实现方案都是开源的,可靠地,原始的。 ### 整体说明 使用docker实现php通用环境的配置,使用caddy作为web服务器,其他服务也都使用docker部署。 所有docker服务均通过`compose.yaml`启动。 端口方面: - php端口规则`9+大版本+0`,如php74服务占用`9740`,php81服务占用`9810`等。 - mysql端口规则`3+大版本+0`,如mysql5.7占用`3570`,mysql8.0占用`3800`。 - mariadb端口规则`4+版本+0`,目前只有10版本,因此使用`4100`,虽然mariadb的小版本之间也有不同的支持周期和特性,但一般而言他们都是兼容的,无需特别指定。 - redis使用6379端口,一般不会出现多版本的情况。 端口规则保留的0是预留的,有必要的话可以改为其他数字。 > 关于端口可以任意分配,比如mysql端口是3306,其他的版本分别是3307,3308这样。 每个docker服务的目录映射都是compose文件的相对目录下。 ## 密码 很多配置文件中都有密码,需要手动修改。 ## 目录映射 `/data/projects` 本项目默认把网站放到`/data/projects`中,如需要改动,所有文件都要同步修改。 php-fpm的工作原理是服务器(nginx、caddy)把请求信息转发到cgi上,由于php运行在docker中,所以php网站的路径和容器需要注意统一。 例如本项目中的php的dockerfile中,映射`/data/projects`,在宿主机中,实际的代码就要放到`/data/projects`下,绝对不能放到其他路径。 可能懂docker的老师会说,docker的目录映射是可以随意指定的,我可以把任意的目录映射到`/data/projects`,难道不是吗?是的,但是服务器在转发到php服务的时候,会把php文件的路径一起转发过去,如果php代码是其他目录,比如`/var/www/ulthon.com`,服务器会把`/var/www/ulthon.com`发送到php-fpm服务,此时php-fpm就会去`/var/www/ulthon.com`找文件,但实际上,对于php的容器,代码不在`/var/www/ulthon.com`里,而是`/data/projects`,所以会找不到文件。也有解决办法,就是配置一下服务器(nginx、caddy)设置文件的路径,但这不就更麻烦了吗。 ## 目录规范 - 在系统中创建一个`/data`目录,本项目所有文件都放在这个目录下 - php的代码放到/projects/xxxx/下,创建一个目录,作为独立的站点 - 系统其他的服务(例如使用docker实现邮箱、网盘、博客等支持docker配套部署的),直接在data目录下即可,和mysql、redis、php等同级。只有需要开发代码的网站、服务、系统放到projects下。 ## 镜像 每个镜像都配置了`host.docker.internal`网络,指向宿主机。 一般而言使用局域网ip也都能访问到宿主机。 内置的docker镜像使用socat工具转发了指定端口,因此容器里127.0.0.1的特定端口也能指向宿主机。 ## caddy的使用 ### 配置文件 目前已经实现了php的、tp的、跨域的通用配置块,可以直接使用。 对于tp8的项目,可直接这样配置: ``` admin.demo.ulthon.com { import tp8 {host} } ``` 这时候只要在projects下创建一个名为admin.demo.ulthon.com的目录即可。 如果 ### 安装部署 暂无 ## php使用 直接到对应目录下执行即可: ```bash docker compose up ``` 该命令会自动根据目录下的Dockerfile构建。如果修改了Dockerfile,需要运行以下命令强制使用构建。 ```bash docker compose up --build ``` > 只要Dockerfile没有变化,虽然仍然重复构建,但各各层都缓存下来,能够很快生成镜像。 当需要使用命令行时,需要这样运行: ```bash docker exec php80 php /data/projects/ulthon.com/think ``` 可以运行对应目录下的`alias.sh`,以后可以直接这样运行: ```bash php80 /data/projects/ulthon.com/think ``` > 这里有个隐含的坑和优势,如果你内部代码需要exec php命令,直接使用php,而不能使用php80。(没办法调用php81等其他指令)