DNMP (Docker + Nginx/Openresty + MySQL5,8 + PHP5,7,8 + Redis + ElasticSearch + MongoDB + RabbitMQ) est un programme d'installation LNMP complet en un clic qui prend en charge Arm CPU .
Il existe quelques recommandations sur les opportunités d’emploi à l’étranger. Les amis intéressés peuvent y jeter un œil.
100%
open source100%
conforme aux standards Dockerpdo_mysql
, mysqli
, mbstring
, gd
, curl
, opcache
, etc., et peut être configuré de manière flexible en fonction de l'environnement.100%
install-php-extensions apcu
/
├── data 数据库数据目录
│ ├── esdata ElasticSearch 数据目录
│ ├── mongo MongoDB 数据目录
│ ├── mysql MySQL8 数据目录
│ └── mysql5 MySQL5 数据目录
├── services 服务构建文件和配置文件目录
│ ├── elasticsearch ElasticSearch 配置文件目录
│ ├── mysql MySQL8 配置文件目录
│ ├── mysql5 MySQL5 配置文件目录
│ ├── nginx Nginx 配置文件目录
│ ├── php PHP5.6 - PHP7.4 配置目录
│ ├── php54 PHP5.4 配置目录
│ └── redis Redis 配置目录
├── logs 日志目录
├── docker-compose.sample.yml Docker 服务配置示例文件
├── env.smaple 环境配置示例文件
└── www PHP 代码目录
- `git`
- `Docker`(系统需为Linux,Windows 10 Build 15063+,或MacOS 10.12+,且必须要`64`位)
- `docker-compose 1.7.0+`
clone
le projet : ```
$ git clone https://github.com/yeszao/dnmp.git
```
root
, vous devez également ajouter l'utilisateur actuel au groupe d'utilisateurs docker
: ```
$ sudo gpasswd -a ${USER} docker
```
copy
) et démarrez : ```
$ cd dnmp # 进入项目目录
$ cp env.sample .env # 复制环境变量文件。note:安装php扩展请查看文档中的3.2小节
$ cp docker-compose.sample.yml docker-compose.yml # 复制 docker-compose 配置文件。默认启动3个服务:
# Nginx、PHP7和MySQL8。要开启更多其他服务,如Redis、
# PHP5.6、PHP5.4、MongoDB,ElasticSearch等,请删
# 除服务块前的注释
$ docker-compose up # 启动
```
http://localhost
ou https://localhost
(démo HTTPS auto-signée) pour voir l'effet Le code PHP est dans le fichier ./www/localhost/index.php
. Tout d'abord, vous devez démarrer d'autres versions de PHP, telles que PHP5.4, puis supprimer les commentaires devant PHP5.4 dans le fichier docker-compose.yml
, puis démarrer le conteneur PHP5.4.
Une fois PHP5.4 démarré, ouvrez la configuration Nginx et modifiez l'adresse hôte de fastcgi_pass
de php
à php54
, comme suit :
fastcgi_pass php:9000;
pour:
fastcgi_pass php54:9000;
où php
et php54
sont les noms des serveurs dans le fichier docker-compose.yml
.
Enfin, redémarrez Nginx pour prendre effet.
$ docker exec -it nginx nginx -s reload
Il y a deux nginx
ici, le premier est le nom du conteneur et le second est le programme nginx
dans le conteneur.
De nombreuses fonctions de PHP sont implémentées via des extensions, et l'installation d'extensions est un processus légèrement fastidieux. Par conséquent, en plus des extensions intégrées de PHP, nous n'installons que quelques extensions par défaut dans le fichier env.sample
. installez plus d'extensions, veuillez ouvrir votre fichier .env
et modifier la configuration PHP suivante, en ajoutant les extensions PHP requises :
PHP_EXTENSIONS=pdo_mysql,opcache,redis # PHP 要安装的扩展列表,英文逗号隔开
PHP54_EXTENSIONS=opcache,redis # PHP 5.4要安装的扩展列表,英文逗号隔开
Reconstruisez ensuite l'image PHP.
docker-compose build php
Pour les extensions disponibles, consultez le bloc de commentaires env.sample
dans le même fichier.
1. Entrez le conteneur :
docker exec -it php /bin/sh
install-php-extensions apcu
2. Prise en charge de l'installation rapide de la liste d'extensions
Extension | PHP8.4 | PHP8.3 | PHP8.2 | PHP8.1 | PHP8.0 | PHP7.4 | PHP7.3 | PHP7.2 | PHP7.1 | PHP7.0 | PHP5.6 | PHP5.5 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
amqp | ||||||||||||
apcu | ||||||||||||
apcu_bc | ||||||||||||
ast | ||||||||||||
bcmath | ||||||||||||
jeu de bits | ||||||||||||
feu noir | ||||||||||||
bz2 | ||||||||||||
calendrier | ||||||||||||
cassandre* | ||||||||||||
marque C | ||||||||||||
CSV | ||||||||||||
dba | ||||||||||||
trace* | ||||||||||||
décimal | ||||||||||||
ds | ||||||||||||
ecma_intl* | ||||||||||||
enchanter | ||||||||||||
ev | ||||||||||||
événement | ||||||||||||
excimer | ||||||||||||
exif | ||||||||||||
ffi | ||||||||||||
FTP | ||||||||||||
dieu | ||||||||||||
réducteur | ||||||||||||
géoip | ||||||||||||
géos* | ||||||||||||
géospatial | ||||||||||||
obtenir du texte | ||||||||||||
gmagick | ||||||||||||
gmp | ||||||||||||
gnupg | ||||||||||||
grpc | ||||||||||||
http | ||||||||||||
igbinaire | ||||||||||||
imagick | ||||||||||||
imap | ||||||||||||
inotifier | ||||||||||||
interbase | ||||||||||||
international | ||||||||||||
ion | ||||||||||||
ioncube_loader | ||||||||||||
jsmin | ||||||||||||
json_post | ||||||||||||
jsonpath | ||||||||||||
ldap | ||||||||||||
Luasandbox | ||||||||||||
lz4* | ||||||||||||
zf | ||||||||||||
analyse de courrier | ||||||||||||
maxminddb | ||||||||||||
mcrypt | ||||||||||||
cache mémoire | ||||||||||||
memcaché | ||||||||||||
memprof* | ||||||||||||
mongo | ||||||||||||
mongodb | ||||||||||||
moustique | ||||||||||||
pack de messages | ||||||||||||
mssql | ||||||||||||
mysql | ||||||||||||
mysqli | ||||||||||||
nouvelle relique | ||||||||||||
oauth | ||||||||||||
oci8 | ||||||||||||
odbc | ||||||||||||
cache d'exploitation | ||||||||||||
recensement ouvert | ||||||||||||
laine ouverte | ||||||||||||
télémétrie ouverte | ||||||||||||
parallèle* | ||||||||||||
parle* | ||||||||||||
pcntl | ||||||||||||
PCOV | ||||||||||||
pdo_dblib | ||||||||||||
pdo_firebird | ||||||||||||
pdo_mysql | ||||||||||||
pdo_oci | ||||||||||||
pdo_odbc | ||||||||||||
pdo_pgsql | ||||||||||||
pdo_sqlsrv | ||||||||||||
pgsql | ||||||||||||
faucon | ||||||||||||
php_trie | ||||||||||||
php* | ||||||||||||
pkcs11 | ||||||||||||
pq | ||||||||||||
propro | ||||||||||||
protobuf | ||||||||||||
pspell | ||||||||||||
psr | ||||||||||||
fils de discussion* | ||||||||||||
raphf | ||||||||||||
rdkafka | ||||||||||||
recoder | ||||||||||||
redis | ||||||||||||
relais | ||||||||||||
saxon* | ||||||||||||
mercliquez | ||||||||||||
journal de mer | ||||||||||||
shmop | ||||||||||||
simdjson* | ||||||||||||
client PME | ||||||||||||
vif | ||||||||||||
snmp | ||||||||||||
snuffleupagus | ||||||||||||
savon | ||||||||||||
prises | ||||||||||||
sodium* | ||||||||||||
solr | ||||||||||||
gardien de la source | ||||||||||||
spx | ||||||||||||
sqlsrv* | ||||||||||||
ssh2 | ||||||||||||
piétiner | ||||||||||||
laine | ||||||||||||
sybase_ct | ||||||||||||
synchroniser | ||||||||||||
sysvmsg | ||||||||||||
système | ||||||||||||
système | ||||||||||||
tenseur | ||||||||||||
marées | ||||||||||||
rangé | ||||||||||||
timezonedb | ||||||||||||
uopz | ||||||||||||
progression du téléchargement | ||||||||||||
uuide | ||||||||||||
UV | ||||||||||||
VIP* | ||||||||||||
vld | ||||||||||||
xx | ||||||||||||
wikidiff2* | ||||||||||||
xdebug | ||||||||||||
xdiff | ||||||||||||
xhpr | ||||||||||||
xlswriter | ||||||||||||
xmldiff | ||||||||||||
xmlrpc | ||||||||||||
xpass* | ||||||||||||
xsl | ||||||||||||
ouais | ||||||||||||
yaml | ||||||||||||
année | ||||||||||||
zephir_parser | ||||||||||||
fermeture éclair | ||||||||||||
zq | ||||||||||||
gardien de zoo | ||||||||||||
zstd |
Nombre d'extensions prises en charge : 150
Cette extension provient de https://github.com/mlocati/docker-php-extension-installer Exemple de fichier de référence
~/.bashrc
de l'hôte. source ~ /.bashrc
~ php -v
PHP 7.2.13 (cli) (built: Dec 21 2018 02:22:47) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.13, Copyright (c) 1999-2018, by Zend Technologies
with Xdebug v2.6.1, Copyright (c) 2002-2018, by Derick Rethans
Méthode 1 : utilisez la commande composer sur l'hôte
~/dnmp
, alors le chemin du cache de composer est ~/dnmp/data/composer
.~/.bashrc
de l'hôte.Ce qu'il faut noter ici, c'est que le répertoire
~/dnmp/data/composer
dans le fichier d'exemple doit être le répertoire déterminé lors de la première étape.
source ~ /.bashrc
cd ~ /dnmp/www/
composer create-project yeszao/fastphp project --no-dev
~/dnmp/data/composer
. Vous pouvez spécifier l'entrepôt national dans ce fichier, par exemple : {
"config" : {},
"repositories" : {
"packagist" : {
"type" : " composer " ,
"url" : " https://mirrors.aliyun.com/composer/ "
}
}
}
Méthode 2 : utilisez la commande composer dans le conteneur
Il existe une autre façon, qui consiste à entrer dans le conteneur puis à exécuter la commande composer
. Prenons l'exemple du conteneur PHP7 :
docker exec -it php /bin/sh
cd /www/localhost
composer update
Pour gérer le service, ajoutez le nom du serveur après la commande, par exemple :
$ docker-compose up # 创建并且启动所有容器
$ docker-compose up -d # 创建并且后台运行方式启动所有容器
$ docker-compose up nginx php mysql # 创建并且启动nginx、php、mysql的多个容器
$ docker-compose up -d nginx php mysql # 创建并且已后台运行的方式启动nginx、php、mysql容器
$ docker-compose start php # 启动服务
$ docker-compose stop php # 停止服务
$ docker-compose restart php # 重启服务
$ docker-compose build php # 构建或者重新构建服务
$ docker-compose rm php # 删除并且停止php容器
$ docker-compose down # 停止并删除容器,网络,图像和挂载卷
Pendant le développement, nous pouvons souvent utiliser docker exec -it
pour entrer dans le conteneur. C'est une méthode sans problème pour créer des alias de commande couramment utilisés.
Tout d’abord, vérifiez les conteneurs disponibles sur l’hôte :
$ docker ps # 查看所有运行中的容器
$ docker ps -a # 所有容器
La colonne de sortie NAMES
est le nom du conteneur si la configuration par défaut est utilisée, le nom est nginx
, php
, php56
, mysql
, etc.
Ensuite, ouvrez le fichier ~/.bashrc
ou ~/.zshrc
et ajoutez :
alias dnginx= ' docker exec -it nginx /bin/sh '
alias dphp= ' docker exec -it php /bin/sh '
alias dphp56= ' docker exec -it php56 /bin/sh '
alias dphp54= ' docker exec -it php54 /bin/sh '
alias dmysql= ' docker exec -it mysql /bin/bash '
alias dredis= ' docker exec -it redis /bin/sh '
Il sera très rapide de saisir le conteneur la prochaine fois. Par exemple, saisissez le conteneur php :
$ dphp
ifconfig docker0
Utilisé pour renseigner l'adresse hosts
du conteneur extra_hosts
pour accéder à la machine hôte
L'emplacement où le fichier journal est généré dépend de la valeur de chaque configuration de journal sous conf.
Le journal Nginx est le journal que nous utilisons le plus, nous le mettons donc séparément dans le log
du répertoire racine.
Le répertoire log
mappe le répertoire /var/log/nginx
du conteneur Nginx, donc dans le fichier de configuration Nginx, où le journal doit être généré, nous devons le configurer dans le répertoire /var/log/nginx
, tel que :
error_log /var/log/nginx/nginx.localhost.error.log warn;
Dans la plupart des cas, les journaux PHP-FPM seront affichés dans les journaux Nginx, aucune configuration supplémentaire n'est donc requise.
De plus, il est recommandé d'ouvrir le journal des erreurs directement en PHP :
error_reporting ( E_ALL );
ini_set ( ' error_reporting ' , ' on ' );
ini_set ( ' display_errors ' , ' on ' );
Si vous en avez vraiment besoin, suivez les étapes pour l'ouvrir (dans le conteneur).
$ 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
conf/php-fpm.conf
sur l'hôte, recherchez la ligne suivante, supprimez le commentaire et remplacez la valeur par : php_admin_value[error_log] = /var/log/php/php-fpm.error.log
Étant donné que MySQL dans le conteneur MySQL est démarré par l'utilisateur mysql
, il ne peut pas ajouter lui-même de fichiers journaux sous /var/log
. Par conséquent, nous plaçons le journal MySQL dans le même répertoire que les données, c'est-à-dire sous le répertoire mysql
du projet, correspondant au répertoire /var/log/mysql/
du conteneur.
slow-query-log-file = /var/log/mysql/mysql.slow.log
log-error = /var/log/mysql/mysql.error.log
Ce qui précède est la configuration du fichier journal dans mysql.conf.
Par défaut, ce projet n'active pas phpMyAdmin pour la gestion en ligne MySQL et phpRedisAdmin pour la gestion en ligne Redis dans docker-compose.yml
Ils peuvent être modifiés ou supprimés selon les besoins.
L'adresse du port mappée par le conteneur phpMyAdmin sur l'hôte est : 8080
, donc l'adresse pour accéder à phpMyAdmin sur l'hôte est :
http://localhost:8080
Informations de connexion MySQL :
3306
L'adresse du port mappée par le conteneur phpRedisAdmin sur l'hôte est : 8081
, donc l'adresse pour accéder à phpMyAdmin sur l'hôte est :
http://localhost:8081
Les informations de connexion Redis sont les suivantes :
6379
Pour une utilisation dans un environnement de production :
Reportez-vous à ce numéro : #91
Docker utilise des tâches planifiées cron
L'heure du conteneur est configurée avec la variable TZ
dans le fichier .env. Pour tous les fuseaux horaires pris en charge, veuillez consulter la liste des fuseaux horaires · Wikipédia ou la liste des fuseaux horaires pris en charge par PHP · Site officiel de PHP.
Cela peut être divisé en deux situations,
Le premier cas, en code PHP .
// 连接MySQL
$ dbh = new PDO ( ' mysql:host=mysql;dbname=mysql ' , ' root ' , ' 123456 ' );
// 连接Redis
$ redis = new Redis ();
$ redis -> connect ( ' redis ' , 6379 );
Étant donné que le conteneur et le conteneur sont connectés via le port expose
et se trouvent dans les mêmes networks
, le paramètre host
de la connexion utilise directement le nom du conteneur et port
est le port à l'intérieur du conteneur. Pour plus d'informations, veuillez vous référer à « La différence entre les ports Docker-compose et Expose ».
Dans le second cas, connectez-vous via la ligne de commande ou Navicat et d'autres outils sur l'hôte . Si l'hôte souhaite connecter MySQL et Redis, le conteneur doit mapper le port à l'hôte via ports
. En prenant mysql comme exemple, il existe ports
dans le fichier docker-compose.yml
: 3306:3306
, ce qui signifie que le port 3306 de l'hôte et le port 3306 du conteneur forment un mappage, nous pouvons donc nous connecter comme ce:
$ mysql -h127.0.0.1 -uroot -p123456 -P3306
$ redis-cli -h127.0.0.1
Le paramètre host
ne peut pas utiliser localhost ici car il communique avec mysql via le fichier sock par défaut, et le conteneur et le système de fichiers hôte ont été isolés, il doit donc être connecté via TCP, donc l'adresse IP doit être spécifiée.
1. L'hôte exécute ifconfig docker0
pour obtenir inet
, qui est l'adresse ip
à connecter.
$ 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
...
2. Exécutez la ligne de commande Mysql hôte
mysql > GRANT ALL PRIVILEGES ON * . * TO ' root ' @ ' % ' IDENTIFIED BY ' 123456 ' WITH GRANT OPTION;
mysql > flush privileges;
// 其中各字符的含义:
// * . * 对任意数据库任意表有效
// " root " " 123456 " 是数据库用户名和密码
// ' % ' 允许访问数据库的IP地址,%意思是任意IP,也可以指定IP
// flush privileges 刷新权限信息
3. Connectez-vous ensuite directement au conteneur php en utilisant 172.0.17.1:3306
8.0.28
ou supérieure du serveur mysql, la version PHP nécessite 7.4.7
ou supérieure pour se connecter.Comment générer un nom de conteneur lorsque le nom du conteneur n'est pas spécifié
MIT