PHP Docker开发环境—— docker-php-env
项目地址:github.com/suyar/docker-php-env
本项目是一套用于 PHP 的 Docker 开发环境,站在巨人[DNMP]的肩膀上衍生的一个版本。
为什么会有这个项目:
- DNMP 首次启动需要进行构建,时间较长,步骤繁琐
- DNMP 有一些容器抛出的错误日志,没有进行修复
- DNMP 部分镜像
TZ
环境变量不生效 - DNMP 产生大量
docker logs
占用磁盘空间,需要重建容器才能释放 - 其他问题…
大部分场景下,我们希望开箱即用。当然,凡事都有两面性,不需要构建的代价,就是对镜像的定制化能力变低,看个人取舍。
重要的事情说三遍:
该项目仅适用于本地开发,不能用于生产环境
该项目仅适用于本地开发,不能用于生产环境
该项目仅适用于本地开发,不能用于生产环境
目前支持开箱即用的服务有:
- Mysql5.7(使用官方镜像)
- Mysql8.0(使用官方镜像)
- phpMyAdmin(使用官方镜像)
- Redis(使用官方镜像)
- phpRedisAdmin(使用官方镜像)
- Memcached(使用官方镜像)
- PHP8.1/PHP8.0/PHP7.4/PHP7.3(使用基于官方的集成镜像 suyar/php:x.x-integration)
- Nginx(使用官方镜像)
- RabbitMQ(使用官方镜像)
- MongoDB(使用官方镜像)
- Mongo-Express(使用官方镜像)
- Elasticsearch(使用官方镜像)
- Kibana(使用官方镜像)
目录
1. 目录结构
/
├── data
│ ├── composer Composer 缓存
│ ├── elasticsearch Elasticsearch 持久化数据
│ ├── mongodb MongoDB 持久化数据
│ ├── mysql5 Mysql5.7 持久化数据
│ ├── mysql8 Mysql8.0 持久化数据
│ ├── rabbitmq Rabbitmq 持久化数据
│ └── redis Redis 持久化数据
├── logs
│ ├── mongodb MongoDB 日志
│ ├── mysql
│ │ ├── 5 Mysql5.7 日志
│ │ └── 8 Mysql8.0 日志
│ ├── nginx Nginx 日志
│ ├── php
│ │ ├── 73
│ │ │ ├── log PHP7.3 错误日志与慢日志
│ │ │ └── supervisor PHP7.3 里 supervisor 日志
│ │ ├── 74
│ │ │ ├── log PHP7.4 错误日志与慢日志
│ │ │ └── supervisor PHP7.4 里 supervisor 日志
│ │ ├── 80
│ │ │ ├── log PHP8.0 错误日志与慢日志
│ │ │ └── supervisor PHP8.0 里 supervisor 日志
│ │ └── 81
│ │ ├── log PHP8.1 错误日志与慢日志
│ │ └── supervisor PHP8.1 里 supervisor 日志
│ └── rabbitmq Rabbitmq 日志
├── services
│ ├── elasticsearch Elasticsearch 配置目录
│ ├── mongodb MongoDB 配置目录
│ ├── mysql Mysql5.7/Mysql8.0 配置目录
│ ├── nginx Nginx 配置目录
│ │ ├── conf.d Nginx Vhost 配置目录
│ │ └── ssl Nginx 证书目录
│ ├── php
│ │ ├── 73 PHP7.3 配置目录
│ │ ├── 74 PHP7.4 配置目录
│ │ ├── 80 PHP8.0 配置目录
│ │ └── 81 PHP8.1 配置目录
│ ├── phpmyadmin phpMyAdmin 配置目录
│ ├── rabbitmq Rabbitmq 配置目录
│ └── redis Redis 配置目录
├── .env.example .env 变量示例配置
├── docker-compose.yml.example docker-compose 示例
├── dpe.sh 初始化脚本
└── www 默认项目代码存放目录
2. 快速使用
环境要求
Windows
- 安装 Docker Desktop
- 安装
wsl2
,建议安装 Ubuntu:wsl --install -d Ubuntu
- 在
Docker Desktop
启用Use the WSL 2 base engine
- 在
Docker Desktop
启用WSL Integration
- 因为
wsl2
文件有挂载性能问题,该项目必须放在wsl2
系统内,而不能放在/mnt/c
或/mnt/d
这种挂载目录下 - 项目代码也建议放在
wsl2
系统内,使用vscode
或phpstorm
进行编辑开发
Linux
- 安装 Docker
- 安装 Docker Compose
MacOS
- 没有苹果电脑故无法尝试,后续补充
clone
项目建议 fork 本项目,方便针对自己的开发需求做定制。
# git clone git@github.com:suyar/docker-php-env.git
初始化项目
该操作会初始化目录权限和相关文件:
# cd docker-php-env # git config core.filemode false # sudo chmod +x dpe.sh # sudo ./dpe.sh init
执行完成后,根据自己的需求,对
.env
文件和docker-compose.yml
进行定制。启动项目
# sudo docker-compose up -d
在浏览器中访问:
http://localhost
或http://127.0.0.1
,初始页面会显示404
。
3. PHP 扩展
3.1 PHP 预置扩展
PHP 镜像默认安装了下列扩展,暂不支持重新安装指定版本扩展,如果确实有需要,推荐用 [DNMP],也可以 fork 本项目后,参照 docker-php 自己构建。
[PHP Modules]
amqp
apcu
bcmath
bz2
calendar
Core
ctype
curl
date
decimal
dom
enchant
event
exif
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
igbinary
imagick
intl
json
libxml
lzf
mbstring
memcached
mongodb
msgpack
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_pgsql
pdo_sqlite
pgsql
Phar
posix
readline
redis
Reflection
session
SimpleXML
sockets
sodium
SPL
sqlite3
standard
swoole
tidy
timezonedb
tokenizer
uuid
xlswriter
xml
xmlreader
xmlwriter
xsl
yac
yaml
Zend OPcache
zip
zlib
[Zend Modules]
Zend OPcache
3.2 安装 PHP 扩展
除了预置的扩展,如果你还想安装其他扩展,可以直接执行:
# sudo docker-compose exec php81 install-php-extensions xxx
支持的扩展在这边可以在这边查看:docker-php-extension-installer。
这种方式安装扩展和 DNMP 的方式不同,通过这种方式安装的扩展,在容器销毁后重新创建,不会保留,需要重新安装。
3.3 在 PHP 容器中执行命令
# sudo docker-compose exec php81 bash
root@08240e17170e:/www# php -v
这里移除了 DNMP 中使用 alias
的方式在 Host 主机中执行 PHP 命令。
3.4 使用 composer
# sudo docker-compose exec php81 bash
root@08240e17170e:/www# composer install
这里移除了 DNMP 中使用 alias
的方式在 Host 主机中执行 composer
命令。
4 常见问题
4.1 如何在其他容器中请求 nginx 配置的域名
在 docker-compose.yml
文件中,修改 nginx
服务的 aliases
配置,把 nginx
相关的域名配置成别名:
nginx:
image: nginx:${NGINX_VERSION}
environment:
TZ: ${TZ}
volumes:
- ${DIR_SERVICES}/nginx/nginx.conf:/etc/nginx/nginx.conf
- ${DIR_SERVICES}/nginx/conf.d:/etc/nginx/conf.d
- ${DIR_SERVICES}/nginx/ssl:/etc/nginx/ssl
- ${DIR_LOGS}/nginx:/var/log/nginx
- ${DIR_SOURCE}:/www
working_dir: /www
ports:
- "${NGINX_HTTP_HOST_PORT}:80"
- "${NGINX_HTTPS_HOST_PORT}:443"
networks:
default:
aliases:
- example.laravel.me
- test.biz.me
restart: unless-stopped
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "1"
4.2 在 PHP 容器中使用 cron 定时任务
这里以 php81
容器举例:
- 在
DIR_SOURCE
所在的目录或项目中,增加一个文件,例如创建www/laravel/schedule
文件,并把定时任务写在里面:
* * * * * cd /www/laravel && php artisan schedule:run >> /dev/null 2>&1
- 进入 PHP 容器,添加定时任务:
# sudo docker compose exec php81 bash
# cd /www/laravel
# crontab -f schedule
4.3 在 PHP 容器中使用 supervisor
这里以 php81
容器举例:
- 修改
services/php/81/supervisor.conf
的内容 - 重启
php81
容器
4.4 清空服务数据
在某些情况下,你可能需要清空各种生成的数据,重新初始化开发环境,
该操作是风险操作,会清空所有持久化数据!!!
# sudo docker-compose down
# sudo ./dpe.sh clean
# sudo ./dpe.sh init
License
MIT
本作品采用《CC 协议》,转载必须注明作者和本文链接