Requisitos Para seguir este tutorial, asegúrese de tener instalado Docker y trabajar en su computadora de desarrollo (verifíquelo ejecutando $ Docker -V en la línea de pedido). No tiene que tener experiencia previa en Docker porque intentaré explicar las cosas desde cero. Si tiene alguna pregunta, no dude en dejar un comentario a continuación. Por último, pero no menos importante, una palabra de precaución; Si bien Docker es aceptado nativo de Linux, requiere una capa adicional para trabajar en Windows y Mac (que, si lo ha instalado, ya lo sabe). Este problema socava fácilmente los beneficios de usar Docker ahora, pero dado que tengo acceso a la versión beta (¡y puede! Aplicar aquí), le aseguro que estos problemas desaparecerán pronto. El problema es que aún tiene que tener un automóvil virtual en funcionamiento, pero la buena parte es solo ejecutar una distribución de Linux de una pequeña envoltura, llamada Boot2Docker.
Entonces, ¿qué es Docker? Para comprender qué es Docker, veamos algunos problemas que enfrentamos (y me refiero a los desarrolladores de WordPress) casi a diario. Todos estábamos en situaciones en las que tuvimos que compartir nuestro código con otro desarrollador (o muchos de ellos). Una vez que enviamos nuestro código a GitHub (usa, git, ¿verdad?) Y intentaron ejecutarlo, no funcionó. Cuando pregunté cuál es el problema, todos respondimos con esta expresión familiar: funciona en mi computadora. Cuando dos desarrolladores trabajan en el mismo proyecto, no parece ser un gran problema: se sientan juntos (o prácticamente), resuelven el problema y esperan documentarlo. Pero, ¿qué sucede cuando hay 20 desarrolladores trabajando en el mismo proyecto? O 50? Las cosas pueden deshacerse del control rápidamente. Lo mismo es cierto para la producción. ¿Cuántas veces ha escrito un código, lo probó localmente, pero cuando fue implementado en producción enfrentó la pantalla blanca de la muerte? Ahora imagine un equipo de 20 desarrolladores que tienen lugar en el mismo entorno de producción. Se pierde una loca cantidad de tiempo con DevOps en lugar de en el desarrollo. Lo que se traduce en cantidades locas de dinero, porque alguien tiene que pagar por el tiempo dedicado a estos problemas. Veamos un paso atrás y veamos algunos posibles culpables que causan estos problemas: – diferentes versiones de WordPress (y/o complementos). – Diferentes versiones de PHP – diferentes versiones del servidor web (Apache/Nginx). – Diferentes versiones de MySQL: sistema operativo completamente diferente: diferentes configuraciones de lo anterior (límites de memoria/CPU, módulos instalados)
Entonces, ¿qué es lo que Docker trae a la mesa? Una cosa: consistencia. Garantiza que el entorno será idéntico, sin importar dónde lo ejecute; A nivel local, en 50 computadoras diferentes, en un entorno CI (integración continua) o en producción, funcionará exactamente igual, porque usará el mismo entorno y código. Estos problemas, por supuesto, no son nuevos y había una alternativa que al menos ha intentado mitigar los problemas de inconsistencia: vagabundo. Al igual que Docker, ofrece una receta para construir entornos consistentes, que tienen un precio: debe ejecutar al menos un automóvil virtual, que, a diferencia de Docker, es una distribución de Linux con plenos derechos, con problemas que intentaré intentar que yo enfatizarlos. A lo largo de este tutorial. Para ilustrar el primero de estos problemas, muchos tutoriales de Docker muestran este cuadro:
A primera vista, no parece ser una gran diferencia, así que permítanme mostrarle un diagrama más preciso, que tiene en cuenta los recursos del sistema:
Esa capa adicional ya no se ve tan inocente, ¿no? Y, de hecho, no lo es: el sistema operativo virtual/invitado necesita muchos recursos bloqueados para ejecutar y permanecerá rápidamente sin ellos si no asigna cuidadosamente cada hueso invitado. Y por bloqueado, quiero decir, una vez que establece la cantidad de espacio de CPU, RAM y disco duro para el sistema operativo invitado, el host no puede usarlos, ya sea que los invitados usen gran parte de ellos o simplemente pequeños, estos recursos no se comparten.

