Cómo crear una pila de lámparas basada en Docker usando Docker en Ubuntu 20.04

Cómo crear una pila de lámparas basada en Docker usando Docker en Ubuntu 20.04

La pila de lámparas

LAMP es la pila de software en la que probablemente la mayoría de los sitios web se ejecutan. 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, a menudo se usa en lugar de MySQL, de las cuales es una bifurcación y otros lenguajes de programación, ya que se puede usar Python o Perl en lugar de PHP. En este artículo veremos cómo implementar una pila de lámparas básicas 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 utilizando Docker-Compose
  • Cómo asignar puertos de host a los puertos de contenedores en el archivo de configuración de Docker-Compose
  • Cómo usar soportes de enlace y volúmenes nombrados
  • Cómo construir un proyecto con Docker-Compose
Cómo crear una pila de lámparas basada en Docker usando Docker en Ubuntu 20.04

Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Instalado Ubuntu 20.04 o actualizado Ubuntu a 20.04 fosa focal
Software Docker, Docker-Compose
Otro Permisos de raíz para construir contenedores Docker y iniciar el servicio Docker
Convenciones # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
ps - Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado
  1. Instalación de paquetes e iniciando el servicio Docker

    Para crear una pila de lámparas basada en Docker en Ubuntu 20.04 fosa focal, lo primero que tenemos que hacer es instalar el software que necesitamos: estibador en sí, y compuesto de acopolador, que es una utilidad que nos permite organizar fácilmente aplicaciones de contenedores múltiples utilizando yaml Archivos de configuración. Ambos paquetes están disponibles en los repositorios oficiales de Ubuntu. Podemos instalarlos a través de apto:

    $ sudo apt instalación docker docker-composa 

    Después de realizar la instalación, debemos iniciar el estibador 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 en nuestro viaje consiste en la creación del directorio que utilizaremos como la raíz de nuestro proyecto. Por el bien de este artículo lo llamaremos LinuxConfig. Dentro de este directorio crearemos otro, Raiz del documento, que alojará los archivos de nuestro sitio web. Podemos crear ambos directorios a la vez utilizando el -pag opción del mkdir dominio:

    $ mkdir -p linuxconfig/documentroot 


    Dentro de LinuxConfig Directorio, definimos la configuración de Docker-Compose para nuestro proyecto dentro de un archivo YAML, que de manera predeterminada debe llamarse compuesto de acopolador.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 de lámparas 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 hablar entre ellos por defecto. En la red, cada contenedor podrá hacer referencia 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.

    Por defecto, 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, será nombrado linuxconfig_php-httpd_1.

  3. Definición del servicio PHP + HTTPD

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

    Versión: '3.7 'Servicios: PHP-HTTPD: Imagen: Php: 7.Puertos de 3 -apache: - 80:80 volúmenes: - "./Documentroot:/var/www/html " 
    Copiar

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

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

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

    El puerto La instrucción se utiliza para exponer puertos en el contenedor y para crear un mapa entre los puertos de host y los puertos de contenedores. Dicho mapa se define separando los puertos con un :. En el lado izquierdo especificamos el puerto host, y a la derecha, el puerto dentro del contenedor debe asignarse a. En este caso mapeamos el puerto 80 en el anfitrión al puerto 80 en el contenedor, ya que es el puerto predeterminado utilizado por el servidor web Apache.

    La última instrucción que usamos es volúmenes: Con él podemos especificar un mapeo entre un Volumen llamado o camino (relativo o absoluto) en el sistema de host a una ruta en el contenedor, en la que se montará.

    En nuestra configuración, el ./Raiz del documento 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 el apache virtualhost predeterminado. Tal configuración se llama montar atar y es especialmente útil durante el desarrollo porque los cambios que realizamos 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 del archivo de la máquina host, disminuyendo una de las principales ventajas de usar Docker: portabilidad.

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

    Dentro de Raiz del documento Directorio Ahora podemos crear un archivo de índice e intentar crear nuestro proyecto para verificar que la configuración esté funcionando:

    $ echo "DocumentRoot/índice.PHP $ sudo Docker -compuesto -d -d 

    Después de ejecutar el comando, las imágenes Docker necesarias se descargarán de DockerHub y los contenedores que se crearemos con la configuración que proporcionamos y ejecutamos en segundo plano (no bloquearán el terminal), debido a la -d opción que proporcionamos al compuesto de acopolador dominio. Con el proyecto en funcionamiento, si navegamos a hostil Con nuestro navegador, deberíamos ver la siguiente página:



    La página de Phpinfo

    Para detener el proyecto, desde el directorio que aloja el compuesto de acopolador.YML archivo, podemos ejecutar:

    $ Sudo Docker-Compose Stop 

    Definición del servicio de mariadb

    Una parte esencial de la pila de lámparas es la capa de base de datos. En nuestra configuración usaremos Mariada y su imagen oficial de Docker disponible en Dockerhub:

    Versión: '3.7 'Servicios: PHP-HTTPD: Imagen: Php: 7.Puertos de 3 -apache: - 80:80 volúmenes: - "./Documentroot:/var/www/html "mariadb: imagen: 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-volumen: 
    Copiar

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

    En la definición de servicio anterior utilizamos un montaje de enlace. Esta vez, en cambio, utilizamos un Docker adecuado Volumen llamado, para montar 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 nombrados no crean dependencias del contenedor en la estructura del sistema de archivos host. Completamente administrado por Docker, son el método recomendado para persistir datos que de otro modo se perderían cuando se destruyan los contenedores.

    Volúmenes nombrados se pueden definir en la principal volúmenes estrofa del archivo de configuración y puede referenciarse desde el volúmenes subsección de cada servicio definido. En este caso llamamos nuestro volumen volumen de mariadb.

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

    Variable Efecto
    Tz Establezca la zona horaria utilizada por el servidor mariadb
    Mysql_allow_empty_password Habilitar o deshabilitar el uso de contraseña en blanco para el usuario root de DB
    Mysql_root_password Esta es una variable obligatoria y se utiliza para establecer la contraseña de usuario root de DB
    Mysql_database Opcionalmente se usa para especificar el nombre de la base de datos que se creará en el inicio de la imagen
    Mysql_user Opcionalmente, se usa para especificar el nombre de un usuario que se creará con los permisos de Superuser para la base de datos especificada con MySQL_DATABASE
    Mysql_password Se utiliza para especificar la contraseña para el usuario creado con el nombre proporcionado por MySQL_USER

    En este punto, deberíamos tener un servidor web que funcione en PHP y una base de datos para almacenar nuestros datos.

    Bonificación - Phpmyadmin

    Nuestra pila básica de lámpara ahora debería estar completa. Como beneficio adicional, es posible que deseemos agregar phpmyadmin Para é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:

    Versión: '3.7 'Servicios: PHP-HTTPD: Imagen: Php: 7.Puertos de 3 -apache: - 80:80 volúmenes: - "./Documentroot:/var/www/html "mariadb: imagen: mariadb: 10.5.2 volúmenes: - mariadb -volume:/var/lib/mysql entorno: tz: "europe/rome" mysql_allow_empty_password: "no" mysql_root_password: "rootpwd" mysql_user: 'testuser' mysql_password: 'testPassword' mysqll_database: »testydb 'testydb' testydb 'testydb' testydb 'testytb' testyb 'testyb' testytb 'testyb' testyb 'testyb' testyb 'testyb' testyb 'testyb' testyb 'testdb» »' Imagen: PhpMyadmin/PhpMyAdmin Enlaces: - 'Mariadb: DB' Puertos: - 8081: 80 Volúmenes: MariadB -Volume: 
    Copiar

    Llamamos a nuestro servicio phpmyadmin y lo configuró para usar el phpmyadmin/phpmyadmin Imagen de Dockerhub. También usamos el Enlaces palabra clave por primera vez; Para qué es esto? Como ya sabemos, de forma predeterminada, y sin necesidad de configuraciones especiales, todos los contenedores creados en la misma configuración de Docker-Compose pueden hablar entre sí. La imagen PhPMyAdmin está configurada para hacer referencia a un contenedor de base de datos en ejecución por el db Nombre, por lo tanto, necesitamos crear un alias con el mismo nombre para nuestro servicio Mariadb. Esto es exactamente lo que Enlaces se usa para: para definir alias adicionales para llegar a un servicio de 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, la interfaz phpmyadmin será accesible en el Localhost: 8081 DIRECCIÓN. Reconstruyamos nuestro proyecto y verifiquemos:

    $ 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 el testdb Se ha creado la base de datos:



    Página de inicio de Phpmyadmin

    Uso de una imagen personalizada para un servicio

    En los ejemplos anteriores, siempre utilizamos imágenes de vainilla en nuestros servicios de definición. Hay casos en los que podemos querer usar imágenes de 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 conveniencia, lo nombre después del servicio:

    $ mkdir php-httpd 

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

    De PHP: 7.3-apache etiqueta mantenedor = "[email protected] "Ejecutar Apt-Get Update && apt-get install -y libmcrypt-dev \ && pecl install mcRypt-1.0.2 \ && Docker-Php-Ext-Enable MCRYPT 

    De vuelta en nuestro compuesto de acopolador.YML Archivo, modificamos la definición del php-httpd servicio. No podemos hacer referencia a la imagen directamente como lo hicimos antes. En cambio, especificamos el directorio que contiene nuestro DockerFile personalizado como el contexto de compilación:

    Versión: '3.7 'Servicios: PHP-HTTPD: Build: Context: ./Puertos PHP -HTTPD: - 80:80 Volúmenes: - "./Documentroot:/var/www/html "[…] 
    Copiar

    En el construir Sección Definimos configuraciones que se aplican en el momento de la compilación. En este caso, usamos contexto 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 Docker Daemon cuando se construye el contenedor. Para aplicar la modificación debemos reconstruir el proyecto.

    Por cierto, para saber más sobre extensiones adicionales en la imagen PHP Docker, puede echar un vistazo a la documentación oficial, y específicamente el Extensiones PECL sección.

    Conclusiones

    En este tutorial vimos cómo construir una pila de lámparas básicas utilizando la tecnología de contenedores con Docker y Docker-Compose. Vimos cómo definir los diversos servicios dentro de Docker-Compose.Archivo de configuración de YML y cómo configurar las montajes de enlace, la asignación de Volúmenes y Puertos Host-Container. También vimos cómo usar imágenes personalizadas. Puede echar un vistazo a la referencia de Docker-Compose para la lista detallada de instrucciones que se pueden usar dentro del archivo de configuración de Docker-Compose.

Tutoriales de Linux relacionados:

  • Ubuntu 20.04 WordPress con instalación de Apache
  • Cosas para instalar en Ubuntu 20.04
  • Instalación de ampache Raspberry Pi
  • Instalación de WordPress OpenLitespeed
  • Cómo trabajar con la API REST de WooCommerce con Python
  • Cómo instalar la pila de lámparas en Almalinux
  • Cómo configurar el servidor Linux Apache MySQL Python
  • Ubuntu 20.04: WordPress con instalación de Nginx
  • Cómo cambiar la contraseña de usuario de mariadb
  • Instale MySQL en Ubuntu 20.04 LTS Linux