PHP Docker开发环境—— docker-php-env

项目地址:github.com/suyar/docker-php-env

本项目是一套用于 PHP 的 Docker 开发环境,站在巨人[DNMP]的肩膀上衍生的一个版本。

为什么会有这个项目:

  1. DNMP 首次启动需要进行构建,时间较长,步骤繁琐
  2. DNMP 有一些容器抛出的错误日志,没有进行修复
  3. DNMP 部分镜像 TZ 环境变量不生效
  4. DNMP 产生大量 docker logs 占用磁盘空间,需要重建容器才能释放
  5. 其他问题…

大部分场景下,我们希望开箱即用。当然,凡事都有两面性,不需要构建的代价,就是对镜像的定制化能力变低,看个人取舍。


重要的事情说三遍:

该项目仅适用于本地开发,不能用于生产环境

该项目仅适用于本地开发,不能用于生产环境

该项目仅适用于本地开发,不能用于生产环境


目前支持开箱即用的服务有:

  1. Mysql5.7(使用官方镜像)
  2. Mysql8.0(使用官方镜像)
  3. phpMyAdmin(使用官方镜像)
  4. Redis(使用官方镜像)
  5. phpRedisAdmin(使用官方镜像)
  6. Memcached(使用官方镜像)
  7. PHP8.1/PHP8.0/PHP7.4/PHP7.3(使用基于官方的集成镜像 suyar/php:x.x-integration
  8. Nginx(使用官方镜像)
  9. RabbitMQ(使用官方镜像)
  10. MongoDB(使用官方镜像)
  11. Mongo-Express(使用官方镜像)
  12. Elasticsearch(使用官方镜像)
  13. 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. 快速使用

  1. 环境要求

    • 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 系统内,使用 vscodephpstorm 进行编辑开发
    • Linux

    • MacOS

      • 没有苹果电脑故无法尝试,后续补充
  2. clone 项目

    建议 fork 本项目,方便针对自己的开发需求做定制。

     # git clone git@github.com:suyar/docker-php-env.git
  3. 初始化项目

    该操作会初始化目录权限和相关文件:

     # cd docker-php-env
     # git config core.filemode false
     # sudo chmod +x dpe.sh
     # sudo ./dpe.sh init

    执行完成后,根据自己的需求,对 .env 文件和 docker-compose.yml 进行定制。

  4. 启动项目

     # sudo docker-compose up -d
  5. 在浏览器中访问:http://localhosthttp://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 容器举例:

  1. DIR_SOURCE 所在的目录或项目中,增加一个文件,例如创建 www/laravel/schedule 文件,并把定时任务写在里面:
* * * * * cd /www/laravel && php artisan schedule:run >> /dev/null 2>&1
  1. 进入 PHP 容器,添加定时任务:
# sudo docker compose exec php81 bash
# cd /www/laravel
# crontab -f schedule

4.3 在 PHP 容器中使用 supervisor

这里以 php81 容器举例:

  1. 修改 services/php/81/supervisor.conf 的内容
  2. 重启 php81 容器

4.4 清空服务数据

在某些情况下,你可能需要清空各种生成的数据,重新初始化开发环境,

该操作是风险操作,会清空所有持久化数据!!!

# sudo docker-compose down
# sudo ./dpe.sh clean
# sudo ./dpe.sh init

License

MIT

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!