Hasta ahora podría pensar que Docker es una especie de corte de automóvil virtual y que tiene la mitad; Está bien virtual, pero no un automóvil, sino un entorno. Cuando un automóvil virtual piensa que es una máquina física (a través de un software de virtualización como Virtualbox o VMware Fusion), un contenedor Docker (más sobre la terminología pronto, piense en ella como una máquina virtual de Linux) se basa en el sistema operativo del host para cualquier recurso de recursos necesidades e incluye solo el mínimo requerido para ejecutar un entorno de Linux, a veces incluso 5 megaoctets en el disco y mucho menos memoria que las máquinas virtuales tradicionales. Para comprender el segundo beneficio más grande que Docker aporta a la mesa, para ver un poco en el desarrollo (no PHP o WP, solo desarrollo en general). Hay muchos principios de desarrollo que, si se practican, alivian significativamente la vida de los desarrolladores y hay un conjunto llamado sólido. El primer principio (el principio de responsabilidad única) es el segundo gran beneficio de Docker: cada imagen de Docker es responsable de hacer una cosa y una cosa. ¿Necesita un servidor web? Tome la imagen Nginx. ¿Necesitas un intérprete de PHP? Hay una foto para eso. Mysql? Échale un vistazo.

De hecho, lo que llegamos suele ser varios contenedores Docker que están orquestados por un software de nivel superior, como el propio Docker, Docker Swarm o Kubernetes, para que funcionen correctamente. Trataremos a Kubernetes en profundidad en la tercera publicación de esta serie. Ciertamente es posible construir una sola imagen que incluya todas estas responsabilidades, pero haré todo lo posible para explicar por qué debe evitar esto. Nuestra primera imagen ahora que tiene una comprensión básica de lo que es Docker, para tratar de construir una pila LEMP básica (Linux, Nginx, MySQL, PHP), que utilizaremos para nuestro sitio de WordPress. Todos los contenedores Docker se basan en Linux, No necesitamos construirlo específicamente, por lo tanto, por otro lado, centrarnos en Nginx como la primera parte. Cree un nuevo director de proyecto y en él, cree un archivo llamado index.html e ingrese el siguiente fragmento html:
¡Hola mundo de Docker !: $ Docker Run -v $ (pwd):/usr/share/nginx/html -P 8080: 80 Ning (si recibe este error: Docker: No se puede conectar al Docker Daemon. Significa que no ha cargado la configuración del automóvil Docker en Shell, ejecuta $ eval “$ (Docker-Machine Envant)”) “)
Debido a que lo más probable es que no tenga la imagen Nginx localmente, Docker la descargará del almacén oficial y la ejecutará con los parámetros de volumen y puerto que introdujo. No le dará ninguna indicación de si funciona o no (al principio, parece haber bloqueado):
Así que abra el navegador y navegue en http: // localhost: 8080 (o, si usa máquinas Docker, lo que es más probable, cambie localhost con Docker-Machine) y aquí, ¡Hola mundo! . Para detener el proceso, ¿Presione CTRL + CCE sucedió? Aunque puede parecer un poco de magia al principio, en realidad es bastante simple; Docker descargó la imagen (ningx: la última palabra en el comando), luego ejecutó un contenedor con esa imagen con dos parámetros especiales: instaló nuestro gerente de proyecto ($ (pwd) significa el director de trabajo actual o actual) en /usr /share /ninginx/html y también pegó el puerto 80 del sistema operativo invitado al host del host; esto hace que el carácter sea dos puntos, los puertos y/o los volúmenes del host al contenedor, por lo que 8080: 80 significa que usted Use el puerto 8080 en el host y mapa en el puerto 80 dentro del contenedor.
Nota: Si no está familiarizado con el término de montaje: es un proceso en el que una computadora conecta un volumen (un bloque de espacio en disco) de cierta manera en el contenedor. Mire esto todos los días cada vez que conecte una tecla USB o ingrese un DVD; el sistema operativo la monta automáticamente. Esta es también la razón por la que debe eliminar de manera segura las claves USB: ¡el sistema operativo debe desmontar la unidad para que no llegue con datos corruptos!
Una nota importante aquí: si monta el director de un host en el contenedor bajo una ruta que ya existe allí (y contiene archivos), ese directorio no se perderá, sino solo inaccesible mientras el director está montado. Y si nos quedamos con la analogía con el DVD por un poco más, porque puede ayudarnos a comprender la principal diferencia entre una imagen de Docker y un contenedor: una imagen es un sistema de archivos empaquetado, distribuible e inmutable (al igual que un DVD), Si bien el contenedor ofrece un entorno de Linux aislado y simple en el que se puede enrollar esa imagen (como un DVD-ROM, el componente físico de la computadora que le permite ejecutar cualquier cosa en un DVD). La apariencia inmutable de las imágenes las hace particularmente interesantes (inmutable significa que no puede cambiar ni modificar permanentemente ninguno de los archivos dentro de una imagen una vez que se construye), esto porque se vuelven completamente desechables (otro término que podría cumplirlo también es efímero, la misma cosa). Las imágenes se pueden reconstruir de una receta (llamada DockerFile) una y otra vez, por lo que si tiene que hacer cambios, solo tiene que reconstruirlas. Las imágenes siguen otro principio sólido muy útil:
El principio abierto. Afirma que un código está cerrado para la modificación pero se abre para la extensión. Del mismo modo, las imágenes no se pueden modificar, pero se pueden extender. Dado que nuestra imagen básica Nginx no sabe nada sobre PHP (o cualquier otra cosa de otra manera), es hora de expandirla y hacerlo con … El archivo Docker más simple, un DockerFile es un archivo que contiene un conjunto de instrucciones para Docker para que pueda construir una imagen. Piénselo como un plan para nuestra imagen final. La única instrucción obligatoria que tiene que poner en un archivo Docker se llama a partir de la instrucción; Le permite a Docker saber en qué imagen le gustaría confiar. El almacén oficial tiene imágenes con cualquier tipo de sabores o configuraciones de Linux que pueda imaginar y, como GitHub, se llaman nombre de usuario/nombre de imagen: etiqueta, excepto los oficiales que no requieren ningún nombre de usuario (la etiqueta siempre es opcional). Por lo tanto, cree un archivo vacío llamado DockerFile (sin extensión) cerca del index.html e inserte las siguientes dos filas (cambia, obviamente, la instrucción de Mauntainer para que coincida con su nombre y dirección de correo electrónico): Desde Nginx: 1.10 -Alpine Mauntainer Tomaz Zaman

