
¿De qué trata este artículo?
Este artículo hablará sobre nuestra experiencia al usar Docker para configurar rápidamente un entorno de desarrollo escalable para el desarrollo web. Hablaré brevemente sobre las tareas que nos enfrentamos y las herramientas que se eligieron para resolver estos problemas. El artículo está marcado con el ícono del tutorial, porque encontrará instrucciones sobre cómo implementar el entorno en él. En comparación con artículos similares (enlaces al final del artículo), habrá menos detalles técnicos y más ejemplos en vivo.
¿Qué tareas enfrentamos?
Sucede que un nuevo desarrollador se conecta a un equipo existente. Para que pueda comenzar a realizar tareas (en otras palabras, escribir código y verificar su trabajo), no es suficiente obtener la fuente. Necesita un entorno que incluya un servidor web, un compilador de php y una base de datos. Este es el conjunto mínimo. Dependiendo del proyecto, el entorno puede incluir:
- NoSQL
- Servidor de colas
- Motor de búsqueda de texto completo;
- Solución de almacenamiento en caché;
- Recolectores;
- Herramientas útiles para desarrolladores
Todo esto debe instalarse localmente en el desarrollador y tener las mismas versiones que el resto de los miembros del equipo. Y aquí hay dificultades:
- Después de la instalación, debe configurar;
- El software ya está instalado, pero es una versión diferente;
- Es mucho tiempo;
Y el hecho de que los desarrolladores trabajen en diferentes plataformas (Windows, Linux, OS X) hace las cosas aún más complicadas.
Para resolver el problema, se eligió Docker. Quizás la razón principal es que se adapta fácilmente a la infraestructura existente. Funciona muy bien en Linux, y la mayoría de nuestros desarrolladores en este sistema operativo.
AlternativaLaravel ofrece su propia solución para organizar un entorno local llamado Homestead. Este es un conjunto de configuraciones y scripts para Vagrant, con la ayuda de los cuales se implementa el software necesario en la máquina virtual VirtualBox. Pero una descripción de Homestead está más allá del alcance de este artículo.
Proyecto Laradock
Al principio, este proyecto tenía como objetivo únicamente lanzar Laravel en Docker, lo que se refleja en su nombre. Pero a medida que la popularidad creció en la comunidad php, Laradock comenzó a admitir otros proyectos php: Symfony, CodeIgniter, WordPress, Drupal. El proyecto es realmente popular, activamente apoyado y desarrollado:

Laradock es un conjunto de imágenes Docker preconfiguradas e independientes que puede montar según los requisitos de su proyecto. Bien documentado y extremadamente fácil de usar. Para iniciar componentes, simplemente los enumeramos:
docker-compose up apache2 php-fpm mysql phpmyadmin
o
docker-compose up nginx php-fpm mariadb adminer
Nota : no es necesario especificar explícitamente php-fpm, porque cuando se inicia el servidor web del contenedor php-fpm, el contenedor se inicia automáticamente.
El repositorio tiene más de 48 contenedores, que incluyen:
- Bases de datos : MySQL, MariaDB, Percona, MongoDB, MSSQL, PostgreSQL
- Gestión de bases de datos : PhpMyAdmin, Adminer, PgAdmin
- Servidores web : nginx, Apache2, Caddy
- Compiladores PHP : PHP FPM, HHVM
- Misceláneo : Selenium, Jenkins, ElasticSearch, Kibana, Gitlab, Mailhog, MailDev, Laravel Echo, Phalcon
- Herramientas : PHP CLI, Compositor, Git, Linuxbrew, Node, V8JS, Gulp, SQLite, xDebug, Envoy, Deployer, Vim, Yarn, Drush
Requisitos y condiciones iniciales.
Necesitarás:
y la consola en la que se ejecutarán los comandos. El sitio web de Docker tiene documentación completa sobre la instalación para diferentes plataformas (los enlaces también se encuentran al final del artículo). Si aún no ha instalado git, hágalo de acuerdo con las instrucciones del sitio oficial.
Arquitectura del repositorio de Git: proyecto principal y Laradock
Laradock se puede usar en dos versiones:
- Laradock separado para cada proyecto
- Un laradock para muchos proyectos.
En el primer caso, la estructura del directorio se verá así:

En el segundo, así:
Siempre usamos la primera opción: un proyecto, un laradock. Es este enfoque el que proporciona flexibilidad e independencia de un proyecto de otro.
La segunda pregunta importante es: ¿crear un repositorio común o dos separados? En otras palabras, ¿necesito agregar archivos laradock al repositorio principal con el proyecto? La respuesta es necesaria, pero en forma de submódulo al repositorio principal. El entorno Docker es una parte auxiliar del proyecto y no siempre se requiere. Por ejemplo, en servidores de preparación y producción, no es necesario. Cuando implementa usando git, los archivos de entorno no llegarán allí.
El nombre del directorio del entorno.
Por defecto, los nombres de los contenedores usan el nombre del directorio actual como sufijo: laradock_nginx_1, laradock_mysql_1, etc. Para evitar la confusión de datos dentro de los volúmenes, se requieren nombres de directorio únicos para sus entornos. Esto es fácil de lograr si se apega a nuestro esquema elegido: agregue el nombre del proyecto al nombre del directorio con el entorno, por ejemplo:
- laradock-mysite
- laradock-proj1
- laradock-mobapp
es decir, el prefijo "laradock" y el nombre del directorio con el proyecto a través de un guión.
Lanzamiento de un sitio
¿Dónde comenzamos el lanzamiento del sitio?
Como mencionamos en el tercer capítulo, usamos Laradoc para crear el entorno.
El proceso de inicio consta de los pasos para configurar el entorno y la aplicación laravel.
Configuración del proyecto
Laradoc incluye un archivo de configuración de entorno de ejemplo. Creamos una copia para nuestro proyecto.
cp env-example .env
Las opciones .env son bastante obvias. En los parámetros establecemos el acceso a la base de datos, los parámetros de correo electrónico, el acceso a servicios de terceros, si lo usamos en nuestro proyecto.
Las aplicaciones de entorno de inicio y detención se realizan mediante comandos docker-compose
docker-compose up
y
docker-compose stop
Si es necesario, puede invocar la descarga de los servicios necesarios en el comando de inicio. Por ejemplo, se cargarán tres servicios adicionales de esta manera:
docker-compose up -d nginx percona adminer
Puede eliminar este comando en un script de shell separado para que no tenga que ingresarlo manualmente cada vez.
El script de inicio se puede llamar "start.sh", o lo que quieras:
El script de detención del servicio se puede llamar "stop.sh" o "down.sh":

Inicializacion del proyecto
El cambio al entorno del contenedor lo realiza
docker-compose exec --user=laradock workspace bash
Errores de implementación
Al instalar Laradoc en un entorno Linux, puede ocurrir un problema de permisos de archivo.
En este caso, los archivos pueden tener un propietario incorrecto o derechos de acceso insuficientes.
Síntomas : cuando intenta iniciar el entorno con el comando "docker-compose up" o ir al contenedor con el comando "docker-compose exec ...", como en el ejemplo anterior, errores similares a los
/ var / www / vendor no existe y no se pudo crear
No se pudo abrir la secuencia o el archivo "/var/www/storage/logs/laravel.log": no se pudo abrir la secuencia: Permiso denegado
La razón del error es que, en el ejemplo de configuración del entorno de Docker, la ID de usuario y el Grupo de usuarios están codificados, por defecto 1000 y 1000 respectivamente.
Si en nuestro sistema unix estas ID ya están ocupadas por otras entidades, entonces necesita editar manualmente la configuración.
Procedimiento de corrección de errores
Verifique el usuario y el grupo en los directorios:
ls -la /var/www
Los propietarios de archivos y directorios (Usuario y Grupo de usuarios) deben ser laradock laradock.
Si en lugar de laradock: laradock, el propietario y el grupo se indican con números (1001: 1001, 1001: 13002 y combinaciones similares), entonces debe realizar cambios en los archivos de configuración.
Si su ID de usuario y Grupo de usuarios (/ etc / passwd, / etc / group) no coinciden con los especificados, entonces, para un funcionamiento correcto, debe realizar cambios en los siguientes archivos:
/ laradock / php-fpm / Dockerfile *, en línea
"
EJECUTAR usermod -u 1000 www-data "
reemplazar 1000 con ID de usuario
/laradock/.env en líneas
WORKSPACE_PUID = 1000
WORKSPACE_PGID = 1000
WORKSPACE_PUID: especifique su ID de usuario, WORKSPACE_PGID: ID de grupo de usuarios
/ laradock / workspace / Dockerfile *, en líneas
PUID ARG = 10315
ARG PGID = 10004
PUID - ID de usuario, PGID - ID de grupo de usuarios
Después de hacer los cambios, reconstruya el espacio de trabajo y php-fpm nuevamente y luego inicie el contenedor:
docker-compose build workspace php-fpm
Si encuentra un problema de este tipo, debe verificar los derechos de acceso a los directorios del marco de trabajo de Laravel. Establezca permisos para directorios que requieren permisos de escritura:
sudo chgrp -R www-data storage bootstrap/cache; sudo chmod -R ug+rwx storage bootstrap/cache
Certificados SSL y https
Lo más probable es que su sitio en producción funcione de acuerdo con un protocolo seguro. Tiene sentido llevar a cabo el desarrollo local en https. Esto no es muy difícil de hacer, necesita un certificado SSL y configuraciones pequeñas. Este artículo se describe con más detalle en
Cómo emitir un certificado SSL autofirmado .
Ejecutando múltiples sitios
Por lo tanto, todos los proyectos funcionan de acuerdo con el esquema "One Laradock - one project". Pero un proyecto no es necesariamente un sitio. A veces es necesario ejecutar varios sitios al mismo tiempo, ya que interactuarán entre sí.
En este caso, no se pueden iniciar dos laradock al mismo tiempo, porque en cada uno de ellos se lanza un servidor web que escucha el puerto 80: tenemos un conflicto. Pero tenemos acceso a los archivos de configuración nginx, configurémoslo.
Pero primero, una nota sobre arquitectura y repositorios git. En el caso de varios sitios, usamos la estructura de directorios de la segunda opción:

El repositorio git con laradock ya no es un submódulo de otro repositorio, sino que se vuelve completamente independiente.
La configuración del servidor web se mostrará usando nginx como ejemplo. En el directorio laradock, vaya a nginx / sites. Vemos default.conf y varios archivos * .conf.example. Basado en default.conf o archivos de muestra, creamos configuraciones para sitios.
Presta atención a la raíz del documento. Por defecto, la directiva raíz se ve así:
root /var/www/public;
pero debería ser así:
root /var/www/site-1/public; root /var/www/site-2/public;
Importante!
Eche un vistazo a los contenidos de .gitignore en este directorio. Todos los archivos * .conf excepto default.conf se ignoran. Es necesario agregar archivos creados a las excepciones, es decir, no los ignore.
Configure crontab para que el planificador laravel pueda funcionar correctamente. Para hacer esto, agregue las rutas en el espacio de trabajo / crontab / archivo laradock:
* * * * * laradock /usr/bin/php /var/www/site-1/artisan schedule:run >> /dev/null 2>&1 * * * * * laradock /usr/bin/php /var/www/site-2/artisan schedule:run >> /dev/null 2>&1
Para una comunicación exitosa de sitios dentro de contenedores, agregue alias. En el archivo docker-compose.yml encontramos la sección
### NGINX Server ###
y agregue un alias a cada dominio:

Esto es todo lo que necesita hacer para ejecutar un proyecto con múltiples dominios. Fuera del artículo, la cuestión de organizar https para varios dominios permanece. Todo por analogía con la organización SSL para un dominio, que se describe en la sección anterior. Agregue un comentario si tiene alguna dificultad, lo responderé o describiré las características en un artículo separado.
Características adicionales
En el entorno Docker, es posible configurar las aplicaciones que necesitamos. La configuración básica de Laradoc ya incluye paquetes de aplicaciones:
Servidor de aplicaciones web | Apache2, Caddy |
Caché de aplicaciones web | Nginx, Barniz |
Bases de datos y servicios de almacenamiento en caché | Mongo, Redis, Mssql, Mysql, Percona, Mariadb, Elasticsearch, Memcached, Redis, RethinkDb, Aerospike |
Interfaces web para bases de datos | Administrador, PhpMyAdmin |
Balanceador de carga | Haproxy |
Programación, conchas y marcos. | Php, Python, Symfony, Laravel, Node |
Utilidades | Php, Python, Symfony, Laravel, Node |
Administrador de paquetes | Compositor de hilo |
Herramienta de prueba | Jenkins |
Herramienta de configuración de infraestructura de aplicaciones | Terraforma |
Considere brevemente las aplicaciones más mencionadas.
RabbitmqEl mecanismo de mensajería entre aplicaciones. El desarrollador de este paquete determina su propósito de la siguiente manera: "gestor de colas", "intermediario de mensajes" o "colas de mensajes".
Un mensaje puede contener cualquier conjunto de datos.
En el escenario de trabajar con el gestor de colas, se guarda un mensaje de una aplicación, el remitente, hasta que otra aplicación (destinatario) se conecta y recoge (recibe) el mensaje de la cola.
RedisCrear un caché de datos en RAM. También se puede usar como un almacén de datos junto con un servidor de base de datos, o reemplazarlo.
Redis admite cadenas, listas, conjuntos, conjuntos ordenados y tablas hash.
El principal inconveniente de los rábanos es la pérdida de datos en caso de limpieza de RAM, cuando se reinicia el sistema operativo o cuando se apaga el equipo. Los desarrolladores de rábano imaginaron un escenario similar: en el modo AOF (Agregar solo archivo), los datos se agregan al archivo de disco cada segundo.
La principal ventaja de los rábanos es el acceso más rápido a los datos con la velocidad de acceso a la RAM.
Enlaces materiales
LaravelDockerLaradockLaravel Homestead"Cómo emitir un certificado SSL autofirmado y hacer que su navegador confíe en él"Docker + Laravel =Conclusión
Al elegir Laravel + Docker para el desarrollo web, ganamos el premio más valioso: el tiempo.
Siguiendo el escenario de desarrollo en WAMP o LAMP, tuvimos que pasar tiempo
inútil y en ninguna parte.
Tanto WAMP como LAMP requieren que un desarrollador de php tenga un cierto nivel de habilidad en áreas que no están directamente relacionadas con el desarrollo web: configurar un servidor web, configurar parámetros de php, etc.
El uso de Laradoc nos permite, una vez que hemos creado todo el entorno del proyecto, implementarlo en un nuevo lugar de trabajo en el menor tiempo posible. Y ponte a trabajar de inmediato.
En conclusión, notamos los beneficios de usar Laradoc:
- infraestructura unificada en cada lugar de trabajo: servidor web, servidor sql, un conjunto de marcos y bibliotecas;
- uso racional del tiempo de trabajo;
- entrada rápida de un nuevo desarrollador en el proyecto.
Escriba en los comentarios cómo trabaja su equipo con el entorno, qué herramientas y enfoques utiliza.