Publicidad

Instalar un entorno LAMP con docker en Linux


Por Alex el 21/08/2023, Comentar el artículo

Comparte este artículo:      




Aprende a instalar un entorno LAMP (Linux, Apache, MySQL y PHP) con Docker, una de las herramientas más utilizadas para la creación, implementar y ejecutar aplicaciones en diferentes entornos. Utilizaremos DockerFile y docker-compose para que en cuestión de minutos podamos tener un entorno LAMP funcionando.


Si no tenéis docker instalado revisar esta guía: Instalar Docker en Linux . Os dejo los scripts de creación del entorno LAMP, de los dockers de Apache2+php y del docker de MySql en este repositorio:
https://github.com/depruebas/entorno-lamp-docker

Y ahora explico la estructura, como esta organizado y como ponerlo en marcha.

Estructura de directorios

Todo proyecto tiene que tener su estructura de directorios y este no va a ser menos.

Estructura web - Proyecto docker

Esta es la estructura del proyecto docker, aquí nos falta la estructura del proyecto/s web que explico después.

Esta estructura (podéis crearos la vuestra si esta no os gusta) consta de varios directorios y ficheros:

  • docker, directorio donde esta el fichero para crear la imagen del contenedor (no el contenedor) de apache + php con todas las aplicaciones y módulos que se necesiten a través del fichero Dockerfile que ahora describire. Y consta de un directorio config que mapearemos dentro del contenedor docker para tener accesibles los ficheros de configuración que necesitemos. De momento solo el fichero para configurar los virtualhost de Apache2. Si no teneis muy claro el tema de los Virtualhost aquí teneis un artículo donde lo explico: Crear un virtualhost de Apache en Linux.
  • temp, un directorio que mapeamos dentro de los containers para transferir ficheros desde nuestra maquina al entorno virtual de docker mientras estamos trabajando.
  • El fichero docker-compose.yml que creará los contenedores de Apache+PHP que llamaremos lamp-apache a partir de la imagen que le indicamos en el Dockerfile y creará un contenedor de MySql que llamaremos lamp-mysql a partir de imagen estándar de MySql 8.x.
  • El fichero makeDocker.sh que contiene ordenes docker para ejecutar containers: start, stop, ejecutar comandos, etc ...

Por otro lado tenemos el directorio donde irán las aplicaciones web, en este caso he creado un directorio llamado PHP para los proyectos en php y lo mapeamos también al contenedor lamp-apache, mi directorio de ejemplo es /media/depruebas/DATOS_100/wwwroot/2023/proyectos/php vosotros tenéis que poner vuestra ruta. Si tenemos proyectos en nodejs o en python podemos crear otros directorios y mapearlos igual al contenedor como lo hacemos con el directorio de php.

Estructura web - Proyecto docker

Como se ve en la imagen este directorio PHP tiene tres subdirectorios dos webs de pruebas (pruebas y web01) y un directorio para el phpMyAdmin para acceder a MySql



Ficheros Dockerfile y docker-compose.yml

Una vez explicada la estructura de directorios pego aquí el fichero Dockerfile con el que crearemos la imagen a medida de nuestras necesidades y debajo el fichero docker-compose.yml con el que crearemos los contenedores a partir de las imágenes. El código de los dos ficheros esta muy comentado así que revisarlo y leerlo para saber que hace cada cosa.


# Utilizamos para crear el servidor de Ubuntu 22.04 una imagen oficial del repositorio de docker
FROM ubuntu:22.04

# Creamos un usuario para tener un directorio (/home/devuser)  donde guardar los ficheros que podamos utilizar como configs
# y directorios que queramos mapear desde nuestra maquina (por ejemplo temp)
RUN adduser --disabled-password --gecos '' devuser

# Establecemos la zona horaria y con el comado RUN creamos un enlace simbolico del fichero
# /usr/share/zoneinfo/Europe/Madrid (Europe/Madrid se lo pasamos como parametro) y despues 
# añadimos Europe/Madrid en el fichero /etc/timezone
ENV TZ=Europe/Madrid
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# Actualizamos los repositorios e instalamos las aplicaciones necesarias 
# Aqui si necesitais otras podeis ponerlas al final de la linea
RUN apt-get update -y \
    && apt-get install -y git acl openssl openssh-client wget zip curl gcc make perl vim htop \ 
    libpng-dev zlib1g-dev libzip-dev libxml2-dev libicu-dev \ 
    apache2 php-mysql php-curl php-tidy php-gd php-cli php-pear php-pgsql php-dev libapache2-mod-php \
    php-mbstring apache2-dev net-tools