Nuestra imagen personalizada dependerá de la imagen alpina oficial de Ninx. Alpine es una pequeña distribución de Linux, que pesa solo 5 MB y se vuelve muy popular en la comunidad Docker, porque ofrece un programa de instalación de paquetes llamado APK (similar a Apt-It en Debian/Ubuntu) y porque, bueno, es pequeño. , que es algo bueno, porque al final transferirá imágenes (en producción) y tendrá sentido usar a los pequeños: Debian, para comparación, requiere aproximadamente ~ 200 MB, porque incluye muchas cosas más que no necesitamos . Solo necesitamos Ningx y sus adicciones. Aquí hay otro beneficio significativo del uso de Docker: las imágenes de Docker se pueden extender. Y las imágenes resultantes también se pueden extender, lo más profundo que desee, por lo que si va e investiga cuán profundo se dirige la madriguera del conejo con la herencia de la imagen, verifique el archivo Dockerfile de Nogrx: 1.10-alpino, de Alpine: 3.3 . Así que revisemos el Dockerfile de Alpine. Él hereda de una imagen llamada Scratch, que es prácticamente una imagen completamente vacía, no hace nada, pero es esencialmente la abuela de todas las demás imágenes, por lo que la palabra scratch está reservada en Docker. Así es como se ve la herencia de la imagen en nuestro caso:

