|
| 1 | +本项目是一套用于 PHP 的 Docker 开发环境,站在巨人[**[DNMP]**](https://github.com/yeszao/dnmp)的肩膀上衍生的一个版本。 |
| 2 | + |
| 3 | +为什么会有这个项目: |
| 4 | + |
| 5 | +1. DNMP 首次启动需要进行构建,时间较长,步骤繁琐 |
| 6 | +2. DNMP 有一些容器抛出的错误日志,没有进行修复 |
| 7 | +3. DNMP 部分镜像 `TZ` 环境变量不生效 |
| 8 | +4. DNMP 产生大量 `docker logs` 占用磁盘空间,需要重建容器才能释放 |
| 9 | +4. 其他问题... |
| 10 | + |
| 11 | +大部分场景下,我们希望开箱即用。当然,凡事都有两面性,不需要构建的代价,就是对镜像的定制化能力变低,看个人取舍。 |
| 12 | + |
| 13 | +--- |
| 14 | + |
| 15 | +重要的事情说三遍: |
| 16 | + |
| 17 | +**该项目仅适用于本地开发,不能用于生产环境** |
| 18 | + |
| 19 | +**该项目仅适用于本地开发,不能用于生产环境** |
| 20 | + |
| 21 | +**该项目仅适用于本地开发,不能用于生产环境** |
| 22 | + |
| 23 | +--- |
| 24 | + |
| 25 | +目前支持开箱即用的服务有: |
| 26 | + |
| 27 | +1. Mysql5.7(使用官方镜像) |
| 28 | +2. Mysql8.0(使用官方镜像) |
| 29 | +3. phpMyAdmin(使用官方镜像) |
| 30 | +4. Redis(使用官方镜像) |
| 31 | +5. phpRedisAdmin(使用官方镜像) |
| 32 | +6. Memcached(使用官方镜像) |
| 33 | +7. PHP8.1/PHP8.0/PHP7.4/PHP7.3(使用基于官方的集成镜像 [suyar/php:x.x-integration](https://github.com/suyar/docker-php#%E9%9B%86%E6%88%90%E9%95%9C%E5%83%8F)) |
| 34 | +8. Nginx(使用官方镜像) |
| 35 | +9. RabbitMQ(使用官方镜像) |
| 36 | +10. MongoDB(使用官方镜像) |
| 37 | +11. Mongo-Express(使用官方镜像) |
| 38 | +12. Elasticsearch(使用官方镜像) |
| 39 | +13. Kibana(使用官方镜像) |
| 40 | + |
| 41 | +# 目录 |
| 42 | + |
| 43 | +- [1. 目录结构](#1-目录结构) |
| 44 | +- [2. 快速使用](#2-快速使用) |
| 45 | +- [3. PHP 扩展](#3-php-扩展) |
| 46 | + - [3.1 PHP 预置扩展](#31-php-预置扩展) |
| 47 | + - [3.2 安装 PHP 扩展](#32-安装-php-扩展) |
| 48 | + - [3.3 在 PHP 容器中执行命令](#33-在-php-容器中执行命令) |
| 49 | + - [3.4 使用 composer](#34-使用-composer) |
| 50 | +- [4. 常见问题](#4-常见问题) |
| 51 | + - [4.1 如何在其他容器中请求 nginx 配置的域名](#41-如何在其他容器中请求-nginx-配置的域名) |
| 52 | + - [4.2 在 PHP 容器中使用 cron 定时任务](#42-在-php-容器中使用-cron-定时任务) |
| 53 | + - [4.3 在 PHP 容器中使用 supervisor](#43-在-php-容器中使用-supervisor) |
| 54 | + - [4.4 清空服务数据](#44-清空服务数据) |
| 55 | +- [License](#license) |
| 56 | + |
| 57 | +## 1. 目录结构 |
| 58 | + |
| 59 | +``` |
| 60 | +/ |
| 61 | +├── data |
| 62 | +│ ├── composer Composer 缓存 |
| 63 | +│ ├── elasticsearch Elasticsearch 持久化数据 |
| 64 | +│ ├── mongodb MongoDB 持久化数据 |
| 65 | +│ ├── mysql5 Mysql5.7 持久化数据 |
| 66 | +│ ├── mysql8 Mysql8.0 持久化数据 |
| 67 | +│ ├── rabbitmq Rabbitmq 持久化数据 |
| 68 | +│ └── redis Redis 持久化数据 |
| 69 | +├── logs |
| 70 | +│ ├── mongodb MongoDB 日志 |
| 71 | +│ ├── mysql |
| 72 | +│ │ ├── 5 Mysql5.7 日志 |
| 73 | +│ │ └── 8 Mysql8.0 日志 |
| 74 | +│ ├── nginx Nginx 日志 |
| 75 | +│ ├── php |
| 76 | +│ │ ├── 73 |
| 77 | +│ │ │ ├── log PHP7.3 错误日志与慢日志 |
| 78 | +│ │ │ └── supervisor PHP7.3 里 supervisor 日志 |
| 79 | +│ │ ├── 74 |
| 80 | +│ │ │ ├── log PHP7.4 错误日志与慢日志 |
| 81 | +│ │ │ └── supervisor PHP7.4 里 supervisor 日志 |
| 82 | +│ │ ├── 80 |
| 83 | +│ │ │ ├── log PHP8.0 错误日志与慢日志 |
| 84 | +│ │ │ └── supervisor PHP8.0 里 supervisor 日志 |
| 85 | +│ │ └── 81 |
| 86 | +│ │ ├── log PHP8.1 错误日志与慢日志 |
| 87 | +│ │ └── supervisor PHP8.1 里 supervisor 日志 |
| 88 | +│ └── rabbitmq Rabbitmq 日志 |
| 89 | +├── services |
| 90 | +│ ├── elasticsearch Elasticsearch 配置目录 |
| 91 | +│ ├── mongodb MongoDB 配置目录 |
| 92 | +│ ├── mysql Mysql5.7/Mysql8.0 配置目录 |
| 93 | +│ ├── nginx Nginx 配置目录 |
| 94 | +│ │ ├── conf.d Nginx Vhost 配置目录 |
| 95 | +│ │ └── ssl Nginx 证书目录 |
| 96 | +│ ├── php |
| 97 | +│ │ ├── 73 PHP7.3 配置目录 |
| 98 | +│ │ ├── 74 PHP7.4 配置目录 |
| 99 | +│ │ ├── 80 PHP8.0 配置目录 |
| 100 | +│ │ └── 81 PHP7.1 配置目录 |
| 101 | +│ ├── phpmyadmin phpMyAdmin 配置目录 |
| 102 | +│ ├── rabbitmq Rabbitmq 配置目录 |
| 103 | +│ └── redis Redis 配置目录 |
| 104 | +├── .env.example .env 变量示例配置 |
| 105 | +├── docker-compose.yml.example docker-compose 示例 |
| 106 | +└── www 默认项目代码存放目录 |
| 107 | +``` |
| 108 | + |
| 109 | +## 2. 快速使用 |
| 110 | + |
| 111 | +1. 环境要求 |
| 112 | + |
| 113 | + - Windows |
| 114 | + |
| 115 | + - 安装 [Docker Desktop](https://www.docker.com/products/docker-desktop/) |
| 116 | + - 安装 `wsl2`,建议安装 Ubuntu:`wsl --install -d Ubuntu` |
| 117 | + - 在 `Docker Desktop` 启用 `Use the WSL 2 base engine` |
| 118 | + - 在 `Docker Desktop` 启用 `WSL Integration` |
| 119 | + - 因为 `wsl2` 文件有挂载性能问题,该项目**必须**放在 `wsl2` 系统内,而不能放在 `/mnt/c` 或 `/mnt/d` 这种挂载目录下 |
| 120 | + - 项目代码也建议放在 `wsl2` 系统内,使用 `vscode` 或 `phpstorm` 进行编辑开发 |
| 121 | + |
| 122 | + - Linux |
| 123 | + |
| 124 | + - 安装 [Docker](https://docs.docker.com/engine/install/) |
| 125 | + - 安装 [Docker Compose](https://docs.docker.com/compose/install/) |
| 126 | + |
| 127 | + - MacOS |
| 128 | + |
| 129 | + - 没有苹果电脑故无法尝试,后续补充 |
| 130 | + |
| 131 | +2. `clone` 项目 |
| 132 | + |
| 133 | + > 建议 [**fork**](https://github.com/suyar/docker-php-env/fork) 本项目,方便针对自己的开发需求做定制。 |
| 134 | +
|
| 135 | + ``` |
| 136 | + # git clone [email protected]:suyar/docker-php-env.git |
| 137 | + ``` |
| 138 | +
|
| 139 | +3. 初始化项目 |
| 140 | +
|
| 141 | + 该操作会初始化目录权限和相关文件: |
| 142 | +
|
| 143 | + ``` |
| 144 | + # cd docker-php-env |
| 145 | + # git config core.filemode false |
| 146 | + # sudo chmod +x dpe.sh |
| 147 | + # sudo ./dpe.sh init |
| 148 | + ``` |
| 149 | +
|
| 150 | + 执行完成后,根据自己的需求,对 `.env` 文件和 `docker-compose.yml` 进行定制。 |
| 151 | +
|
| 152 | +4. 启动项目 |
| 153 | +
|
| 154 | + ``` |
| 155 | + # sudo docker-compose up -d |
| 156 | + ``` |
| 157 | +
|
| 158 | +5. 在浏览器中访问:`http://localhost` 或 `http://127.0.0.1`,初始页面会显示 `404`。 |
| 159 | +
|
| 160 | +## 3. PHP 扩展 |
| 161 | +
|
| 162 | +### 3.1 PHP 预置扩展 |
| 163 | +
|
| 164 | +PHP 镜像默认安装了下列扩展,暂不支持重新安装指定版本扩展,如果确实有需要,推荐用 [**[DNMP]**](https://github.com/yeszao/dnmp),也可以 fork 本项目后,参照 [docker-php](https://github.com/suyar/docker-php) 自己构建。 |
| 165 | +
|
| 166 | +``` |
| 167 | +[PHP Modules] |
| 168 | +amqp |
| 169 | +apcu |
| 170 | +bcmath |
| 171 | +bz2 |
| 172 | +calendar |
| 173 | +Core |
| 174 | +ctype |
| 175 | +curl |
| 176 | +date |
| 177 | +decimal |
| 178 | +dom |
| 179 | +enchant |
| 180 | +event |
| 181 | +exif |
| 182 | +fileinfo |
| 183 | +filter |
| 184 | +ftp |
| 185 | +gd |
| 186 | +gettext |
| 187 | +gmp |
| 188 | +hash |
| 189 | +iconv |
| 190 | +igbinary |
| 191 | +imagick |
| 192 | +intl |
| 193 | +json |
| 194 | +libxml |
| 195 | +lzf |
| 196 | +mbstring |
| 197 | +memcached |
| 198 | +mongodb |
| 199 | +msgpack |
| 200 | +mysqli |
| 201 | +mysqlnd |
| 202 | +openssl |
| 203 | +pcntl |
| 204 | +pcre |
| 205 | +PDO |
| 206 | +pdo_mysql |
| 207 | +pdo_pgsql |
| 208 | +pdo_sqlite |
| 209 | +pgsql |
| 210 | +Phar |
| 211 | +posix |
| 212 | +readline |
| 213 | +redis |
| 214 | +Reflection |
| 215 | +session |
| 216 | +SimpleXML |
| 217 | +sockets |
| 218 | +sodium |
| 219 | +SPL |
| 220 | +sqlite3 |
| 221 | +standard |
| 222 | +swoole |
| 223 | +tidy |
| 224 | +timezonedb |
| 225 | +tokenizer |
| 226 | +uuid |
| 227 | +xlswriter |
| 228 | +xml |
| 229 | +xmlreader |
| 230 | +xmlwriter |
| 231 | +xsl |
| 232 | +yac |
| 233 | +yaml |
| 234 | +Zend OPcache |
| 235 | +zip |
| 236 | +zlib |
| 237 | + |
| 238 | +[Zend Modules] |
| 239 | +Zend OPcache |
| 240 | +``` |
| 241 | +
|
| 242 | +### 3.2 安装 PHP 扩展 |
| 243 | +
|
| 244 | +除了预置的扩展,如果你还想安装其他扩展,可以直接执行: |
| 245 | +
|
| 246 | +``` |
| 247 | +# sudo docker-compose exec php81 install-php-extensions xxx |
| 248 | +``` |
| 249 | +
|
| 250 | +支持的扩展在这边可以在这边查看:[docker-php-extension-installer](https://github.com/mlocati/docker-php-extension-installer#supported-php-extensions)。 |
| 251 | +
|
| 252 | +> 这种方式安装扩展和 DNMP 的方式不同,通过这种方式安装的扩展,在容器销毁后重新创建,不会保留,需要重新安装。 |
| 253 | +
|
| 254 | +### 3.3 在 PHP 容器中执行命令 |
| 255 | +
|
| 256 | +``` |
| 257 | +# sudo docker-compose exec php81 bash |
| 258 | +root@08240e17170e:/www# php -v |
| 259 | +``` |
| 260 | +
|
| 261 | +这里移除了 DNMP 中使用 `alias` 的方式在 Host 主机中执行 PHP 命令。 |
| 262 | +
|
| 263 | +### 3.4 使用 composer |
| 264 | +
|
| 265 | +``` |
| 266 | +# sudo docker-compose exec php81 bash |
| 267 | +root@08240e17170e:/www# composer install |
| 268 | +``` |
| 269 | +
|
| 270 | +这里移除了 DNMP 中使用 `alias` 的方式在 Host 主机中执行 `composer` 命令。 |
| 271 | +
|
| 272 | +## 4 常见问题 |
| 273 | +
|
| 274 | +### 4.1 如何在其他容器中请求 nginx 配置的域名 |
| 275 | +
|
| 276 | +在 `docker-compose.yml` 文件中,修改 `nginx` 服务的 `aliases` 配置,把 `nginx` 相关的域名配置成别名: |
| 277 | +
|
| 278 | +``` |
| 279 | + nginx: |
| 280 | + image: nginx:${NGINX_VERSION} |
| 281 | + environment: |
| 282 | + TZ: ${TZ} |
| 283 | + volumes: |
| 284 | + - ${DIR_SERVICES}/nginx/nginx.conf:/etc/nginx/nginx.conf |
| 285 | + - ${DIR_SERVICES}/nginx/conf.d:/etc/nginx/conf.d |
| 286 | + - ${DIR_SERVICES}/nginx/ssl:/etc/nginx/ssl |
| 287 | + - ${DIR_LOGS}/nginx:/var/log/nginx |
| 288 | + - ${DIR_SOURCE}:/www |
| 289 | + working_dir: /www |
| 290 | + ports: |
| 291 | + - "${NGINX_HTTP_HOST_PORT}:80" |
| 292 | + - "${NGINX_HTTPS_HOST_PORT}:443" |
| 293 | + networks: |
| 294 | + default: |
| 295 | + aliases: |
| 296 | + - example.laravel.me |
| 297 | + - test.biz.me |
| 298 | + restart: unless-stopped |
| 299 | + logging: |
| 300 | + driver: "json-file" |
| 301 | + options: |
| 302 | + max-size: "10m" |
| 303 | + max-file: "1" |
| 304 | +``` |
| 305 | +
|
| 306 | +### 4.2 在 PHP 容器中使用 cron 定时任务 |
| 307 | +
|
| 308 | +这里以 `php81` 容器举例: |
| 309 | +
|
| 310 | +1. 在 `DIR_SOURCE` 所在的目录或项目中,增加一个文件,例如创建 `www/laravel/schedule` 文件,并把定时任务写在里面: |
| 311 | +
|
| 312 | +``` |
| 313 | +* * * * * cd /www/laravel && php artisan schedule:run >> /dev/null 2>&1 |
| 314 | +``` |
| 315 | +
|
| 316 | +2. 进入 PHP 容器,添加定时任务: |
| 317 | +
|
| 318 | +``` |
| 319 | +# sudo docker compose exec php81 bash |
| 320 | +# cd /www/laravel |
| 321 | +# crontab -f schedule |
| 322 | +``` |
| 323 | +
|
| 324 | +### 4.3 在 PHP 容器中使用 supervisor |
| 325 | +
|
| 326 | +这里以 `php81` 容器举例: |
| 327 | +
|
| 328 | +1. 修改 `services/php/81/supervisor.conf` 的内容 |
| 329 | +2. 重启 `php81` 容器 |
| 330 | +
|
| 331 | +### 4.4 清空服务数据 |
| 332 | +
|
| 333 | +在某些情况下,你可能需要清空各种生成的数据,重新初始化开发环境, |
| 334 | +
|
| 335 | +> 该操作是风险操作,会清空所有初始化数据!!! |
| 336 | +
|
| 337 | +``` |
| 338 | +# sudo docker-compose down |
| 339 | +# ./dpe.sh clean |
| 340 | +# ./dpe.sh init |
| 341 | +``` |
| 342 | +
|
| 343 | +## License |
| 344 | +
|
| 345 | +MIT |
0 commit comments