DNMP (Docker + Nginx/Openresty + MySQL5,8 + PHP5,7,8 + Redis + ElasticSearch + MongoDB + RabbitMQ) es un programa de instalación LNMP con todas las funciones con un solo clic que admite Arm CPU .
Hay algunas recomendaciones para oportunidades laborales en el extranjero. Los amigos que estén interesados pueden echar un vistazo.
100%
código abierto100%
compatible con los estándares Dockerpdo_mysql
, mysqli
, mbstring
, gd
, curl
, opcache
, etc., y se puede configurar de manera flexible según el entorno.100%
de disponibilidad.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
proyecto: ```
$ git clone https://github.com/yeszao/dnmp.git
```
root
, también debe agregar el usuario actual al grupo de usuarios docker
: ```
$ sudo gpasswd -a ${USER} docker
```
copy
) y comience: ```
$ 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
o https://localhost
(demostración HTTPS autofirmada) para ver el efecto. El código PHP está en el archivo ./www/localhost/index.php
. Primero, debe iniciar otras versiones de PHP, como PHP5.4, luego eliminar los comentarios delante de PHP5.4 en el archivo docker-compose.yml
y luego iniciar el contenedor PHP5.4.
Después de iniciar PHP5.4, abra la configuración de Nginx y modifique la dirección de host de fastcgi_pass
de php
a php54
, de la siguiente manera:
fastcgi_pass php:9000;
para:
fastcgi_pass php54:9000;
Donde php
y php54
son los nombres de los servidores en el archivo docker-compose.yml
.
Finalmente, reinicie Nginx para que surta efecto.
$ docker exec -it nginx nginx -s reload
Aquí hay dos nginx
, el primero es el nombre del contenedor y el segundo es el programa nginx
en el contenedor.
Muchas funciones de PHP se implementan a través de extensiones y la instalación de extensiones es un proceso que lleva un poco de tiempo. Por lo tanto, además de las extensiones integradas de PHP, solo instalamos algunas extensiones de forma predeterminada en el archivo env.sample
. instale más extensiones, abra su archivo .env
y modifique la siguiente configuración de PHP, agregando las extensiones PHP requeridas:
PHP_EXTENSIONS=pdo_mysql,opcache,redis # PHP 要安装的扩展列表,英文逗号隔开
PHP54_EXTENSIONS=opcache,redis # PHP 5.4要安装的扩展列表,英文逗号隔开
Luego reconstruya la imagen PHP.
docker-compose build php
Para conocer las extensiones disponibles, consulte el bloque de comentarios env.sample
en el mismo archivo para obtener una descripción.
1. Ingrese al contenedor:
docker exec -it php /bin/sh
install-php-extensions apcu
2. Admite instalación rápida de la lista de extensiones
Extensión | PHP 8.4 | PHP 8.3 | PHP 8.2 | PHP 8.1 | PHP 8.0 | PHP 7.4 | PHP 7.3 | PHP 7.2 | PHP 7.1 | PHP 7.0 | PHP 5.6 | PHP 5.5 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
amqp | ||||||||||||
apcu | ||||||||||||
apcu_bc | ||||||||||||
ast | ||||||||||||
bcmmatemáticas | ||||||||||||
conjunto de bits | ||||||||||||
fuego negro | ||||||||||||
bz2 | ||||||||||||
calendario | ||||||||||||
casandra* | ||||||||||||
marcar | ||||||||||||
csv | ||||||||||||
dba | ||||||||||||
ddtraza* | ||||||||||||
decimal | ||||||||||||
ds | ||||||||||||
ecma_intl* | ||||||||||||
encantar | ||||||||||||
ev | ||||||||||||
evento | ||||||||||||
excímero | ||||||||||||
exif | ||||||||||||
ffi | ||||||||||||
ftp | ||||||||||||
dios | ||||||||||||
mecánico | ||||||||||||
geoip | ||||||||||||
geos* | ||||||||||||
geoespacial | ||||||||||||
obtener texto | ||||||||||||
gmagick | ||||||||||||
gmp | ||||||||||||
gruñido | ||||||||||||
grpc | ||||||||||||
http | ||||||||||||
igbinario | ||||||||||||
imaginario | ||||||||||||
mapa | ||||||||||||
inotificar | ||||||||||||
interbase | ||||||||||||
internacional | ||||||||||||
ion | ||||||||||||
cargador_ioncube | ||||||||||||
jsmín | ||||||||||||
json_post | ||||||||||||
jsonpath | ||||||||||||
ldap | ||||||||||||
luasandbox | ||||||||||||
lz4* | ||||||||||||
zf | ||||||||||||
analizar correo | ||||||||||||
maxminddb | ||||||||||||
mcrypt | ||||||||||||
memcache | ||||||||||||
memcached | ||||||||||||
memprof* | ||||||||||||
mongo | ||||||||||||
mongodb | ||||||||||||
mosquito | ||||||||||||
paquete de mensajes | ||||||||||||
mssql | ||||||||||||
MySQL | ||||||||||||
mysqli | ||||||||||||
nuevareliquia | ||||||||||||
juramento | ||||||||||||
oci8 | ||||||||||||
odbc | ||||||||||||
opcache | ||||||||||||
censo abierto | ||||||||||||
lana abierta | ||||||||||||
telemetría abierta | ||||||||||||
paralelo* | ||||||||||||
hablar* | ||||||||||||
pcntl | ||||||||||||
pcov | ||||||||||||
pdo_dblib | ||||||||||||
pdo_firebird | ||||||||||||
pdo_mysql | ||||||||||||
pdo_oci | ||||||||||||
pdo_odbc | ||||||||||||
pdo_pgsql | ||||||||||||
pdo_sqlsrv | ||||||||||||
pgsql | ||||||||||||
falcón | ||||||||||||
php_trie | ||||||||||||
phpy* | ||||||||||||
pkcs11 | ||||||||||||
pq | ||||||||||||
proprio | ||||||||||||
protobuf | ||||||||||||
pspell | ||||||||||||
psr | ||||||||||||
hilos* | ||||||||||||
rapf | ||||||||||||
rdkafka | ||||||||||||
recodificar | ||||||||||||
Redistribuir | ||||||||||||
relé | ||||||||||||
sajón* | ||||||||||||
clic en el mar | ||||||||||||
marisco | ||||||||||||
smop | ||||||||||||
simdjson* | ||||||||||||
cliente smb | ||||||||||||
rápido | ||||||||||||
SNMP | ||||||||||||
snuffleupagus | ||||||||||||
jabón | ||||||||||||
enchufes | ||||||||||||
sodio* | ||||||||||||
Solr | ||||||||||||
guardián de la fuente | ||||||||||||
spx | ||||||||||||
sqlsrv* | ||||||||||||
ssh2 | ||||||||||||
pisar muy fuerte | ||||||||||||
lana | ||||||||||||
sybase_ct | ||||||||||||
sincronizar | ||||||||||||
sistemavmsg | ||||||||||||
sistemavsem | ||||||||||||
sistemavshm | ||||||||||||
tensor | ||||||||||||
mareas | ||||||||||||
ordenado | ||||||||||||
zona horariadb | ||||||||||||
uopz | ||||||||||||
progreso de carga | ||||||||||||
UUID | ||||||||||||
ultravioleta | ||||||||||||
VIP* | ||||||||||||
vld | ||||||||||||
xx | ||||||||||||
wikidiff2* | ||||||||||||
xdebug | ||||||||||||
xdiff | ||||||||||||
xhpr | ||||||||||||
escritorxls | ||||||||||||
diferencia xml | ||||||||||||
xmlrpc | ||||||||||||
xpass* | ||||||||||||
xsl | ||||||||||||
yac | ||||||||||||
yaml | ||||||||||||
año | ||||||||||||
zephir_parser | ||||||||||||
cremallera | ||||||||||||
zq | ||||||||||||
cuidador del zoológico | ||||||||||||
zstd |
Número de extensiones admitidas: 150
Esta extensión proviene de https://github.com/mlocati/docker-php-extension-installer Archivo de muestra de referencia
~/.bashrc
del host. 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étodo 1: utilizar el comando Composer en el host
~/dnmp
, entonces la ruta de caché del compositor es ~/dnmp/data/composer
.~/.bashrc
del host.Lo que hay que tener en cuenta aquí es que el directorio
~/dnmp/data/composer
en el archivo de ejemplo debe ser el directorio determinado en el primer paso.
source ~ /.bashrc
cd ~ /dnmp/www/
composer create-project yeszao/fastphp project --no-dev
~/dnmp/data/composer
. Puede especificar el almacén nacional en este archivo, por ejemplo: {
"config" : {},
"repositories" : {
"packagist" : {
"type" : " composer " ,
"url" : " https://mirrors.aliyun.com/composer/ "
}
}
}
Método 2: usar el comando compositor en el contenedor
Hay otra forma, que es ingresar al contenedor y luego ejecutar el comando composer
. Tome el contenedor PHP7 como ejemplo:
docker exec -it php /bin/sh
cd /www/localhost
composer update
Para administrar el servicio, agregue el nombre del servidor después del comando, por ejemplo:
$ 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 # 停止并删除容器,网络,图像和挂载卷
Durante el desarrollo, a menudo podemos usar docker exec -it
para ingresar al contenedor. Es un método sin problemas para crear alias de comandos de uso común.
Primero, verifique los contenedores disponibles en el host:
$ docker ps # 查看所有运行中的容器
$ docker ps -a # 所有容器
La columna NAMES
de salida es el nombre del contenedor. Si se utiliza la configuración predeterminada, el nombre es nginx
, php
, php56
, mysql
, etc.
Luego, abra el archivo ~/.bashrc
o ~/.zshrc
y agregue:
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 '
Será muy rápido ingresar al contenedor la próxima vez. Por ejemplo, ingrese al contenedor php:
$ dphp
ifconfig docker0
Se utiliza para completar la dirección hosts
del contenedor extra_hosts
para acceder a la máquina host
La ubicación donde se genera el archivo de registro depende del valor de cada configuración de registro en conf.
El registro de Nginx es el registro que más utilizamos, por lo que lo colocamos por separado en el log
del directorio raíz.
El directorio log
asigna el directorio /var/log/nginx
del contenedor Nginx, por lo que en el archivo de configuración de Nginx, donde se debe generar el registro, debemos configurarlo en el directorio /var/log/nginx
, como por ejemplo:
error_log /var/log/nginx/nginx.localhost.error.log warn;
En la mayoría de los casos, los registros de PHP-FPM se enviarán a los registros de Nginx, por lo que no se requiere configuración adicional.
Además, se recomienda abrir el registro de errores directamente en PHP:
error_reporting ( E_ALL );
ini_set ( ' error_reporting ' , ' on ' );
ini_set ( ' display_errors ' , ' on ' );
Si realmente lo necesitas, sigue los pasos para abrirlo (en el contenedor).
$ 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
en el host, busque la siguiente línea, elimine el comentario y cambie el valor a: php_admin_value[error_log] = /var/log/php/php-fpm.error.log
Debido a que MySQL en el contenedor MySQL lo inicia el usuario mysql
, no puede agregar archivos de registro en /var/log
por sí solo. Por lo tanto, colocamos el registro de MySQL en el mismo directorio que los datos, es decir, en el directorio mysql
del proyecto, correspondiente al directorio /var/log/mysql/
en el contenedor.
slow-query-log-file = /var/log/mysql/mysql.slow.log
log-error = /var/log/mysql/mysql.error.log
Lo anterior es la configuración del archivo de registro en mysql.conf.
De forma predeterminada, este proyecto no habilita phpMyAdmin para la administración en línea de MySQL y phpRedisAdmin para la administración en línea de redis en docker-compose.yml
Se pueden modificar o eliminar según sea necesario.
La dirección del puerto asignada por el contenedor phpMyAdmin al host es: 8080
, por lo que la dirección para acceder a phpMyAdmin en el host es:
http://localhost:8080
Información de conexión MySQL:
3306
La dirección del puerto asignada por el contenedor phpRedisAdmin al host es: 8081
, por lo que la dirección para acceder a phpMyAdmin en el host es:
http://localhost:8081
La información de conexión de Redis es la siguiente:
6379
Para uso en un entorno de producción:
Consulte este número: #91
Docker usa tareas programadas cron
La hora del contenedor se configura con la variable TZ
en el archivo .env. Para todas las zonas horarias compatibles, consulte la lista de zonas horarias·Wikipedia o la lista de zonas horarias compatibles con el sitio web oficial de PHP·PHP.
Esto se puede dividir en dos situaciones,
El primer caso, en código PHP .
// 连接MySQL
$ dbh = new PDO ( ' mysql:host=mysql;dbname=mysql ' , ' root ' , ' 123456 ' );
// 连接Redis
$ redis = new Redis ();
$ redis -> connect ( ' redis ' , 6379 );
Debido a que el contenedor y el contenedor están conectados a través del puerto expose
y están en la misma networks
, el parámetro host
de la conexión usa directamente el nombre del contenedor y port
es el puerto dentro del contenedor. Para obtener más información, consulte "La diferencia entre los puertos Docker-compose y Expose".
En el segundo caso, conéctese a través de la línea de comando o Navicat y otras herramientas en el host . Si el host quiere conectar mysql y redis, el contenedor debe asignar el puerto al host a través de ports
. Tomando mysql como ejemplo, existe ports
en el archivo docker-compose.yml
: 3306:3306
, lo que significa que el puerto 3306 del host y el puerto 3306 del contenedor forman un mapeo, por lo que podemos conectarnos como este:
$ mysql -h127.0.0.1 -uroot -p123456 -P3306
$ redis-cli -h127.0.0.1
El parámetro host
no puede usar localhost aquí porque se comunica con mysql a través del archivo sock de forma predeterminada, y el contenedor y el sistema de archivos del host han sido aislados, por lo que debe conectarse a través de TCP, por lo que se debe especificar la IP.
1. El host ejecuta ifconfig docker0
para obtener inet
, que es la dirección ip
a la que se conectará.
$ 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. Ejecute la línea de comando del host Mysql
mysql > GRANT ALL PRIVILEGES ON * . * TO ' root ' @ ' % ' IDENTIFIED BY ' 123456 ' WITH GRANT OPTION;
mysql > flush privileges;
// 其中各字符的含义:
// * . * 对任意数据库任意表有效
// " root " " 123456 " 是数据库用户名和密码
// ' % ' 允许访问数据库的IP地址,%意思是任意IP,也可以指定IP
// flush privileges 刷新权限信息
3. Luego conéctese directamente al contenedor php usando 172.0.17.1:3306
8.0.28
o superior del servidor mysql, la versión PHP requiere 7.4.7
o superior para conectarse.Cómo generar un nombre de contenedor cuando no se especifica el nombre del contenedor
MIT