Una instrucción Dockerfile que no cubriremos en este tutorial, pero que vale la pena mencionar es la instrucción CMD.Esa instrucción establece un orden implícito para ejecutar cuando el contenedor se inicia sin parámetros, pero no necesitamos definirlo, porque DockerFile de Nginx lo hace.Si no hizo esto, entonces deberíamos ejecutar Ninx con un pedido como este (un ejemplo, no necesitamos ejecutarlo): $ Docker Run -V (pwd):/usr/share/nginx/html – P 8080: 80 Ningin Ningin -G “Daemon Off”;(Si se pregunta por qué la palabra ninx aparece dos veces: la primera instancia es el nombre de la imagen, mientras que el segundo, y todo lo que sigue, es el comando real que ejecutamos dentro del contenedor) para construir la imagen de nosotros, ejecutar: $ Docker Build -t my -wordpress.
Este orden lee el archivo Docker del directorio actual y etiqueta la imagen en My-WordPress, porque es más fácil escribir esto que un número aleatorio de caracteres que Docker genera automáticamente si no etiquetamos. Para probarlo, ejecutar: $ docker run -v $ (pwd):/usr/share/ningin/html -p 8080: 80 my -wordpress no ha cambiado, pero si ejecuta imágenes $ docker, podrá encontrar que la imagen predeterminada nginx (que ejecutamos en el primer intento), así como nuestra imagen my-wordpress. Mire sus dimensiones: la imagen predeterminada es ~ 182Mb, mientras que nuestra imagen personalizada es solo ~ 61 MB. Puede pensar que podríamos ejecutar el comando inicial (antes de usar DockerFile) para usar la versión Alpine y, de hecho, podría usar este ejemplo para mostrarle cómo puede reducir el tamaño de la imagen, dando un poco de investigación sobre sus opciones. En el caso de Nginx, tienes suficiente.
Si intenta ejecutar el mismo comando sin el parámetro -v ($ Docker Run -p 8080: 80 My -WordPress) Notará que index.html ya no es un servidor, la página Nginx predeterminada es, lo que no es muy útil , así que agregemos otra instrucción a nuestro archivo Docker (en la parte inferior): copiar index.html/usr/share/ningin/html Como puede imaginar, esta instrucción copia index.html en el directorio predeterminado. archivos del mismo nombre). Nuevamente, no es un gran problema, pero hicimos nuestra imagen lo suficiente. Se distribuye. La principal diferencia entre el uso de volúmenes y la copia de los archivos es que generalmente monta volúmenes en el desarrollo, pero necesitará archivos copiados en la imagen para su distribución (producción). La instalación de los volúmenes de desarrollo ahorra una cantidad significativa de tiempo, porque no tiene que reconstruir la imagen para cada cambio: Docker cambia temporalmente al director de origen de la imagen con la que tiene localmente. ¿Por qué es maravilloso? Debido a que no tenemos que instalar nada en nuestra máquina de desarrollo, ¡todo lo que es necesario para ejecutar lo que queramos ejecutar es ofrecido por imágenes! Esto significa que ya no tiene que instalar Ningx, PHP o MySQL en su computadora de desarrollo, lo cual es algo bueno, todos estos procesos ocupan recursos valiosos si no los deshabilitamos, y la mayoría de las veces no la ejecutamos. el fondo. Entonces, si construye la imagen nuevamente y ejecuta su imagen sin montar el volumen, ¡verá Hello World!
otra vez. Configuración de Nginx Nuestra imagen Ninx ahora está en funcionamiento, pero todavía no estamos allí; tenemos que cambiarlo de acuerdo con nuestras necesidades. La parte más importante es, por supuesto, el host virtual. Para crear uno, de alguna manera debemos anular la configuración predeterminada de NGINX. Vamos a conectarnos al contenedor para averiguar dónde está: $ Docker en ejecución -In My -wordpress /bin /sh Si alguna vez usó SSH para conectarse a un servidor antes, este pedido puede parecer bastante similar, pero en verdad, no lo es involucrado SSH aquí, solo ejecutamos el shell de contenedor predeterminado y lo conectamos a nuestra línea de control (o terminal, si está en OSX), la parte, lo hace interactivo. Por lo general, en los sistemas basados en Debian/Ubuntu, la configuración NGINX está configurada en/etc/nginx y, afortunadamente, esta imagen usa exactamente la misma estructura, por lo que si ejecuta $ ls -al /etc/nginx.d/ (dentro del interior del contenedor), realmente verá un solo archivo allí, llamado default.conf, que sobrescribiremos en breve. Pero primero, investigemos que hay, de hecho, un host virtual allí: $ Cat /etc/nginx/conf.d/default.conf
¿Observe el bloque del servidor {…} en salida?Eso es todo. Creemos nuestra propia versión de este archivo ahora: ejecute $ Salida para desconectar el contenedor y crear un nuevo archivo en nuestro directorio de proyectos, llamado NGINX.Conf.Coloque el siguiente fragmento en él: servidor {server_name _;Lista 80 Depault_Server;raíz/lima/www/html;índice index.php index.html;Access_log /dev /stdout;error_log /dev /stdout info;Ubicación / {try_files $ uuri $ uuri / /index.php?$args;} Ubicación ~ .php $ {incluye fastcgi_params;Fastcgi_pass my -php: 9000;fastcgi_index index.php;Fastcgi_param script_filename $ document_root $ fastcgi_script_name;}} Porque index.php aún no existe, cree cerca del index.html en el directorio del proyecto y pone