# Actualizamos el sistema por si hay alguna actualización
RUN apt-get upgrade -y

# Despues de instalarlo todo activamos el mod_rewrite en apache para poder utilizar url friendly
RUN ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load 

# En estas tres lineas que siguen creamos tres directos en nuestro nuevo servidor Ubuntu
#
# /var/www/html/php = en este directorio mapeamos (después con el fichero docker-compose.yml) nuestros proyectos
# web o no web que tenemos en algun directorio de nuestro ordenador
RUN mkdir -p /var/www/html/php

# creamos el directorio donde pondremos los ficheros de configuración que utilizaremos en le servidor
RUN mkdir -p /home/devuser/config

# Creamos un directorio temp para poder dejar fciheros que necesitemos en el servidor
RUN mkdir -p /home/devuser/temp

# creamos un enlace simbolico de nuestro fichero de virtualhosts de apache al directorio de 
# apache donde tiene que estar
RUN ln -s /home/devuser/config/2023-php.conf  /etc/apache2/sites-enabled/2023-php.conf

# Instalamos composer, si utilizamos algun framework como symfony nos hara falta
RUN curl https://getcomposer.org/composer.phar -o /usr/bin/composer && chmod +x /usr/bin/composer

# Le decimos que escuche en el puerto 80 para el servidor Web
EXPOSE 80

# y le decimos que al arrancar la maquina ejecute apache2 para que este listo para trabajar.
ENTRYPOINT ["apache2ctl", "-D", "FOREGROUND"]


Y a continuación del fichero docker-compose.yml


# Version de docker-compose que utilizamos
version: '3.5'

# En la seccion de services definimos los containers que vamos a utilizar en este proyecto son dos
# Un servidor Web con apache y php que crearemos a partir de un fichero Dockerfile llamado lamp-apache
# Y un servidor de MySql desde ima imagen estandard  
services:
  lamp-apache:

     # Nombre que le damos al contenedor, sale en el campo NAME
    container_name: lamp-apache

    # En build / context le decimos donde esta el Dockerfile que va a utilizar para crear la imagen 
    # (si la imagen no la tenemos)
    build:
      context: ./docker

    # Volumes, son las unidades de nuestro disco que vamos a mapear en el servidor lamp-apache
    # Si os fijas los tres rutas que mapeo se corresponden a los tres directorios que se crean
    # en el Dockerfile.
    # Esta ruta (media/depruebas/DATOS_100/wwwroot/2023/proyectos/php/) es de mi pc, tenéis que
    # cambiarla por la vuestra, donde tengáis o queráis poner las aplicaciones web
    volumes:
      - /media/depruebas/DATOS_100/wwwroot/2023/proyectos/php/:/var/www/html/php
      - ./docker/config:/home/devuser/config/
      - ./temp:/home/devuser/temp/

    # networks, esto es opcional ponerlo, y le asigno una IP fija a los contenedores para
    # que los servidores de apache y MySql se vean entre si y se puedan conectar.
    # Si no se pone ip fija se asigna una variable por defecto
    networks:
      red_1:
        ipv4_address: 172.21.0.3

    hostname: servidor_web

    # dependencia del arranque del contenedor de MySql que lo arrancara primero
    depends_on:
      - lamp-mysql

  # El siguiente contenedor que especificamos es el de MySql
  lamp-mysql:

    # Nombre que le damos al contenedor, sale en el campo NAME cuando hacemos un docker ps
    container_name: lamp-mysql

    # Imagen que utilizamos del repositorio una oficial de MySql, en este caso no utilizamos
    # ningun Dockerfile
    image: mysql:8.0.26

    # En el puerto que lo ponemos
    ports:
      - '3336:3306'

    # Password del servidor de MySql user=root password=root
    environment:
      MYSQL_ROOT_PASSWORD: root

    # Volumes, son las unidades de nuestro disco que mapeamos al servidor
    # los datos de la base de datos mysql-data-8 que guardamos en nuestro ordenador para
    # que cada vez que eliminemos y creemos el contenedor persistan los datos
    # y temp y directorio temporar para transferir datos entre mi ordenador y el server
   # si este directorio no existe en tu local, lo crea.
    volumes:
      - /home/depruebas/datos/mysql-data-8:/var/lib/mysql
      - ./temp:/mnt

    # le damos una IP fija para tener siempre la misma y asi no tener que cambiar las conexiones
    # cada vez que se crea el contenedor
    networks:
      red_1:
        ipv4_address: 172.21.0.2

    # Ejecutamos el MySql al arrancar la maquina
    command: [ 'mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci' ]

