GNU/Linux >> Tutoriales Linux >  >> Ubuntu

Cómo crear una pila LAMP basada en docker usando docker en Ubuntu 20.04

La pila LAMP

LAMP es la pila de software en la que probablemente se ejecutan la mayoría de los sitios web. Linux representa la base de la pila, y la implementación tradicional incluye Apache como servidor web, la base de datos MySQL y PHP como lenguaje de programación del lado del servidor. Sin embargo, hay muchas variaciones posibles:MariaDB, por ejemplo, se usa a menudo en lugar de MySQL, del cual es una bifurcación, y otros lenguajes de programación, como Python o Perl, se pueden usar en lugar de PHP. En este artículo veremos cómo implementar una pila LAMP básica usando docker y la utilidad docker-compose.

En este tutorial aprenderás:

  • Cómo instalar docker y docker-compose en Ubuntu 20.04
  • Cómo definir servicios y volúmenes usando docker-compose
  • Cómo asignar puertos de host a puertos de contenedor en el archivo de configuración de docker-compose
  • Cómo usar montajes de vinculación y volúmenes con nombre
  • Cómo construir un proyecto con docker-compose

Cómo crear una pila LAMP basada en docker usando docker en Ubuntu 20.04

Requisitos de software y convenciones utilizadas

  1. Instalación de paquetes e inicio del servicio docker

    Para crear una pila LAMP basada en Docker en Ubuntu 20.04 Focal Fossa, lo primero que tenemos que hacer es instalar el software que necesitamos:docker mismo, y docker-compose , que es una utilidad que nos permite organizar fácilmente aplicaciones de contenedores múltiples usando yaml Archivos de configuración. Ambos paquetes están disponibles en los repositorios oficiales de Ubuntu. Podemos instalarlos a través de apt :

    $ sudo apt install docker docker-compose
    

    Una vez realizada la instalación debemos iniciar el docker servicio y habilitarlo en el arranque. Podemos realizar ambas operaciones con un solo comando:

    $ systemctl enable --now docker
    
  2. Configuración del proyecto

    El primer paso de nuestro viaje consiste en la creación del directorio que usaremos como raíz de nuestro proyecto. Por el bien de este artículo lo llamaremos linuxconfig . Dentro de este directorio crearemos otro, DocumentRoot , que alojará los archivos de nuestro sitio web. Podemos crear ambos directorios a la vez usando -p opción del mkdir comando:

    $ mkdir -p linuxconfig/DocumentRoot
    

    Dentro del linuxconfig directorio, definimos la configuración de docker-compose para nuestro proyecto dentro de un archivo yaml, que por defecto debería llamarse docker-compose.yml . Hay tres estrofas principales que podemos usar en el archivo de configuración:servicios , volúmenes y redes .

    Cada sección se utiliza para configurar el aspecto correspondiente de un proyecto. En este tutorial usaremos solo los dos primeros. Implementaremos los componentes de la pila LAMP como servicios dentro de sus propios contenedores separados.

    Los contenedores creados con docker-compose serán miembros de la misma red y por lo tanto podrán comunicarse entre sí por defecto. En la red, cada contenedor podrá referenciar a los demás por un nombre de host idéntico a su nombre, o por el nombre utilizado para definir el servicio implementado por el contenedor.

    De forma predeterminada, los contenedores se nombrarán utilizando el nombre del directorio que contiene el archivo de configuración como prefijo. En este caso, por ejemplo, el contenedor utilizado para un servicio llamado php-httpd , se llamará linuxconfig_php-httpd_1 .

  3. Definiendo el servicio php + httpd

    El primer servicio que definiremos en el archivo de configuración incluirá PHP como módulo de servidor web Apache. Usaremos una de las imágenes PHP oficiales disponibles en dockerhub como base para nuestro contenedor, específicamente el que tiene el -apache sufijo, que proporciona la configuración que mencionamos anteriormente. Empecemos a escribir nuestra configuración:

    version: '3.7'
    
    services:
        php-httpd:
            image: php:7.3-apache
            ports:
                - 80:80
            volumes:
                - "./DocumentRoot:/var/www/html"
    
    

    Lo primero que especificamos en el archivo de configuración es version . Con esta instrucción declaramos qué versión específica del archivo de composición vamos a utilizar. Al momento de escribir, versión 3.7 es el último y recomendado.

  4. Después de declarar la versión del archivo de redacción, comenzamos a escribir el servicio estrofa; dentro de él definimos los servicios que compondrán nuestra pila LAMP. Llamamos al primer servicio php-httpd . El nombre del servicio es completamente arbitrario, pero siempre es un buen hábito usar uno que sea significativo en el contexto del proyecto.

    La image La instrucción se utiliza para especificar en qué imagen debe basarse el contenedor, en este caso php:7.3-apache .

    Los ports La instrucción se utiliza para exponer los puertos en el contenedor y para crear un mapa entre los puertos del host y los puertos del contenedor. Dicho mapa se define separando los puertos con un : . En el lado izquierdo, especificamos el puerto del host y, en el lado derecho, el puerto dentro del contenedor al que debe asignarse. En este caso mapeamos el puerto 80 en el host al puerto 80 en el contenedor, ya que es el puerto predeterminado que utiliza el servidor web Apache.

    La última instrucción que usamos es volumes :con él podemos especificar un mapeo entre un volumen con nombre o un camino (relativa o absoluta) en el sistema host a una ruta en el contenedor, en el que se montará.

    En nuestra configuración, ./DocumentRoot El directorio alojará los archivos del sitio:se montará en el /var/www/html directorio dentro del contenedor, porque este último es la raíz del documento utilizada por Apache VirtualHost predeterminado. Esta configuración se denomina montaje de enlace. y es especialmente útil durante el desarrollo porque los cambios que hacemos en los archivos del proyecto se reflejan inmediatamente dentro del contenedor. La desventaja de esta configuración es que establece una dependencia entre el contenedor y la estructura de archivos de la máquina host, lo que disminuye una de las principales ventajas de usar Docker:la portabilidad.

    El directorio que se montará dentro del contenedor se creará automáticamente si no existe cuando docker-compose up se inicia el comando:en ese caso, será propiedad de root si no se especifica lo contrario.

    Dentro de DocumentRoot ahora podemos crear un archivo de índice e intentar compilar nuestro proyecto para verificar que la configuración funcione:

    $ echo "<?php phpinfo();" > DocumentRoot/index.php
    $ sudo docker-compose up -d
    

    Después de ejecutar el comando, las imágenes acoplables necesarias se descargarán de dockerhub y los contenedores se crearán con la configuración que proporcionamos y se ejecutarán en segundo plano (no bloquearán la terminal), debido a -d opción que proporcionamos a docker-compose dominio. Con el proyecto en marcha, si navegamos a localhost con nuestro navegador, deberíamos ver la siguiente página:



    La página phpinfo

    Para detener el proyecto, desde el directorio que aloja docker-compose.yml archivo, podemos ejecutar:

    $ sudo docker-compose stop
    

    Definiendo el servicio MariaDB

    Una parte esencial de la pila LAMP es la capa de la base de datos. En nuestra configuración usaremos MariaDB y su imagen docker oficial disponible en dockerhub:

    version: '3.7'
    
    services:
        php-httpd:
            image: php:7.3-apache
            ports:
                - 80:80
            volumes:
                - "./DocumentRoot:/var/www/html"
    
        mariadb:
            image: mariadb:10.5.2
            volumes:
                - mariadb-volume:/var/lib/mysql
            environment:
                TZ: "Europe/Rome"
                MYSQL_ALLOW_EMPTY_PASSWORD: "no"
                MYSQL_ROOT_PASSWORD: "rootpwd"
                MYSQL_USER: 'testuser'
                MYSQL_PASSWORD: 'testpassword'
                MYSQL_DATABASE: 'testdb'
    
    volumes:
        mariadb-volume:
    

    Dentro de los servicios estrofa, definimos otro servicio y lo llamamos mariadb y con la image instrucción que especificamos queremos usar el 10.5.2 versión de la imagen oficial.

    En la definición de servicio anterior, usamos un montaje de enlace. Esta vez, en cambio, usamos un volumen con nombre de la ventana acoplable adecuada , para ser montado en /var/lib/mysql dentro del contenedor (es el directorio de datos predeterminado utilizado por MariaDB). A diferencia de un montaje de enlace, los volúmenes con nombre no crean dependencias del contenedor en la estructura del sistema de archivos del host. Completamente administrados por Docker, son el método recomendado para conservar datos que, de lo contrario, se perderían cuando se destruyen los contenedores.

    Los volúmenes con nombre se pueden definir en los volumes principales estrofa del archivo de configuración y se puede hacer referencia desde los volumes subsección de cada servicio definido. En este caso llamamos a nuestro volumen mariadb-volume .

    Como siguiente paso, definimos el valor de algunas variables de entorno utilizado para influir en el comportamiento del contenedor. Las variables de entorno se definen en el environment sección de una definición de servicio. Las variables que definimos en este caso tienen el siguiente efecto:

Requisitos de software y convenciones de la línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Ubuntu 20.04 instalado o Ubuntu actualizado a 20.04 Focal Fossa
Software docker, docker-compose
Otro Permisos de raíz para crear contenedores docker y lanzar el servicio docker
Convenciones # – requiere que los comandos de Linux dados se ejecuten con privilegios de root, ya sea directamente como usuario root o mediante el uso de sudo comando
$ – requiere que los comandos de Linux dados se ejecuten como un usuario normal sin privilegios

En este punto, deberíamos tener un servidor web en funcionamiento capaz de trabajar con PHP y una base de datos para almacenar nuestros datos.

Bonificación:phpMyAdmin

Nuestra pila LAMP básica ahora debería estar completa. Como beneficio adicional, es posible que deseemos agregar phpMyAdmin a él, para controlar fácilmente nuestra base de datos MariaDB desde una interfaz web fácil de usar. Agreguemos la definición de servicio relacionada a nuestra configuración docker-compose:

version: '3.7'

services:
    php-httpd:
        image: php:7.3-apache
        ports:
            - 80:80
        volumes:
            - "./DocumentRoot:/var/www/html"

    mariadb:
        image: mariadb:10.5.2
        volumes:
            - mariadb-volume:/var/lib/mysql
        environment:
            TZ: "Europe/Rome"
            MYSQL_ALLOW_EMPTY_PASSWORD: "no"
            MYSQL_ROOT_PASSWORD: "rootpwd"
            MYSQL_USER: 'testuser'
            MYSQL_PASSWORD: 'testpassword'
            MYSQL_DATABASE: 'testdb'

    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        links:
            - 'mariadb:db'
        ports:
            - 8081:80