en su. Luego abra el DockerFile y cámbielo para que se vea así: de Ningin: 1.9 -Alpine Mintainer Tomaz Run Mkdir -p/www/html workdir/var/www/html copia nginx.conf/etc/nginx/conf. D/ default.conf Copy. ./ Desde ningin: 1.9 -Alpine Măintainer Tomaz Zaman Mkdir -p/var/www/html workDir/var/www/html copia ningin.conf/etc/conf.d/default.conf copy. ./ Agregué algunas instrucciones aquí: Copiar (que ya sabemos), ejecutar y Workdir. Podríamos ignorar los dos últimos por ahora, pero presenta un concepto importante de imágenes: cada proyecto necesita un director raíz, y los valores predeterminados no son necesariamente los mejores (o ni siquiera existe), por lo que, más primero, estamos creando/lima /www/html (que será la raíz de nuestra instalación de WordPress) y luego configurar WorkDir en él, lo que significa que todas las instrucciones posteriores solo pueden usar ./ para describir el taller actual. Un ejemplo a este respecto está en la última línea de este Dockerfile:

Copiamos. En ./, que dará como resultado que todos los archivos en el director de su proyecto host se ubiquen en/lima/www/html/dentro de la imagen. WorkDir es esencialmente exactamente lo mismo que ejecutar el orden de CD en Linux. Si intenta construir la imagen y ejecutarla, recibirá un error, porque, de manera predeterminada, la imagen NGINX solo sirve al viejo HTML simple. Sin embargo, en nuestra configuración, ingresamos un bloque FASTCGI (ubicación ~ .php $ {…}) que indica otra imagen (my -php), que aún no existe, así que vamos a crearla ahora. Imagen PHP-FPM Vi imágenes de Docker tratando de ejecutar NINX y PHP-FPM en el mismo contenedor, lo cual es un gran no para mí. ¿Recuerdas el principio de responsabilidad única que mencioné anteriormente? Lo que deberíamos tener son dos imágenes: una para Nginx (donde el servicio es responsabilidad) y otra para PHP-FPM (donde el análisis de PHP es responsabilidad). ¿Por qué es importante tener dos imágenes separadas? Dado que, como verá pronto, los contenedores no se ejecutan (o no deberían, al menos) se ejecutan en segundo plano, deben ejecutarse como el proceso principal y único del contenedor, por lo que si fallan, Docker (o software de administración) Sepa que ha sucedido algo y al menos intentará reiniciar el contenedor. Así que idealmente una imagen =>