# En networks definimos el tipo de red que queremos para nuestros contendores.
networks:
  red_1:
    driver: bridge
    ipam:
      config:
        - subnet: 172.21.0.0/16
          gateway: 172.21.0.1





Estructura de directorios

Desde el terminal ejecutamos el comando (en el directorio del proyecto) docker-compose para levantar los dos containers y poner nuestro entorno LAMP a funcionar:

docker-compose up -d

La primera vez que ejecutéis este comando creará las imágenes de los dockers en base al fichero Dockerfile y al repositorio de MySql según hemos especificado en el fichero docker-compose.yml.

docker-compose - creación de imágenes

Cuando acabe ejecutamos el comando

docker ps

Y veremos que tenemos dos contenedores en marcha lamp-apache y lamp-mysql son las dos maquinas virtuales que acabamos de crear para nuestro entorno LAMP.

Y para ver todos los contenedores que tenemos aunque estén parados el comando

docker ps -a


docker ps - contenedores LAMP

Ahora ya esta creado el entorno y funcionando, solo queda probarlo.

Para parar el entorno de desarrollo ejecutaremos el siguiente comando

docker-compose down

Y para volverlo a arrancar el mismo de antes

docker-compose up -d

El fichero makeDocker.sh contiene instrucciones como las anteriores para que sea mas cómodo arrancar y parar los contenedores.

#!/usr/bin/env bash

case $1 in

  # Paramos los contenedores
	stop)
     echo "Parando containers:  docker-compose down"
    docker-compose down
  ;;

  # Arrancamos los contenedores y si no existen los crea
  start)
    echo "Iniciando containers:  docker-compose up -d"
    docker-compose up -d
  ;;

  # Accedemos a un contenedor con si fuerea un servidor remoto pasandole
  # como parametro el nombre del contedor, la forma de utilizarlo seria
  # ./makeDocker.sh lamp-apache
  # y este comando ejecutaria la sentencia "docker exec -it lamp-apache bash"
  ssh)
    echo "docker exec -it $2 bash"
    docker exec -it $2 bash
  ;;
  
  # Accedemos a un contenedor con si fuerea un servidor remoto pasandole
  # como parametro el nombre del contedor y el comando a ejecutar, la forma de utilizarlo seria
  # ./makeDocker.sh lamp-apache bash
  # y este comando ejecutaria la sentencia "docker exec -it lamp-apache bash"
	execute)
    echo "docker exec -it $2 $3"
    docker exec -it $2 $3
  ;;

esac
#


por ejemplo si quisierasmos entrar al MySql dentro del contenedor lo haríamos de esta forma:

./makeDocker.sh execute lamp-mysql 'mysql -u root -proot'


Ejecución de MySql en entorno Docker

Y como probar si funciona, pues una vez todo creado y veis que con docker ps están los dos contenedores en marcha en el directorio que habeis mapeado como directorio web de PHP, en mi caso /media/depruebas/DATOS_100/wwwroot/2023/proyectos/php/, creáis un proyecto web, y tenéis que crear la entrada Virtualhost de Apache2 en el fichero de configs que esta mapeada dentro del contenedor, en el ejemplo se llama 2023-php.conf y después añadir en vuestro fichero /etc/hosts local la IP del contenedor lamp-apache y en la url del web que habéis creado, por ejemplo

172.21.0.2 pruebas2.local

Esta url http://pruebas2.local la poneis en el navegador y deberia salir vuestro web.

Revisar las rutas y cambiar las que hay en los ejemplos locales, no las de los contenedores, y poner las vuestras.

Y esto es todo, feliz programming
Saludos
Alex
/

Si te ha gustado el artículo compartelo en:      




Añadir un comentarios:

Nombre:
Email: (no se publica el email)

avatar

Kev 02/11/2023 05:39:21

Gracias man ! que buen tutorial xD poco a poco le agarro el tiro a Docker




SIGUENOS EN

ARCHIVO

Publicidad

.