volumes:
    mariadb-volume:

Llamamos a nuestro servicio phpmyadmin y lo configuré para usar el phpmyadmin/phpmyadmin imagen de dockerhub. También usamos los links palabra clave por primera vez; ¿Para qué es esto? Como ya sabemos, por defecto, y sin necesidad de configuraciones especiales, todos los contenedores creados en la misma configuración de docker-compose pueden comunicarse entre sí. La imagen de phpMyAdmin está configurada para hacer referencia a un contenedor de base de datos en ejecución por el db name, por lo tanto necesitamos crear un alias con el mismo nombre para nuestro servicio mariadb. Esto es exactamente lo que links se usa para:definir alias adicionales para llegar a un servicio desde otro.

Dentro de la definición del servicio también mapeamos el puerto 8081 de nuestra máquina host, al puerto 80 dentro del contenedor (el puerto 80 ya está asignado al mismo puerto dentro del contenedor php-httpd). Por lo tanto, se podrá acceder a la interfaz de phpMyAdmin en localhost:8081 dirección. Reconstruyamos nuestro proyecto y verifíquelo:

$ sudo docker-compose up -d --build


La página de inicio de sesión de PhpMyAdmin

Podemos iniciar sesión con las credenciales que definimos para nuestro servicio de base de datos y verificar que testdb se ha creado la base de datos:



Página de inicio de PhpMyAdmin

Usar una imagen personalizada para un servicio

En los ejemplos anteriores, siempre usamos imágenes vainilla en nuestra definición de servicios. Hay casos en los que es posible que queramos usar imágenes docker personalizadas basadas en ellas. Por ejemplo, digamos que queremos construir el servicio php-httpd, pero incluir una extensión de php adicional:¿cómo podemos hacerlo? En la raíz del proyecto, definimos un nuevo directorio y, por comodidad, le damos el nombre del servicio:

$ mkdir php-httpd

Dentro de este directorio creamos un Dockerfile, usado para extender la imagen base, con el siguiente contenido:

FROM php:7.3-apache
LABEL maintainer="[email protected]"

RUN apt-get update && apt-get install -y libmcrypt-dev \
    && pecl install mcrypt-1.0.2 \
    && docker-php-ext-enable mcrypt

De vuelta en nuestro docker-compose.yml archivo, modificamos la definición del php-httpd Servicio. No podemos hacer referencia a la imagen directamente como lo hicimos antes. En su lugar, especificamos el directorio que contiene nuestro Dockerfile personalizado como contexto de compilación:

version: '3.7'

services:
    php-httpd:
        build:
            context: ./php-httpd
        ports:
            - 80:80
        volumes:
            - "./DocumentRoot:/var/www/html"
[...]

En la build En la sección definimos las configuraciones que se aplican en el momento de la compilación. En este caso, usamos context para hacer referencia al directorio que contiene el Dockerfile:dicho directorio se usa como contexto de compilación y su contenido se envía al demonio Docker cuando se compila el contenedor. Para aplicar la modificación debemos reconstruir el proyecto.

Por cierto, para saber más sobre las extensiones adicionales en la imagen de php docker, puedes echar un vistazo a la documentación oficial, y en concreto a las extensiones PECL sección.

Conclusiones

En este tutorial vimos cómo construir una pila LAMP básica utilizando la tecnología de contenedores con Docker y docker-compose. Vimos cómo definir los diversos servicios dentro del archivo de configuración docker-compose.yml y cómo configurar los montajes de enlace, los volúmenes con nombre y la asignación de puertos de contenedor de host. También vimos cómo usar imágenes personalizadas. Puede consultar la referencia de docker-compose para ver la lista detallada de instrucciones que se pueden usar dentro del archivo de configuración de docker-compose.

Ubuntu
  1. Cómo instalar la pila LAMP en Ubuntu 18.04

  2. Cómo crear una VPN en Ubuntu 20.04 usando Wireguard

  3. Cómo instalar Docker en Ubuntu 22.04

  4. Cómo usar módulos Puppet para crear una pila LAMP en Ubuntu 20.04

  5. Cómo crear arreglos RAID usando MDADM en Ubuntu

Cómo instalar la pila LAMP en Ubuntu 16.04

Cómo instalar la pila LAMP en Ubuntu 17.04

Cómo instalar la pila LAMP en Ubuntu 17.10

Cómo instalar la pila LAMP en Ubuntu 20.04

¿Cómo crear un enlace a una carpeta en Ubuntu 18.04 usando Gui?

Cómo instalar Gitea en Ubuntu usando Docker

    Variable Efecto
    TZ Establecer la zona horaria utilizada por el servidor MariaDB
    MYSQL_ALLOW_EMPTY_PASSWORD Habilite o deshabilite el uso de una contraseña en blanco para el usuario raíz de la base de datos
    MYSQL_ROOT_PASSWORD Esta es una variable obligatoria y se usa para establecer la contraseña del usuario root de la base de datos
    MYSQL_DATABASE Opcionalmente se usa para especificar el nombre de la base de datos que se creará al iniciar la imagen
    MYSQL_USER Opcionalmente se usa para especificar el nombre de un usuario que se creará con permisos de superusuario para la base de datos especificada con MYSQL_DATABASE
    MYSQL_PASSWORD Se utiliza para especificar la contraseña del usuario creado con el nombre proporcionado por MYSQL_USER