Esta es la segunda publicación de nuestra serie Docker + WordPress, por lo que si aún no lo ha leído, hágalo para atraparlo. Antes de continuar con la adición de WordPress para mezclar, revisemos la configuración que tenemos actualmente; Como decidimos usar NGINX en lugar de Apache, tuvimos que construir dos Dockers. Este enfoque fomenta el principio de responsabilidad única, pero también trae algunos problemas a la mezcla. El más grande es el mantenimiento necesario de dos imágenes separadas, con un código fuente casi idéntico: debe instalar WordPress y establecer volúmenes y variaciones ambientales apropiadas en ambas. Esto puede conducir rápidamente a problemas que no deberían aparecer primero. Pero ahora, conocemos las reglas del juego, pensemos en violarlos. Estos son los tres escenarios posibles para usar imágenes de Docker para nuestro proyecto:
Dos imágenes separadas, una ejecutando PHP-FPM y el otro Ningx
La misma imagen con PHP-FPM y Nginx en el interior, que se ejecuta en contenedores separados con diferentes comandos iniciales
Una sola imagen y contenedor que ejecuta dos procesos
Como con la mayoría de los software, se limita a las preferencias personales de los desarrolladores y, a veces, vale la pena romper algunas reglas para la comodidad (WordPress lo hace todo el tiempo), por lo que iré con la Opción 3: ejecutaremos ambos procesos.En el artículo anterior, creamos dos DockerFiles, por lo que para continuar, tenemos que decidir ahora en qué dos se convertirán (y el único), el que se basa en Nginx o el que tiene PHP-FPM.Nuevamente, la respuesta puede ser que depende, pero para mí, la decisión se basa en las complejidades que trae la instalación de cualquiera de los dos.Debido a que PHP-FPM es más complejo, confiaré en nuestra imagen principal en esto y dejaré que alguien con más experiencia que yo se preocupe.
Entonces, continúe, elimine dockerfile.php-fpm que hemos creado en nuestro tutorial anterior y también elimine todo nuestro contenido principal de Dockerfile. Luego, ingrese las directivas de la Directiva y el Mintainer: desde PHP: 7.0.6-fpm-alpino Mintainer Tomaz Zaman Instalación de paquetes a nivel de todo el sistema, agregue todas las adicciones necesarias que la imagen necesita Para correr correcto: ejecute apk add-no cache ningin mysql-client supervisor curl bash redis imageMagick-devójame revisarlos y explicar por qué cada uno es necesario: -ninx no requiere explicaciones, debemos servir al sitio en la web -Mysql-Client es necesario para que el WP se conecte a nuestra imagen MySQL-SuperVisor nos permite ejecutar más procesos (más al respecto al final del artículo) -Curl para descargar archivos de la red web es un shell muy popular ( Alpine se entrega con Shell AlmQuist-Redis permitirá que WP se conecte a nuestra imagen Redis (velocidad! Velocidad) -Imagemagick-Dev viene con todas las bibliotecas gráficas necesarias para nuestros medios
(Tenga en cuenta la barra oblicua inversa en la directiva: así es como los comandos de Linux se separan en múltiples líneas para mayor claridad) Instalando extensiones de PHP con todos los programas y bibliotecas necesarios, es hora de configurar PHP, o más bien, instalar todas las extensiones de PHP que WordPress necesita ejecutar. Agregue esta directiva: ejecute apk add-no-cache libbtool build-base autoconf && docker -php-ext-install -j (gat -c ^procesador/proc/cpuinfo 2>/dev/null || 1) iconv gd mbstring Filiinfo curl xmlreader xmlwriter spl ftp mysqli opcache && pecl instal imagick && docker -php-exable imagick && apk del libbool build-base autoconf Vai! Es grande, ¿verdad? Pero, como descubrirá ahora, este es un modelo bastante común en la construcción de imágenes de Docker, se llama un orden encadenado; Solo tiene que tomar más pedidos que desea ejecutar y unirse con símbolos dobles (&&). Esto es importante, como hemos aprendido en el artículo anterior, los resultados de cada directiva Dockerfile se almacenan en caché y se combinan en la imagen final, lo que agrega un peso significativo (en términos de megalecto) a la imagen final, sin ningún beneficio.
Caso específico: el paquete Build-Base requiere ~ 200 MB e instala varias herramientas de compilación que se utilizan solo para construir (compilar) paquetes-imagick en nuestro caso, pero son completamente inútiles una vez que se ha construido la imagen. Incorrectamente, podríamos hacer esto y continuar funcionando: ejecute APK ADD-No-Cache Libtool Buil-Base Autoconf Ejecutar Instalar Imagick Run -Php-Out-Enable Ejecutar APK del Libtool Build-Base Autocon con todo esto, porque cada directiva se almacena en caché independiente, la imagen final se agrega ~ 200 MB y, peor aún, porque eliminamos esos paquetes de compilación de la última directiva, se vuelven inaccesibles/innecesarios y dentro del contenedor, por lo que la mayoría de los Docker oficiales (como PHP) Las imágenes usan el modelo de cadena. Después de haber notado, también instalamos una extensión PHP que no es obligatoria, pero muy recomendable, porque acelera significativamente a WordPress sin ninguna configuración: Opcache. PHP es un lenguaje interpretado, lo que significa que cada vez que un visitante solicita index.php, PHP-FPM debe cargar y compilar todos los archivos PHP necesarios en un código que la computadora puede comprender, lo que requiere una cantidad significativa de CPU y ciclos de memoria. Lo que hace OpCache es guardar el resultado de esa compilación (llamada Bytecode u Opcode) en la memoria, de modo que en la siguiente llamada de script, PHP pueda cargar esa versión en lugar de compilarla desde cero nuevamente. No hay lectura en el disco duro y ninguna compilación es equivalente a un mejor rendimiento.
Instalación de WordPress con todas las adicciones de PHP en su lugar, es hora de instalar WordPress, pero antes de eso, para revisar el tema de las variables ambientales. Queremos actualizar la imagen de Docker como rápida, indolora y posible, por lo que estableceremos algunas variables ambientales que estarán disponibles en todo el sistema y nos ayudaremos a acortar algunos de los comandos posteriores, porque podemos acceder a ellas en Shell. con el signo de dólar, similar a la forma en que accedemos a ellos en PHP. Pon estas líneas en Dockerfile aún más: Env WP_ROOT/USR/SRC/WordPress Env WP_Version 4.5.2 Env WP_SHA1 BAB94003A5D2285F6AE76407E7B1BBBBB75382C36E Env WP_download_Url https:///WLESS.org la cantidad de control y la cantidad de Url de la descarga. Lo más importante es, por supuesto, la versión, seguida de la cantidad de control, que garantiza que el archivo descargado sea realmente correcto: esto es importante si el director de descarga ha sido pirateado y WordPress ha sido inyectado con malware. Como resultado, la cantidad de control no sería correcta y su pedido fallaría. Puede encontrar comprobaciones de archivos en la página de descarga de WordPress.
WP_ROOT y WP_DOWNLOAD_URL son accesos directos convenientes y no tienen ningún efecto en la instalación de WordPress en sí, pero es lógico tenerlos todos en un solo lugar, ya que generalmente define las variables utilizadas al comienzo del script. Ahora es el momento de descargar WordPress, verificar la cantidad de control y extraerlo en $ WP_ROOT: Ejecutar curl -o wordpress.tar.gz -sl $ wp_download_url && echo “$ wp_sha *wordpress.tar.gz” | Sha1sum -c -&& tar -xzf wordpress.tar.gz -c (dirname $ wp_root) && rm wordpress.tar.gz ejecutar addUser -d desplegador -s /bash -g www -data primera directiva descargar tarball wordpress, verificar que lo sea el El archivo no se ha manejado, lo extrae en /usr /src y elimina el tarball original más tarde. Ya no será necesario de este momento en un orden, por las razones explicadas anteriormente. La segunda directiva agrega solo un usuario personalizado en el mismo grupo que WWW -ATA. Esto aumentará la seguridad de nuestra instalación, porque los archivos serán propiedad de este usuario, en lugar de la que se ejecuta nuestro servidor web (estableceremos esos permisos en uno de los próximos pasos cuando todo esté en su lugar). ¿Por qué WordPress está en /usr /src? Para responder esto, veamos las partes importantes del sistema de archivos de WordPress. Se divide en tres secciones principales:
WP-Content es el lugar donde está su funcionalidad personalizada
WP-Config.php es el archivo de configuración que se encuentra en el directorio raíz de WordPress
WordPress Core (todo, desde el director de WordPress, excepto los dos anteriores)
Lo que se realiza la directiva anterior extrae el núcleo de WordPress en un directorio, pero debemos considerar dónde es el más lógico poner el contenido WP, la única parte única de la instalación, y la respuesta está fuera del director básico. ¿Por qué? Porque él es el único director que necesitamos localmente, en el anfitrión, fuera de la imagen. Esto nos permite instalar y/o desarrollar los temas y complementos en el host y mantener esos archivos incluso si el contenedor está cerrado. Para lograr esto, necesitamos dos cosas; En primer lugar, necesitamos tener una directiva de volumen en DockerFile (si olvida lo que hace, revise el artículo anterior), así que agregue estas tres líneas: volúmenes/lima/www/wp-confunt workdir/lime/www/ WP- Contenido Ahora solo necesitamos anunciar WordPress para mirar en/lima/www/wp-account cuando solicitamos archivos del director de contenido WP habitual y podemos hacerlo con WP-Config.php configurado. La configuración de WP-Config.php ahora es el momento de mostrarte algo de magia, y por magia me refiero a una de las fortalezas de Docker. Cree un WP-Config.php vacío en el directorio raíz del proyecto host y coloque el siguiente contenido en él:
$ value) {$ capitalized = stratoUpper ($ key); if (! definido ($ capitalizado)) {define ($ capitalizado, $ valor); }} if (! definido (‘abspath’)) define (‘abspath’, dirname (__ file__). ‘/’); Request_once (abspath. ‘Wpsetings.php’); ¡Brujería! ¡Brujería! No, amigo, el verdadero poder de las variables ambientales. Te dije que sería muy útil, podemos reutilizar la misma configuración, ya sea para el desarrollo, la puesta en escena o la producción, ¡un único wp-config.php para gobernarlos a todos! Su función principal es pasar por todas las variables de entorno y definirlas como constantes PHP, aparte de wp_content_dir, que no se puede cambiar porque Dockerfile espera que el director sea/www/wp -contemplate. NOTA: Este enfoque trae implícitamente otro gran beneficio para la seguridad de nuestra instalación de WordPress. No se codifica ningún valor de producción, por lo que si PHP-FPM falla y NGINX proporciona la versión simple de texto del archivo, un atacante potencial (o simplemente un visitante aleatorio) no puede obtener credenciales en nuestra base de datos o en otras áreas protegidas con contraseña. Ahora, este archivo en sí no es muy útil (porque necesitamos un lugar para definir nuestras constantes), así que creemos uno nuevo, en el que realmente definiremos todos estos valores;
Nómbrelo .nv y póngalo en el directorio del proyecto con contenido, similar (o idéntico, por ahora): # Todo esto está siendo leído por wp-config.php disable_wp_cron = true wp_redis_host = redis db_name = wp db_user = wp db_password = wp db_host = mysql table_prefix = wp_ wp_siteurl = http: // localhost: 8080 wp_debug = true wp_cache_sal = mysite- fs_method = directo # doonaget para actualizar las teatro: https: ///pords.org/ secret-key/1.1/salado / AUTH_KEY=your_auth_key SECURE_AUTH_KEY=your_secure_auth_key LOGGED_IN_KEY=your_logged_in_key NONCE_KEY=your_nonce_key AUTH_SALT=your_auth_salt SECURE_AUTH_SALT=your_secure_auth_salt LOGGED_IN_SALT=your_logged_in_salt NONCE_SALT=your_nonce_salt Când vom rula imaginea pe care o construim, vom anunța Docker să încarce corect acest fișier, But for now, leave it there , tenemos algunas cosas más para poner en nuestro archivo DockerFile, antes de terminar, comenzando con la copia de este wp-config.php en el director de origen y establecer la propiedad/permisos. a él. Agregue las siguientes dos directivas: copiar wp-config.php $ wp_root ejecutor desplegador de chown -r: www-data $ wp_root && chmod 640 $ wp_root/wp-config.php configuración wp-cron la solución oficial para los trabajos de WordPress de cron se rechazó en gran medida por muchos desarrolladores y se limitan a dos razones principales: los sitios de bajo tráfico no lo activarán a tiempo, ya que depende de las visitas
Los sitios con alto tráfico no lo activarán a tiempo, ya que la memoria en caché a menudo evita la llamada de cualquier archivo de WordPress a las visitas
Para resolver esto, decidí deshabilitar por completo WP-CRON (recuerde el entorno DISPLE_WP_CRON anterior) y usar una solución personalizada, que es bastante simple de implementar. Primero, cree un archivo llamado cron.conf en el directorio del proyecto y coloque la siguiente configuración en: # CRON CONFIGURACIÓN, configurado para ejecutar WordPress Cron una vez cada minuto * * * * php /usr/sr/wordpress/wp-clon.php Esta es la sintaxis estándar de Chron que desencadena el WordPress Chron cada minuto; no dude en cambiarla de acuerdo con sus necesidades. Para trabajar, solo tenemos que copiar este archivo en el directorio apropiado y asegurarnos de que los permisos sean correctos. En Alpine Linux, en el que se basa nuestra imagen, ese director es/etc/crontabs, así que ponlo en DockerFile: copiar cron.conf/etc/crontabs/desplegador ejecutar chmod 600/etc/crontabs/despliegue como probablemente haya señalado, en La imagen, el archivo chron.conf se llama implementador, porque este es el usuario que necesitamos para ejecutar nuestro comando cron y el demonio cron entiende esto sin otras configuraciones. (Opcional) Instalación de WP-CLI Si aún no lo ha usado, WP-CLI es una herramienta muy útil para manipular WordPress a través de la línea de comando: puede instalar y activar complementos, puede manejar objetos, opciones, publicaciones de opciones ,. .. como quieras.
Para tenerlo disponible en nuestra imagen, solo tenemos que agregar la siguiente directiva a nuestro archivo Dockerfile: Ejecutar curl -o https://raw.githubusercontante.com/wp-clds/gi-pages/phar/wp-cli . Phar && chmod +x wp-cli.phar && mv wp-cli.phar/usr/local/bin/wp, pero no tenemos todos los componentes para ejecutar esta imagen (mysql), revisaremos este tema (para probar ) Hacia el final de este artículo, pero por ahora, continuemos con la configuración de la última parte de nuestra pila: Ninx. La configuración de NGINX Aunque NGINX ya se ha instalado en nuestra primera directiva, debemos configurarla para que funcione correctamente y se necesitan dos archivos para hacer esto (cree tanto en el directorio del proyecto): ningx.conf, que es el archivo principal de configuración y vhost .conf, que será nuestro host virtual. En nuestro artículo anterior, nos hemos construido en la imagen oficial Nginx, que tiene un archivo de configuración principal, por lo tanto, copie su contenido a Ninx.Conf y cambie solo la línea que dice User Ninx; decir el usuario www -ata; , porque este es el usuario en el que se ejecuta nuestro proceso PHP-FPM y no tiene sentido tener uno diferente para NGINX. Este archivo también tiene una línea muy útil (31), que incluye solo cualquier archivo de configuración que finalice en .conf y esté en /etc/nginx/conf.d/. Esto facilita la creación de cualquier tipo de configuración adicional, la más útil es nuestro principal host virtual. Entonces, coloque el siguiente código en vhost.conf: servidor {server_name _; Lista 80 Depault_Server; Root/usr/src/wordpress; índice index.php index.html; Access_log /dev /stdout; error_log /dev /stdout info;
Ubicación /WP-Content {root /var /www; expira 1m; Access_log Off; add_header cache-control “público”; } Ubicación / {try_files $ uuri $ i / /index.php?$args; } Ubicación ~ .php $ {incluye fastcgi_params; Fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; Fastcgi_param script_filename $ document_root $ fastcgi_script_name; # Opcionalmente, configure el tamaño de carga máxima aquí fastcgi_param php_value “upload_max_filesize = 20m n post_max_size = 20m”; }} Ahora que tenemos ambos archivos en su lugar, debemos copiarlos en la imagen y asegurarnos de que las revistas estén redirigidas (simbólicas) a la salida y error estándar (STDOUT y STDERR): Copiar nginx.conf / etc / ninx /nginx.conf Copy vhost.conf /etc/nginx/conf.d/ ejecutar ln -sf/de/stdout /rl/log/nginx/acces.log && ln -sf/dev/stderr/log/nginx/error. log && chown -r www-data: www-data/lima/lib/ning también cambia el derecho de propiedad/lima/lib/ningx, que es utilizado por Ninx para almacenar en caché y para la carga temporal de archivos en datos www , porque el valor predeterminado es propiedad de NGINX y no usamos ese usuario. (Opcional) Configuración de un punto de entrada Si siguió el elemento anterior, es posible que haya notado un malestar:
Cuando ejecutó $ Docker-Commose Up y visitó el navegador, es posible que haya recibido un error de conexión en la base de datos, pero cuando se actualiza, ya no estaba allí. Esto sucede porque Docker-Compose ejecuta todos los contenedores en un orden algo aleatorio, de modo que el contenedor NING se ha abierto y listo más rápido que MySQL, lo que resulta en un error (a corto plazo). Mientras que en el mundo de PHP, este es un simple malestar, algunas aplicaciones (como Ruby on Rails) ni siquiera comenzarán correctamente si no pueden conectarse a la base de datos durante el inicio. Entonces, el problema que enfrentamos es que no todas las condiciones se cumplieron antes del inicio del contenedor principal, pero afortunadamente, Docker viene con una solución incorporada para esto y se llama directiva de EntryPoint. EntryPoint es simplemente un orden que se ejecuta antes de nuestro pedido principal (directiva CMD) y muchos autores de imagen aprovechan su potencial al escribir scripts de shell personalizados que realizan diversas tareas, como verificar si la base de datos está activa, si las variables del entorno ambiental apropiado son establecer u otras condiciones. Con el propósito de aprender, hacer un script que verifique si nuestro contenedor MySQL acepta conexiones y retrasa la ejecución de nuestro orden principal si no. Haga un nuevo archivo en la raíz del proyecto, llámelo Docker-EntryPoint.sh (este es el nombre más común) e ingrese el siguiente código y no olvide cambiarlo en un ejecutable con $ chmod +x Docker-StatePoint. mierda #!/bin/bash set -e # terminado en la función de errores test_mysql {mysqladmin -h “$ {db_host}” ping} util (test_mysql); do> y 2 echo ”
MySQL no disponible – Dormir. “Sleep 3 hecho> y 2 Echo” MySQL está arriba – Ejecutando el comando. “Ejec” Prueba de la conexión mySQL, luego la superamos a intervalos de 3 segundos hasta que esté listo. Cuando lo ejecutemos, ejecutamos El control principal del contenedor. Si observa cuidadosamente la última línea (ejecutiva “), notará que ejecutamos los argumentos restantes (que es lo que [el correo electrónico protegido]), entonces, ¿cuál es el primer argumento? Es el punto de Entrada! En líneas grandes, si la directiva de EntryPoint está presente, Docker lo pone antes del CMD y ejecuta tanto como un solo comando. Veamos dos ejemplos diferentes: -EntryPoint [“Docker-StatePoint.sh] y CMD [” Ninx “] resultará”] dará como resultado $ ls -al. Esto significa que CMD no tiene que ser un pedido, tal vez Sea solo una lista de argumentos transmitidos al punto de entrada. Cuanto más excave en el Docker, más encontrará este enfoque más fuerte. Ahora que tenemos una comprensión básica de la forma en que funciona el punto de entrada, agregue esto al DockerFile para copiarlo en la imagen y establecer correctamente: copiar Docker-entrypoint.sh/usr/local/bin/entrypoint [“Docker- Entrypoint .sh ”

] Junto con el supervisor, como dije al comienzo del artículo, el supervisor es una parte integral de nuestra configuración, porque violamos el principio de responsabilidad única e intencional.Su descripción oficial dice que es un sistema de control de procesos, es decir, es un proceso principal que se encarga de los procesos infantiles, PHP-FPM y NGINX en nuestro caso.El uso nos permitirá ejecutar un solo comando (inicie el supervisor) y le permita administrar otros procesos a través de un archivo de configuración.Cree ese archivo en el directorio raíz del proyecto, llámelo supervisord.conf e ingrese el siguiente código: [supervisord] nodAemon = true logLevel = debug logFile =/var/log/supervisor.log pidfile =/var/run/supervisord. PID childLogDir =/var/log/supervisor [programa: ninx] command = ning – -G “Daemon Off;”
redirect_stderr = true AutorStart = False StartTries = 0 [Programa: PhP-FPM] Command = PhP-FPM redirect_stderr = True AutorSteart = False StarTrerties = 0 [EventListener: Process] Command = Stop-Supervisor.sh Events = ProcessA_state_stopped, es el estándar estándar Sintaxis de configuración del supervisor, así que verifique la documentación oficial si desea averiguar cómo funciona. En resumen, definimos dos programas que deben supervisarse (como los eventos enumerados. con todos los mayúsculas. Este es, en mi opinión, el enfoque adecuado, porque, por defecto, el supervisor intentará reiniciar un proceso fallido. En un servidor regular o en una máquina virtual, este es un comportamiento deseado, pero en Docker, no es, recuerde, los contenedores Docker se ejecutan bajo un software de administración particular, como Docker Swarm o Kubernetes y queremos que sea el gerente de Contenedor principal, no supervisor. Por lo tanto, cree ese script stop-superervisor.sh en el directorio del proyecto, haga que se ejecute ($ chmod +x stop-superervisor.sh) e ingrese el siguiente código: #!/Bin/bash printf “lerekn”; Mientras lea línea; hacer eco “Evento de supervisor entrante: $ line”> & 2; Kill -3 $ (cat “/var/run/supervisord.pid”) hecho
¡Redis, active el caché de objetos y disfrute de WordPress más rápido! Bonificación y conclusión Aunque todo esto puede parecer un poco abrumador al principio, traen beneficios increíbles a largo plazo. Una vez que haya creado esta imagen, puede usarla de manera efectiva en cualquier número de sitios de WordPress localmente o en producción, y he hecho esto, he presionado esta imagen en el almacén oficial de Docker para que pueda usarla. Para hacerlo, haga uno de los sitios existentes que tiene en el desarrollo, siga estos pasos: 1) Copie sobre Docker-Compose.yml en el director raíz WordPress. 2) Cambie Docker-Compose.yml y cambie las líneas con la compilación :. En la imagen: codeable/wordpress: 4.5.2 (por lo que Docker no buscará un DockerFile, sino más bien descargar una imagen preparada) 3) Cree un archivo .env e ingrese los valores que tiene en el wp-config.php existente . 4) (Opcional) Elimine WP-Admin, WP-Includes y todos los archivos .php del administrador del proyecto. ¡Recuerde, el núcleo de WordPress se ofrece por la imagen! 5) (Opcional) Exportar la base de datos donde la haya usado hasta ahora, colóquela en WP-Account, inicie sesión en el contenedor ($ Docker-Compose Ejecute WordPress/bin/Bash, CD a/www/www/wp-adopción Donde el volcado SQL debe estar e importarlo en nuestro contenedor MySQL) 6) Roll $ Docker-Compose Up 7) ¡Disfruta!
Introducción del desarrollador de WordPress en Docker, la segunda parte
Tags Introducción del desarrollador de WordPress en Docker la segunda parte
homefinance blog