基于 https://github.com/yeszao/dnmp,参考 https://github.com/guanguans/dnmp-plusphp
DNMP(Docker + Nginx + MySQL + PHP7/5 + Redis)是一款全功能的 LNMP 一键安装程序。html
DNMP 项目特色:mysql
100%
开源
100%
遵循 Docker 标准
pdo_mysql
、
mysqli
、
mbstring
、
gd
、
curl
、
opcache
等经常使用热门扩展,根据环境灵活配置
100%
可用
install-php-extensions apcu
plus = xhgui
+ xhprof
+ tideways
nginx
dnmp-plus = PHPer 的一键安装开发环境
+ PHP 非侵入式监控平台(优化系统性能、定位 Bug 的神器)
laravel
dnmp-plus 在 yeszao 的 DNMP 基础上新增:git
git clone https://gitee.com/zouzhipeng/my-dnmp.git dnmp
复制代码
cd dnmp && docker-compose up -d
复制代码
视网络状况,可能须要等待十几分钟。若是没法下载,考虑使用代理。github
http://localhost
, you will see:PHP7.4 已能够知足大部分需求,PHP5.x 相关已删除。web
PHP 的不少功能都是经过扩展实现,而安装扩展是一个略费时间的过程, 因此,除 PHP 内置扩展外,在 env.sample
文件中咱们仅默认安装少许扩展, 若是要安装更多扩展,请打开你的.env
文件修改以下的 PHP 配置, 增长须要的 PHP 扩展:redis
PHP_EXTENSIONS=pdo_mysql,opcache,redis # PHP 要安装的扩展列表,英文逗号隔开
复制代码
须要先修改 docker-compose.yml
的 php 部分,注释掉 image,并开启 build,以下sql
php:
# image: zzpwestlife/dnmp_php_xhgui:v1.0 build: context: ./services/php args: PHP_VERSION: php:${PHP_VERSION}-fpm-alpine CONTAINER_PACKAGE_URL: ${CONTAINER_PACKAGE_URL} PHP_EXTENSIONS: ${PHP_EXTENSIONS} TZ: "$TZ" 复制代码
而后从新 build PHP 镜像。
docker-compose build php
复制代码
可用的扩展请看同文件的 env.sample
注释块说明。
docker exec -it php /bin/sh
install-php-extensions extension-name 复制代码
很是方便。可用扩展列表见 https://github.com/mlocati/docker-php-extension-installer
php-cli
)如在 mac 中,就不须要再单独安装 php,直接使用 docker 中的 php 便可。
参考 bash.alias.sample 示例文件,将对应 php cli 函数拷贝到主机的 ~/.bashrc
文件。 (或者 ~/.zshrc
,视具体状况而定)
# php7 cli
php () { tty= tty -s && tty=--tty docker run \ $tty \ --interactive \ --rm \ --volume $PWD:/www:rw \ --workdir /www \ zzpwestlife/dnmp_php_xhgui:v1.0 php "$@" } 复制代码
若是从新 build 过镜像,zzpwestlife/dnmp_php_xhgui:v1.0
须要改成 dnmp-php
让文件起效:
source ~/.bashrc
# source ~/.zshrc 复制代码
而后就能够在主机中执行 php 命令了:
~ php -v PHP 7.4.1 (cli) (built: Jan 18 2020 03:27:33) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.1, Copyright (c), by Zend Technologies with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans 复制代码
方法 1:主机中使用 composer 命令
肯定 composer 缓存的路径。好比,个人 dnmp 下载在 /Users/zouzhipeng/www/work/dnmp
目录,那 composer 的缓存路径就是 /Users/zouzhipeng/www/work/dnmp/data/composer
。
参考 bash.alias.sample 示例文件,将对应 php composer 函数拷贝到主机的 ~/.bashrc
(~/.zshrc
)
# php7 composer
composer () { tty= tty -s && tty=--tty docker run \ $tty \ --interactive \ --rm \ --user www-data:www-data \ --volume ~//Users/zouzhipeng/www/work/dnmp/data/composer:/tmp/composer \ --volume $(pwd):/app \ --workdir /app \ zzpwestlife/dnmp_php_xhgui:v1.0 composer "$@" } 复制代码
一样,若是从新 build 过镜像,zzpwestlife/dnmp_php_xhgui:v1.0
须要改成 dnmp-php
让文件生效:
source ~/.bashrc
复制代码
在主机的任何目录下就能用 composer 了:
cd ~/dnmp/www/
~ composer -V Composer version 1.10.7 2020-06-03 10:03:56 复制代码
方法二:容器内使用 composer 命令
还有另一种方式,就是进入容器,再执行 composer
命令,以 PHP7 容器为例:
docker exec -it php /bin/sh
cd /www/localhost composer -V 复制代码
Log 文件生成的位置依赖于 conf 下各 log 配置的值。
Nginx 日志是咱们用得最多的日志,因此咱们单独放在根目录 log
下。
log
会目录映射 nginx 容器的 /var/log/nginx
目录,因此在 Nginx 配置文件中,须要输出 log 的位置,咱们须要配置到 /var/log/nginx
目录,如:
error_log /var/log/nginx/nginx.localhost.error.log warn;
复制代码
大部分状况下,PHP-FPM 的日志都会输出到 nginx 的日志中,因此不须要额外配置。
另外,建议直接在 PHP 中打开错误日志:
error_reporting(E_ALL);
ini_set('error_reporting', 'on'); ini_set('display_errors', 'on'); 复制代码
若是确实须要,可按一下步骤开启(在容器中)。
进入容器,建立日志文件并修改权限:
$ docker exec -it php /bin/sh
$ mkdir /var/log/php $ cd /var/log/php $ touch php-fpm.error.log $ chmod a+w php-fpm.error.log 复制代码
主机上打开并修改 PHP-FPM 的配置文件
conf/php-fpm.conf
复制代码
,找到以下一行,删除注释,并改值为:
php_admin_value[error_log] = /var/log/php/php-fpm.error.log
复制代码
重启 PHP-FPM 容器。
由于 MySQL 容器中的 MySQL 使用的是 mysql
用户启动,它没法自行在 /var/log
下的增长日志文件。因此,咱们把 MySQL 的日志放在与 data 同样的目录,即项目的 mysql
目录下,对应容器中的 /var/lib/mysql/
目录。
slow-query-log-file = /var/lib/mysql/mysql.slow.log
log-error = /var/lib/mysql/mysql.error.log 复制代码
以上是 mysql.conf 中的日志文件的配置。
本项目默认在 docker-compose.yml
中开启了用于 MySQL 在线管理的 phpMyAdmin,以及用于 redis 在线管理的 phpRedisAdmin,能够根据须要修改或删除。
phpMyAdmin 容器映射到主机的端口地址是:8080
,因此主机上访问 phpMyAdmin 的地址是:
http://localhost:8080
复制代码
MySQL 链接信息:
3306
Mac 上建议使用 Sequel Pro 管理 MySQL。
phpRedisAdmin 容器映射到主机的端口地址是:8081
,因此主机上访问 phpMyAdmin 的地址是:
http://localhost:8081
复制代码
Redis 链接信息以下:
6379
Mac 上可使用 AnotherRedisDesktopManager 管理 redis
要在正式环境中使用,请:
参考这个 issue:https://github.com/yeszao/dnmp/issues/91
容器时间在.env 文件中配置 TZ
变量,全部支持的时区请看时区列表・维基百科或者 PHP 所支持的时区列表・PHP 官网。
这要分两种状况,
第一种状况,在 PHP 代码中。
// 链接MySQL
$dbh = new PDO('mysql:host=mysql;dbname=mysql', 'root', '123456'); // 链接Redis $redis = new Redis(); $redis->connect('redis', 6379); 复制代码
由于容器与容器是 expose
端口联通的,并且在同一个 networks
下,因此链接的 host
参数直接用容器名称,port
参数就是容器内部的端口。更多请参考《docker-compose ports 和 expose 的区别》。
第二种状况,在主机中经过命令行或者 Navicat 等工具链接。主机要链接 mysql 和 redis 的话,要求容器必须通过 ports
把端口映射到主机了。以 mysql 为例,docker-compose.yml
文件中有这样的 ports
配置:3306:3306
,就是主机的 3306 和容器的 3306 端口造成了映射,因此咱们能够这样链接:
$ mysql -h127.0.0.1 -uroot -p123456 -P3306 $ redis-cli -h127.0.0.1 复制代码
这里 host
参数不能用 localhost 是由于它默认是经过 sock 文件与 mysql 通讯,而容器与主机文件系统已经隔离,因此须要经过 TCP 方式链接,因此须要指定 IP。
ifconfig docker0
获得
inet
就是要链接的
ip
地址 (没法验证)
$ ifconfig docker0 docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 ... 复制代码
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql>flush privileges; // 其中各字符的含义: // *.* 对任意数据库任意表有效 // "root" "123456" 是数据库用户名和密码 // '%' 容许访问数据库的IP地址,%意思是任意IP,也能够指定IP // flush privileges 刷新权限信息 复制代码
172.0.17.1:3306
链接便可
cd www/xhgui-branch
composer install 复制代码
修改 xhgui-branch 配置文件 www/xhgui-branch/config/config.default.php
<?php
return [ ... 'debug' => true, // 改成true,便于调试 'mode' => 'development', ... 'extension' => 'tideways', // 改成支持 PHP7 的 tideways ... 'save.handler' => 'mongodb', 'db.host' => 'mongodb://mongo:27017', // 127.0.0.1 改成 mongo 'db.options' => [ // .env 中配置的 mongodb 帐号密码 'username' => 'root', 'password' => '123456', ], ... ]; 复制代码
hosts 文件中增长
127.0.0.1 xhgui.test
复制代码
浏览器访问 xhgui.test
cd www
mkdir -p laravel/public vim laravel/public/index.php 复制代码
services/nginx/conf.d
添加一个配置文件
server {
listen 80;
server_name laravel.test;
root /www/laravel/public;
index index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
access_log /dev/null;
#access_log /var/log/nginx/nginx.laravel.access.log main;
error_log /var/log/nginx/nginx.laravel.error.log warn;
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# Run our specified PHP script before executing the main program
fastcgi_param PHP_VALUE "auto_prepend_file=/www/xhgui-branch/external/header.php";
}
}
复制代码
$ docker-compose restart nginx
复制代码
使用 PHPstorm 打开项目。Preferences->Languages & Frameworks ->PHP
的 CLI Interpreter
,点击右侧的三个点,点击弹出的窗口中左上角加号,选择第一个
下一步要选择 docker,而不是 docker compose。 选择所需的 php 容器。点击 OK
回到上一步的窗口。这里能够显示 php 及扩展相关信息。
保存。回到上一步对话窗口。
设置目录映射。先设置 Docker container。
而后设置 path mapping,与 docker container 一致便可。保存。
打开 Run -> Edit configuration 对话窗口。如图,按顺序配置。
左上角,添加一个 PHP Web Page.
点击 Server 后面的三个点。配置一个 server,并设置好 Host 和 Path mapping
保存,回到上一级会话窗口。
点击 validate,能够看到一排对勾。
配置完成,在代码中打断点,打开小电话,请求页面或接口,就能够开始调试了。