un proceso desde el primer plano. Por supuesto, si ejecuto Apache en lugar de Ningx, este problema no existiría (porque PHP viene como un módulo de agua, por lo que no hay un proceso separado), pero a veces vale la pena complicar las cosas con fines de aprendizaje. Además, muchos desarrolladores avanzados prefieren Ninx que Apache por muchas razones: yo. Para construir nuestra imagen PHP, primero investigamos nuestras opciones en el almacén oficial. Hay muchos de ellos, pero ninguno viene con el soporte construido para MySQL y muchas otras adicciones de WordPress, por lo que nos vemos obligados a construir el nuestro. Pero no debería ser un problema porque solo hay unas pocas líneas en Dockerfile, ¿verdad? Vamos a hacer eso; Cree un nuevo Dockerfile llamado Dockerfile.php-FPM e ingrese el siguiente código en él: desde PHP: 7.0.6-FPM-Alpine Mauntainer Tomaz Zaman Run Docker-Php-Extall -J (GAT -C ^Processor /Proc / Cpuinfo 2>/dev/null || 1) iconv gd mbstring filinfo curl xmlreader xmlwriter spl ftp mysqli volumen/www/html de php: 7.0.6-fpm-alpine mantenerador tomaz run doker-exexex-instal- J $ (Grap—-Grap— C ^procesador /proc /cpuinfo 2>
/dev/null || 1) ICONV GD MBSSTRING FILINFO CURL XMLREADER XMLWRITER SPL FTP MYSQLI VOLUME/VAR/WWW/HTML La instrucción de ejecución aquí es un poco diferente, porque tenemos que instalar algunas dependencias que implícitamente no están presentes en la imagen oficial y las necesitamos para que las necesitemos para WordPress Roller. Afortunadamente, tenemos el comando Docker-Php-Exinstall (lea los documentos de Docker Hub si no entiende de dónde proviene) y lo llamamos con el parámetro -J. Este orden parece bastante aterrador al principio, pero en realidad es solo para notificar al instalador de extensión cuántos procesadores pueden usar. Esto es importante porque algunas de las extensiones de PHP deben compilarse en la caminata, una operación costosa en términos de cálculo. Entonces, ahora para construir la imagen PHP-FPM: $ Docker Build -t My -Php-File Dockerfile.php-FPM. Verá mucho en la pantalla (compilación), pero no debería durar mucho. Y, afortunadamente para nosotros, Docker memoriza las instrucciones en lo que se llaman capas, más sobre esto en la siguiente parte de esta serie, por lo que si intenta ejecutar el mismo pedido nuevamente, solo tomará un segundo y algo. El último bit del archivo Docker es la instrucción de volumen. Esta vez, no copiamos archivos en la imagen, lo que puede parecer un poco confundido al principio, así que permítanme explicar lo que sucede: la imagen no tiene archivos de origen en sí, se espera que un volumen externo se monte en ella. Durante la carrera y aquí hay otro beneficio de Docker:

Podemos compartir volúmenes entre contenedores, lo que significa que podemos conectar un director arbitrario del host en cualquier número de contenedores al mismo tiempo y todos tendremos acceso a él. Esto es importante porque no lo hace, esto conduciría a inconsistencias entre los archivos en NGINX y PHP-FPM y nos gustaría evitar esto. Entonces, ¿por qué no compartir los mismos datos entre ellos? Con ambas imágenes preparadas, es hora de probar la conexión entre ellas. Primero, traiga la imagen PHP -FPM (porque es una dependencia de nuestra configuración de Nginx) y ejecutarla en segundo plano (que es lo que significa): $ Docker Run -V (PWD):/lima/www/html– Nombra my -php -d my -php porque este comando no devuelve nada, ejecute $ docker ps para asegurarte de que el contenedor se esté ejecutando. Tenga en cuenta la ID del contenedor, porque tendrá que detenerlo ingresando $ Docker Stop F0B621891979 (cambie la última cadena con su ID). Y de hecho, se está ejecutando: también tenga en cuenta que le di un nombre, para que podamos atarlo a la imagen Ninx, que traemos de la siguiente manera: $ Docker -Run -it -Link my -php: my- php -p 8080 : 80 My-WordPress vuelve a su navegador y visite la misma dirección que usó para verificar que Nginx está funcionando y aquí.

