Cómo configurar LEMP Stack en Docker

En este tutorial, configuraremos una pila LEMP dentro de una ventana acoplable. Podemos extraer y configurar fácilmente la imagen LEMP dentro de una ventana acoplable en un par de minutos. Pero para una mejor comprensión de la pila, configuraremos cada una de las imágenes NGINX, MySQL, PHP / PHPMyAdmin una por una. Una vez que comprenda la idea central de la pila LEMP en una ventana acoplable, puede intentar configurar la pila en una ventana acoplable como una sola imagen.
Para instalar / configurar LEMP en una ventana acoplable, primero debemos instalar la ventana acoplable y la ventana acoplable compose. Ejecute el siguiente comando para instalar estos dos.
root@demohost:~# apt-get install docker docker-compose
Iniciar el servicio de Docker
root@demohost:~# service docker start
Configuración de carpeta
Usaremos la siguiente estructura de carpetas para nuestra pila LEMP.
- Cree un directorio raíz con el nombre LEMP-Docker y un solo archivo docker-compose.yml dentro de él
- Para los registros de NGINX, cree un directorio con el nombre «registros» dentro de LEMP-Docker y cree dos archivos nginx-access.log y nginx-error.log dentro del directorio de registros.
- Para el archivo de configuración NGINX, cree un directorio con el nombre «sitios disponibles» dentro de LEMP-Docker y cree un archivo de configuración predeterminado.
- Por fin, para sus archivos PHP, cree un directorio con el nombre public_html dentro de LEMP-Docker. Colocaremos archivos PHP en este directorio en una etapa posterior.
Entonces, nuestra estructura de directorio se parece a la siguiente:
LEMP-Docker /
├── docker-compose.yml
├── registros
│ ├── nginx-access.log
│ └── nginx-error.log
├── public_html
│ └── index.php
└── sitios disponibles
└── predeterminado
Creemos rápidamente la estructura de directorios y los archivos anteriores.
root@demohost:~# cd ~ root@demohost:~# mkdir LEMP-Docker root@demohost:~# cd LEMP-Docker/ root@demohost:~/LEMP-Docker# mkdir logs root@demohost:~/LEMP-Docker# touch logs/nginx-access.log logs/nginx-error.log root@demohost:~/LEMP-Docker# mkdir sites-available root@demohost:~/LEMP-Docker# touch sites-available/default root@demohost:~/LEMP-Docker# mkdir public_html root@demohost:~/LEMP-Docker# touch docker-compose.yml
A continuación, editaremos la configuración predeterminada de NGINX «default» y agregaremos lo siguiente. En la directiva server_name, coloque la dirección IP de la ventana acoplable. Para encontrarlo use el comando $ ifconfig y busque la línea inet addr: en la fila docker *
root@demohost:~/LEMP-Docker# vi sites-available/default server { listen 80; # this path MUST be exactly as docker-compose.fpm.volumes, # even if it doesn't exists in this dock. root /usr/share/nginx/html; index index.html; server_name 172.17.0.1; location / { try_files $uri /index.html$is_args$args; } }
Instalar NGINX
Para configurar el contenedor Nginx, agregaremos lo siguiente al archivo docker-compose.yml
root@demohost:~/LEMP-Docker# vi docker-compose.yml nginx: image: tutum/nginx ports: - "80:80" volumes: - ./sites-available/default:/etc/nginx/sites-available/default - ./sites-available/default:/etc/nginx/sites-enabled/default - ./logs/nginx-error.log:/var/log/nginx/error.log - ./logs/nginx-access.log:/var/log/nginx/access.log
El docker-compose.yml anterior extraerá la imagen NGINX de tutum / nginx y el puerto proxy 80 del contenedor al puerto 80 del host de la ventana acoplable. Luego, montaremos el archivo de configuración NGINX predeterminado desde el directorio nginx / default a las carpetas disponibles y habilitadas para sitios del contenedor nginx. De manera similar, vincularemos los registros / *. Registros del host de la ventana acoplable a los registros dentro del contenedor.
Ahora, desde el CWD, ejecute el siguiente comando para extraer y crear el contenedor NGINX.
root@demohost:~/LEMP-Docker# docker-compose up -d Pulling nginx (tutum/nginx:latest)... latest: Pulling from tutum/nginx faecf96fd5ab: Pull complete 995977506e98: Pull complete ------------------------- ------------------------- Digest: sha256:69a727916ab40de88f66407fb0115e35b759d7c6088852d901208479bec47429 Status: Downloaded newer image for tutum/nginx:latest -------------------------
Para comprobar que el contenedor NGINX está realmente creado, ejecute el siguiente comando.
root@demohost:~/LEMP-Docker# docker ps
Para crear un túnel en el contenedor NGINX y obtener un shell bash, use el siguiente comando.
root@demohost:~/LEMP-Docker# docker exec -i -t 75088fe8fe60 bash
Ahora encuentre los procesos NGINX
root@75088fe8fe60:/# ps -aux | grep NGINX USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.6 85892 6572 ? Ss 07:13 0:00 nginx: master process /usr/sbin/nginx www-data 6 0.0 0.3 86212 3428 ? S 07:13 0:00 nginx: worker process www-data 7 0.0 0.3 86212 3428 ? S 07:13 0:00 nginx: worker process www-data 8 0.0 0.3 86212 3428 ? S 07:13 0:00 nginx: worker process www-data 9 0.0 0.3 86212 3428 ? S 07:13 0:00 nginx: worker process
Salir del shell bash del contenedor NGINX
root@75088fe8fe60:/#exit
Finalmente abra su navegador favorito, apúntelo a http: //
Deténgase y retire el recipiente por el momento.
root@demohost:~/LEMP-Docker# docker stop 75088fe8fe60 root@demohost:~/LEMP-Docker# docker rm 75088fe8fe60
Instalar PHP / FPM
Para que PHP funcione con nginx, necesitamos PHP con el módulo FPM habilitado. Por lo tanto, editaremos docker-compose.yml y seleccionaremos la imagen php: fpm especificando puertos para FPM, que es 9000 y montaremos el directorio public_html del host de docker en el directorio / usr / share / nginx / html del contenedor PHP-FPM
phpfpm: image: php:fpm ports: - "9000:9000" volumes: - ./public_html:/usr/share/nginx/html
Iniciaremos los contenedores en segundo plano y los dejaremos ejecutándose con el siguiente comando.
root@demohost:~/LEMP-Docker# docker-compose up -d Pulling phpfpm (php:fpm)... fpm: Pulling from library/php 75a822cd7888: Pull complete e4d8a4e038be: Pull complete ----------------------------- ----------------------------- Digest: sha256:01d1d6345bc30f206fb048c5f1afa882f17f54f275ffe7fd5a83524d8294bc79 Status: Downloaded newer image for php:fpm -----------------------------
Verifique el contenedor en ejecución con el siguiente comando, php-fpm se está ejecutando en el puerto 9000 y está asignado al puerto 9000 del host de la ventana acoplable.
root@demohost:~/LEMP-Docker# docker ps -a
Cree un túnel en el contenedor PHP-FPM y para obtener un shell bash, use el siguiente comando.
root@demohost:~/LEMP-Docker# docker exec -i -t 841f20b8e7e3 bash
Verifique los procesos dentro del contenedor con el siguiente comando.
root@95dec1e1eb47:/var/www/html# ps -aux
Una vez que estemos seguros de que el contenedor PHP-FPM se está ejecutando, modificaremos el archivo de configuración NGINX predeterminado para que pueda procesar los archivos PHP. Agregue la siguiente sección en el archivo sites-available / default after location / {} sección.
location ~ .php$ { fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass 172.17.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
Entonces, nuestro archivo de configuración predeterminado de NGINX final se ve así:
A continuación, cree un archivo index.php dentro de public_html y agregue lo siguiente y reinicie la ventana acoplable PHP-FPM.
root@demohost:~/public_html# vi index.php <?php echo phpinfo(); ?>
Reinicie el contenedor php-fpm.
root@demohost:~/public_html# docker restart lempdocker_phpfpm_1
Apunte su navegador a http: //
Instalar MySQL / PhpMyAdmin
En el último paso, configuraremos el contenedor MySQL y PhpMyAdmin dentro del host de la ventana acoplable. Edite el archivo docker-compose.yml y agregue la siguiente sección
mysql: image: mariadb environment: MYSQL_ROOT_PASSWORD: password phpmyadmin: image: corbinu/docker-phpmyadmin restart: always links: - mysql:mysql ports: - 8183:80 environment: MYSQL_USERNAME: root MYSQL_ROOT_PASSWORD: password
En la sección mysql, buscaremos la imagen mariadb y pasaremos una variable de entorno llamada MYSQL_ROOT_PASSWORD a las imágenes. La imagen tomará este valor como contraseña cuando construya el contenedor MySQL. En la sección phpmyadmin, obtenga la imagen de corbinu / docker-phpmyadmin y vincule este contenedor con la base de datos mysql del contenedor mysql. El puerto no 8183 del host de la ventana acoplable será un proxy del puerto 80 del contenedor (NGINX). Establezca el entorno del nombre de usuario de phpmyadmin como root y la contraseña como ‘contraseña’.
Inicie los contenedores en segundo plano y déjelos en ejecución con el siguiente comando. No olvide detener los contenedores en ejecución antes de ejecutar el siguiente comando.
root@demohost:~/LEMP-Docker# docker-compose up -d ------------------------- Pulling mysql (mariadb:latest)... latest: Pulling from library/mariadb 75a822cd7888: Already exists b8d5846e536a: Pull complete ------------------------ ------------------------ Digest: sha256:0ce9f13b5c5d235397252570acd0286a0a03472a22b7f0384fce09e65c680d13 Status: Downloaded newer image for mariadb:latest ------------------------ Pulling phpmyadmin (corbinu/docker-phpmyadmin:latest)... latest: Pulling from corbinu/docker-phpmyadmin 04c460fac791: Pull complete 0a0916b29f3e: Pull complete b25f4e7a7766: Pull complete ----------------------------- ----------------------------- 44f124587a1d: Pull complete Digest: sha256:8ba64f73a8f28f62c00c9515171361b9d5f7a0c6f6fa0aa4418839f9974d098d Status: Downloaded newer image for corbinu/docker-phpmyadmin:latest -----------------------------
Ahora enumere todos los contenedores en ejecución con el siguiente comando de Docker.
root@demohost:~/LEMP-Docker# docker ps -a
Cree un túnel en el contenedor MySQL y obtenga el shell mysql pasando el nombre de usuario y la contraseña
root@demohost:~/LEMP-Docker# docker exec -i -t f63eadc48545 mysql -u root -ppassword Welcome to the MariaDB monitor. Commands end with ; or g. Your MariaDB connection id is 3 Server version: 10.1.20-MariaDB-1~jessie mariadb.org binary distribution Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. MariaDB [(none)]> MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.00 sec)
Para obtener la página de inicio de sesión de phpmyadmin, dirija su navegador a http: //
Intentemos ahora comprender rápidamente el flujo dentro de la pila. La dirección IP de NGINX se establece en el host de la ventana acoplable y la configuración predeterminada establece la raíz web en / usr / share / nginx / html. Aparte de eso, la configuración también monta volúmenes desde el host de la ventana acoplable que incluye archivos de sites_available y el directorio de registro en el directorio / etc / nginx / sites-available y / var / log / nginx del sistema de archivos del contenedor en la sección volume: de docker-compose.yml. (Sección NGINX). El docker.compose.yml también configura NGINX para comprender PHP a través del módulo PHP-FPM y se define la ruta base para los archivos fuente PHP, que es el directorio public_html (sección PHP-FPM). MySQL usará su puerto predeterminado 3306 y estará vinculado al servidor NGINX para que la aplicación PHP sepa dónde establecer una conexión a la base de datos. Se puede acceder a phpmyadmin a través del puerto n. ° 8083 del host de la ventana acoplable que está asignado al puerto n. ° 80 del contenedor. El enlace entre MySQL y phpmyadmin se realiza en la sección de enlaces especificando el nombre de la base de datos como mysql (mysql:mysql).
Hemos instalado pila LEMP como contenedor uno a uno. El proceso lleva un poco de tiempo. Una vez que esté seguro de la configuración que acabamos de terminar, puede instalar Docker the stack desde una sola imagen. Revisa dockerhub para explorar todas las imágenes. Para hacer eso, use los siguientes comandos desde la terminal.
root@demohost:~ docker search LEMP root@demohost:~ docker pull <IMAGE-Name>
y luego use el comando docker run pasando todos los parámetros / configuraciones que necesita, su pila LEMP dentro de un contenedor estará lista en unos minutos.
Conclusión
Ahora que hemos aprendido cómo contener NGINX, MySQL, PHP y sabemos cómo vincularlos y montar volúmenes desde el sistema de archivos del host al sistema de archivos del contenedor, ahora puede agregar un CMS de su elección como Joomla, Drupal o WordPress en el contenedor para ampliar la funcionalidad de la pila ampliando docker-compose.yml.