1. requirements
- git
- docker app
- docker-compose
- docker login
- Может понадобиться наука-обучение-серфинг-сеть
- разрешения корневой учетной записи
2. Основы
На основе https://github.com/yeszao/dnmp см. https://github.com/guanguans/dnmp-plus
2.1 DNMP
DNMP (Docker + Nginx + MySQL + PHP7/5 + Redis) — полнофункциональныйУстановщик LNMP в один клик.
Особенности проекта DNMP:
-
100%
открытый источник -
100%
Соблюдайте стандарты Docker - служба поддержкиНесколько версий PHPСосуществование, можно переключать произвольно (PHP5.4, PHP5.6, PHP7.1, PHP7.2, PHP7.3)
- поддержка привязкилюбое количество доменов
- служба поддержкиHTTPS и HTTP/2
- Исходный код PHP, данные MySQL, файлы конфигурации, файлы журналовМожет быть напрямую изменен и просмотрен в хосте
- встроенныйПолная установка расширения PHPЗаказ
- Поддержка по умолчанию
pdo_mysql
,mysqli
,mbstring
,gd
,curl
,opcache
и другие популярные популярные расширения, гибко настраиваемые в соответствии с окружением - Общие услуги можно выбрать одним щелчком мыши:
- Несколько версий PHP: PHP5.4, PHP5.6, PHP7.1-7.3
- Веб-сервисы: Nginx, Openresty
- База данных: MySQL5, MySQL8, Redis, memcached, MongoDB, ElasticSearch
- Очередь сообщений: RabbitMQ
- Вспомогательные инструменты: Kibana, Logstash, phpMyAdmin, phpRedisAdmin, AdminMongo
- применение в реальных проектах для обеспечения
100%
доступный - Все изображения взяты изОфициальный репозиторий докера, Безопасный и надежный
- После настройкиВиндовс, Линукс, Макосвсе доступно
- Поддержка команды расширения быстрой установки
install-php-extensions apcu
2.2 dnmp-plus
plus = xhgui
+ xhprof
+ tideways
dnmp-plus = PHPer 的一键安装开发环境
+ PHP 非侵入式监控平台(优化系统性能、定位 Bug 的神器)
dnmp-plusсуществуетyeszaoизDNMPДобавлено в базу:
- PHP-расширение xhprof- Инструмент отслеживания и анализа производительности PHP, разработанный Facebook.
- Расширение для приливов PHP- Форк xhprof, поддерживает PHP7
- PHP-расширение mongodb
- Служба MongoDB
- Mongo Express — система управления сервисами MongoDB.
- xhgui- система xhprof GUI для анализа данных данных
3. Шаги
3.1. clone project
git clone https://gitee.com/zouzhipeng/my-dnmp.git dnmp
3.2. install
cd dnmp && docker-compose up -d
В зависимости от условий сети это может занять более десяти минут. Если загрузка невозможна, рассмотрите возможность использования прокси.
3.3. Go to your browser and type http://localhost
, you will see:
PHP7.4 смог удовлетворить большинство потребностей, связанные с PHP5.x были удалены.
3.4 Установите расширение PHP
Многие функции РНР реализованы через расширения, а установка расширений — это немного трудоемкий процесс, поэтому помимо встроенных в РНР расширений,env.sample
Мы устанавливаем только несколько расширений по умолчанию в файле, если вы хотите установить больше расширений, пожалуйста, откройте свой.env
Файл изменен на следующую конфигурацию PHP, добавив необходимые расширения PHP:
PHP_EXTENSIONS=pdo_mysql,opcache,redis # PHP 要安装的扩展列表,英文逗号隔开
надо сначала переделатьdocker-compose.yml
php, закомментируйте изображение и начните сборку, как показано ниже.
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"
Затем пересоберите образ PHP.
docker-compose build php
Доступные расширения видят тот же файлenv.sample
Описание блока комментариев.
3.5 Быстрая установка расширения php
- В контейнер:
docker exec -it php /bin/sh
install-php-extensions extension-name
Очень удобно. Список доступных расширений можно найти по адресу https://github.com/mlocati/docker-php-extension-installer.
4. Используйте
4.1 Использование командной строки php на хосте (php-cli
)
Например, в Mac вам не нужно отдельно устанавливать php, вы можете напрямую использовать 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 "$@" }
Если изображение перестроено,
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
4.2 Использование композитора
Способ 1: использование команды composer на хосте
-
Определяет путь к кешу композитора. Например, моя загрузка dnmp находится по адресу
/Users/zouzhipeng/www/work/dnmp
каталог, путь кеша композитора/Users/zouzhipeng/www/work/dnmp/data/composer
. -
Ссылаясь на пример файла bash.alias.sample, скопируйте соответствующую функцию компоновщика php на хост
~/.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 "$@" }
Аналогично, если изображение перестроено,
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
Способ 2: используйте команду composer в контейнере
Есть еще один способ, то есть войти в контейнер, а затем выполнитьcomposer
Команда, в качестве примера возьмем контейнер PHP7:
docker exec -it php /bin/sh
cd /www/localhost
composer -V
5. Использование журнала
Местоположение, в котором создается файл журнала, зависит от значения каждой конфигурации журнала в conf.
5.1 журнал nginx
Журналы Nginx — это журналы, которые мы используем чаще всего, поэтому мы помещаем их в корневой каталог отдельно.log
Вниз.
log
Будет ли каталог отображать контейнер nginx/var/log/nginx
каталог, поэтому в файле конфигурации Nginx нам нужно вывести местоположение журнала, нам нужно настроить/var/log/nginx
каталог, например:
error_log /var/log/nginx/nginx.localhost.error.log warn;
5.2 Журналы PHP-FPM
В большинстве случаев логи 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.
5.3 Журналы MySQL
Поскольку MySQL в контейнере MySQL используетmysql
по инициативе пользователя, он не может работать самостоятельно/var/log
Добавьте файлы журнала в. Поэтому мы помещаем журнал MySQL в ту же директорию, что и данные, то есть каталог проекта.mysql
каталог, соответствующий/var/lib/mysql/
содержание.
slow-query-log-file = /var/lib/mysql/mysql.slow.log
log-error = /var/lib/mysql/mysql.error.log
Выше приведена конфигурация файла журнала в mysql.conf.
6. Управление базой данных
Этот проект по умолчаниюdocker-compose.yml
Включено онлайн-управление MySQL вphpMyAdmin, а для онлайн-управления RedisphpRedisAdmin, который можно изменить или удалить по мере необходимости.
6.1 phpMyAdmin
Адрес порта, на котором контейнер phpMyAdmin сопоставляется с хостом:8080
, поэтому адрес для доступа к phpMyAdmin на хосте:
http://localhost:8080
Информация о подключении к MySQL:
- хост: (контейнерная сеть MySQL для этого проекта)
- порт:
3306
- имя пользователя: (введите вручную в интерфейсе phpmyadmin)
- пароль: (введите вручную в интерфейсе phpmyadmin)
Для управления MySQL на Mac рекомендуется использовать Sequel Pro.
6.2 phpRedisAdmin
Адрес порта, на котором контейнер phpRedisAdmin сопоставляется с хостом:8081
, поэтому адрес для доступа к phpMyAdmin на хосте:
http://localhost:8081
Информация о подключении Redis выглядит следующим образом:
- хост: (контейнерная сеть Redis для этого проекта)
- port:
6379
AnotherRedisDesktopManager можно использовать для управления Redis на Mac.
7. Безопасное использование в формальной среде
Для использования в производственной среде:
- Отключить отладку XDebug в php.ini
- Расширенные политики безопасности для доступа к базе данных MySQL.
- Расширенная политика безопасности для доступа к Redis
8 часто задаваемых вопросов
8.1 Как использовать curl в PHP-коде?
Обратитесь к этой проблеме: https://github.com/yeszao/dnmp/issues/91.
8.2 Docker использует cron для планирования задач
Docker использует cron для планирования задач
8.3 Время контейнера Docker
Время контейнера настраивается в файле .envTZ
переменная, см. все поддерживаемые часовые поясаСписок часовых поясов・ВикипедияилиСписок часовых поясов, поддерживаемых PHP・Официальный сайт PHP.
8.4 Как подключиться к серверам MySQL и Redis
Есть два случая,
В первом случае вв PHP-коде.
// 连接MySQL
$dbh = new PDO('mysql:host=mysql;dbname=mysql', 'root', '123456');
// 连接Redis
$redis = new Redis();
$redis->connect('redis', 6379);
Поскольку контейнер и контейнерexpose
порт подключен, и в том жеnetworks
вниз, так связаноhost
Параметр напрямую использует имя контейнера,port
Параметр — это порт внутри контейнера. Для получения дополнительной информации см.«Разница между портами для создания докеров и экспозицией».
Во втором случаев хостепройти черезКомандная строкаили 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, потому что по умолчанию он взаимодействует с mysql через файл sock, а контейнер и файловая система хоста изолированы, поэтому ему необходимо подключиться через TCP, поэтому необходимо указать IP.
8.5 Как php в контейнере подключается к хосту MySQL
- выполнение хоста
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
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql>flush privileges;
// 其中各字符的含义:
// *.* 对任意数据库任意表有效
// "root" "123456" 是数据库用户名和密码
// '%' 允许访问数据库的IP地址,%意思是任意IP,也可以指定IP
// flush privileges 刷新权限信息
- Затем используйте контейнер php напрямую
172.0.17.1:3306
Просто подключитесь
9. xhgui
9.1 Установка
cd www/xhgui-branch
composer install
Измените файл конфигурации xhgui-ветки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
10. Как добавить элементы
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";
}
}
перезапустить nginx
$ docker-compose restart nginx
Откройте в браузере http://laravel.test, а затем посетитеxhgui.test, контент уже доступен в это время, и наслаждайтесь отслеживанием производительности и анализом проекта.
11. Отладка точки останова xdebug
Откройте проект с помощью PHPstorm.Preferences->Languages & Frameworks ->PHP
изCLI Interpreter
, нажмите на три точки справа, нажмите на плюсик в левом верхнем углу всплывающего окна и выберите первый
Следующим шагом будет выбор docker, а не docker compose. Выберите нужный контейнер php. Нажмите ОК
Вернитесь в предыдущее окно. Здесь вы можете отобразить информацию, связанную с php и расширением.
спасти. Вернитесь к предыдущему диалоговому окну.
Настройте сопоставление каталогов. Сначала настройте контейнер Docker.
Затем установите сопоставление пути, чтобы оно соответствовало контейнеру докеров. спасти.
Откройте диалоговое окно Выполнить -> Изменить конфигурацию. Как показано на рисунке, настройте их по порядку.
В левом верхнем углу добавьте веб-страницу PHP.
Щелкните три точки за сервером. Настройте сервер и настройте отображение хоста и пути
Сохраните, вернитесь в предыдущее окно сеанса.
Нажмите «Подтвердить», чтобы увидеть ряд галочек.
После того, как конфигурация завершена, в коде есть точки останова, откройте маленький телефон, запросите страницу или интерфейс, и вы можете начать отладку.