El siguiente paso lógico aquí sería configurar nuestra imagen MySQL, pero antes de hacerlo, visitar otra herramienta que alivie un poco nuestras vidas; Como ha notado hasta ahora, los pedidos de Docker pueden volverse muy detallados y, como de costumbre, hay una aplicación ~~ un instrumento para esto. Hacer pedidos antes de continuar, para verificar algunos de nuestros comandos que tuvimos que ejecutar para construir nuestras imágenes y ejecutar nuestros contenedores. Más importante aún, para investigar qué piezas se repiten una y otra vez: ambas imágenes requieren un volumen externo para montar en/lima/www/html
Ambas imágenes exponen ciertos puertos (80 para Ninx, 9000 para PHP-FPM)
Ambas imágenes están construidas a partir de un Dockerfile personalizado
Ninx se basa en PHP -FPM para estar presente (como mis nombres de host -php)
Para facilitarnos la vida, Docker se entrega con un instrumento que nos permite poner toda esta configuración en un archivo para que los pedidos sean más cortos (y menos). El instrumento se llama Docker-Compose (habitual que se llamará Fig en los primeros días) y requiere un archivo llamado Docker-Compose.yml para estar presente en el Administrador de proyectos, así que cree uno e ingrese este código en: Versión: ‘2’ Servicios: My-Ginx: Build :. Volúmenes: -.:/lime/www/html Puertos: -“8080: 80” Enlaces: -My -php My -Php: Build: Context :. Dockerfile: Dockerfile.php -fpm Volumes: -.:/lime/www/html Port: -“9000: 9000”
En lugar de etiquetar y siempre llamar a las imágenes sobre el GO, Docker-Compose extrae toda la información necesaria del archivo de configuración. En él, definimos dos servicios, uno llamado my -ginx (nuestra imagen nginx) y la otra my -php. La imagen My-Ginx usa el director actual para la ruta del edificio (desde dónde). Debido a que el Docker-Composse es predeterminado un DockerFile allí. Además, Montem y el director actual del proyecto en el host en/lima/www/html en el contenedor (a través de la tecla de volúmenes) y MAPM y puertos, como con nuestro pedido -p, que ya no será necesario. Finalmente, lo conectamos a la imagen my -php: Docker hace una red interna para eso detrás de escena. En términos de mi imagen -php, la clave de compilación es ligeramente diferente, porque la compilación no usa el nombre estándar (ver aquí para obtener más detalles). Al igual que nuestra imagen My-Ginx, también instalamos el volumen y asignamos los puertos. ¡Ahora viene la parte divertida! Para construir imágenes con Docker-Composse, simplemente ejecute (hágalo dos veces para ver el almacenamiento en caché está en vigencia): $ Docker-Commose Build una vez construido, solo tenemos que ejecutar otro pedido para mostrar contenedores: ¡$ Docker-Commose Up! ¡Esto está listo con largos pedidos de Docker, Docker-Composse hasta el final!

¿Pero mysql? Una parte muy importante de la construcción de imágenes de Docker de las que no hemos hablado son las variables ambientales. Los discutiremos un poco en profundidad en la próxima parte de nuestro tutorial, pero para una introducción rápida, construiremos nuestra imagen MySQL utilizándolas. A diferencia de nuestra imagen PHP-FPM, no necesita construir una imagen MySQL personalizada (aunque ciertamente puede, si lo desea), ¡el oficial ya está entregado con todo lo que necesitamos! Por esta razón, omitiremos el comando Docker largo y engorroso y agregaremos la configuración directamente al archivo Docker-Compose.yml. Agregue las siguientes líneas a la parte inferior (tenga cuidado de ser sangrado como otros servicios): my -mysql: imagen: mariadb: 5.5 volúmenes:/lima/lib/mysql entorno: mysql_root_password: wp mysql_database: wp mysql_use: wp mysql_password: wp también No olvide conectarlo desde mi imagen -php, así que agregue que al final: my-php: (configuración existente) enlaces: -my-mysql Si intenta ejecutar $ docker-compose build, notará que La imagen de MySQL no está construida: esto se debe a que ya está construido y almacenado en el almacén oficial, solo tenemos que descargarla, lo que sucederá automáticamente cuando la ejecute, así que vamos: $ Docker -Communidad para asegurarnos de que Funciona de manera efectiva, pase al editor de código (pero no detenga Docker-Compose) y cree un nuevo archivo llamado en el directorio raíz del proyecto, llamado DB test.php e ingrese el siguiente contenido: <? Php $ dbuser = ' Wp '; $ dbpass = 'wp'; $ dbhost = 'my-mysql'; $ Connect = MySQLI_Connect ($ dbhost, $ dbuse, $ dbpass) o morir ("no se puede conectar a '$ dbhost"); eco "

Conectado a DB! “; Regrese al navegador e ingrese manualmente este archivo en la barra de direcciones, para que se vea así: http: // localhost: 8000/db test.php. Si ves conectado a DB!, Golpes tú mismo ¡En la parte posterior de un trabajo bien hecho! Entonces, ¿por qué funciona? Porque la imagen oficial de Mariadb se construye de una manera que acepta las variables ambientales como las opciones de configuración más comunes. Es por eso que agregamos la clave de entorno a nuestra configuración de Docker-Compose y establecemos Estas opciones allí. Teniendo variables ambientales como opciones de configuración, se vuelve muy útil una vez que comenzamos a bañar nuestras aplicaciones (y WordPress no es diferente) ingresando nuevos servidores horizontales (muchos servidores que sirven el mismo código), se adhieren a aplicaciones con 12 factores. El último bit que se subraya es la clave de los volúmenes. Aquí, no lo asignamos a ninguno de los directorios del anfitrión, pero solo definimos un volumen, que Docker creará (y sabrá) detrás de escena. Esto es útil Deorc Deorc. Es, como aprendí antes, las imágenes son inmutables, por lo que si no lo hiciéramos, todos los datos de MySQL se perderían cuando detengamos el contenedor. De esta manera, hacemos que este volumen sea persistente entre el rodamiento y nuestros datos es seguro. Conclusión recapitulamos lo que aprendimos en este tutorial: Dockerfile es un plan para crear imágenes de Docker (o más bien existentes) personalizadas)
Las imágenes de Docker son sistemas de archivos desechables, distribuibles e inmutables
Los contenedores de Docker proporcionan un entorno básico de Linux en el que se pueden ejecutar imágenes
Cada proyecto puede definir sus propias imágenes de Docker de acuerdo con los requisitos
Con Docker, no tenemos que instalar nada local (aparte del propio Docker) para muchos propósitos, solo podemos usar imágenes existentes de Docker Hub
Docker trabaja nativo de Linux con Windows y Mac de soporte de soporte
Podemos construir imágenes para cualquier cosa, pero cada una debe tener una sola responsabilidad, generalmente en forma de un proceso que se ejecuta en primer plano
Docker-composa proporciona una forma conveniente de ahorrarnos un tiempo de escritura
El mapa proporciona una forma conveniente de conectar los recursos del host con el contenedor.
El montaje proporciona una forma conveniente de conectar los directores de host al contenedor
Me doy cuenta de que todo esto puede ser bastante desalentador al principio, pero creo firmemente que Docker es el camino hacia el futuro, no solo por los muchos beneficios presentados en este tutorial, sino también porque nos obligará a hacer cosas en cierto lugar. camino. Usted decide si esto es bueno o malo, pero, de todos modos, lo que la mayoría de los desarrolladores siguen se convierte en una base sólida para el futuro. WordPress nos enseñó que, después de todo. Por cierto, WordPress, no lo hemos tratado en esta parte porque ya es lo suficientemente largo y tomará algún tiempo hundirse, por lo que cubriré esto en la próxima publicación, que está programada en las próximas semanas. ¡Asegúrate de suscribirte!
Me gustaría agradecer a Mario Peshev por la revisión técnica de este artículo.
Copyright statement: Unless otherwise noted, this article is Collected from the Internet, please keep the source of the article when reprinting.