Cómo desplegar un servidor con XAMPP (Apache + PHP + MySQL/MariaDB) con persistencia y acceso externo en Docker. Alojamos un sitio web completo en este servidor doquerizado y lo configuramos para acceso a MySQL/MariaDB. Cambiamos la contraseña del usuario root de MySQL/MariaDB de acceso a phpMyAdmin.

Requisitos para desplegar servidor XAMPP en Docker

Necesitaremos disponer de un equipo con Docker Desktop, bien en Windows:

O bien en Linux:

Desplegar servidor XAMPP Apache + PHP + MySQL en Docker

Crearemos una carpeta en el equipo anfitrión con Docker Desktop, bien sea Linux o Windows. En dicha carpeta crearemos un fichero llamado compose.yml, con el siguiente contenido:

En el fichero compose.yml anterior desplegaremos una imagen Docker con XAMPP (Apache + PHP + MySQL/MariaDB). Cada servicio será accesible externamente por los siguientes puertos:

  • SSH: puerto 44162.
  • Web: puerto 41063.
  • MySQL/MariaDB: puerto 41064.

Tal y como hemos indicando en el fichero compose.yml, crearemos una carpeta persistente en /www/ajpdsoft para alojar el sitio web de ejemplo. Crearemos también una base de datos (catálogo) en MySQL, con el nombre «ajpdsoft». Cambiaremos estos valores (y el resto que consideremos, como los puertos) para adaptarlo a nuestras necesidades.

Una vez creado el fichero compose.yml, desde la carpeta donde lo hayamos creado, ejecutaremos el siguiente comando (es el mismo tanto para Linux como para Windows):

Desplegará el contenedor e imagen con XAMPP de forma automática:

Comprobaremos que el contenedor e imagen Docker ha quedado desplegado y permanece iniciado, con el comando:

Comprobaremos que, efectivamente, disponemos de acceso al servidor web Apache por defecto. Para ello, desde un navegador del equipo anfitrión (o desde otro equipo de la red), introduciremos la siguiente URL:

http://localhost:41063/dashboard/

Si accedemos desde un equipo de la red, cambiaremos «localhost» por la IP del equipo anfitrión con Docker Desktop. Si hemos cambiado el puerto, en lugar de 41063, introduciremos el puerto elegido para el servicio web (80 en el contenedor).

Si todo es correcto, nos mostrará la página web de bienvenida de XAMPP:

El fichero de configuración general de Apache se encuentra en:

/opt/lampp/etc/httpd.conf

El fichero general de configuración de MySQL/MariaDB se encuentra en:

/opt/lampp/etc/my.cnf

El fichero de configuración general de PHP se encuentra en:

/opt/lampp/etc/php.ini

Si realizamos algún cambio en la configuración de Apache o PHP o MySQL y queremos que se aplique, podremos reiniciar los servicios, ejecutando el siguiente comando (desde la línea de comandos del equipo anfitrión con Docker Desktop):

Acceso a phpMyAdmin para administrar el servidor MariaDB/MySQL

Para probar el acceso al servidor MySQL/MariaDB en Docker, usaremos la siguiente URL:

http://localhost:41063/phpmyadmin/

(Cambiaremos el puerto por el establecido para el servicio MySQL 3306 en el fichero compose.yml)

Los datos de acceso a MySQL/MariaDB se han establecido, por defecto, en el fichero config.inc.php, por lo que no nos pedirá usuario y contraseña. Directamente accederemos a la gestión web de MariaDB/MySQL:

Como podemos observar en phpMyAdmin, nos habrá creado un catálogo vacío con el nombre «ajpdsoft». Mediante phpMyAdmin podremos, por ejemplo, cargar un fichero SQL exportado de otra base de datos o bien crear tablas y mostrar tablas existentes. También podremos crear nuevos catálogos (bases de datos), aunque no serán persistentes salvo que lo hayamos indicado en el fichero compose.yml (igual que hemos indicando que sea persistente la base de datos ajpdsoft) y cambiar la contraseña de acceso, que por defecto es insegura (usuario root, sin contraseña). Para cambiar la contraseña de acceso pulsaremos en «Cuentas de usuarios»:

De las cuentas que se crean por defecto, la que nos interesa para el acceso dese phpMyAdmin es «root – localhost». Pulsaremos sobre ella para editarla:

Pulsaremos en «Change password»:

Introduciremos la nueva contraseña (por seguridad se recomienda una contraseña fuerte) y pulsaremos en «Guardar»:

Si ahora intentamos acceder a phpMyAdmin, obtendremos este error:

Con el texto:

Error
MySQL ha dicho:
No se estableció la conexión: los parámetros están incorrectos.
mysqli::real_connect(): (HY000/1045): Access denied for user ‘root’@’localhost’ (using password: YES)
phpMyAdmin intentó conectarse con el servidor MySQL, y el servidor rechazó esta conexión. Deberá revisar el host, nombre de usuario y contraseña en config.inc.php y asegurarse que corresponden con la información provista por el administrador del servidor MySQL.

Esto es debido, como hemos indicando anteriormente, a que este despliegue de XAMPP incluye el usuario y contraseña de phpMyAdmin en el fichero /opt/lampp/phpmyadmin/config.inc.php. Para que el error no se produzca, o bien se comentan las líneas del usuario y la contraseña en este fichero, para que nos solicite estos datos al iniciar sesión o bien establecemos la nueva contraseña. A continuación indicamos cómo modificar este fichero mediante acceso SSH.

Acceso SSH al servidor XAMPP en Docker

Puesto que también hemos configurado el acceso externo mediante SSH al servidor XAMPP en Docker, podremos acceder con PuTTY o cualquier otro cliente SSH. Si accedemos desde el equipo anfitrión con Docker Desktop usaremos como IP «localhost» y como puerto el establecido en el fichero compose.yml, en nuestro caso «44162»:

Conectaremos con el servidor doquerizado. Nos solicitará usuario y contraseña, por defecto será:

  • Usuario: root
  • Contraseña: root

Y ya tendremos acceso al equipo Linux en Docker con XAMPP:

Como ejemplo, vamos a modificar el fichero:

/opt/lampp/phpmyadmin/config.inc.php

Para que, por seguridad, siempre nos solicite usuario y contraseña para acceder a phpMyAdmin. Para ello, ejecutaremos el siguiente comando:

Y realizamos las siguientes modificaciones en el fichero. Comentamos, añadiendo «//» delante, las siguientes líneas:

Quedando:

Y añadimos la siguiente línea:

Guardaremos los cambios pulsando Control + O y cerraremos la edición pulsando Control + X.

De esta forma indicamos a phpMyAdmin que muestre formulario de login al acceder, solicitando usuario y contraseña (es la forma más segura). No es necesario reiniciar Apache. Si intentamos acceder a phpMyAdmin, nos solicitará usuario y contraseña:

Si realizamos algún cambio en la configuración de Apache o PHP y queremos reiniciar los servicios, podemos ejecutar el siguiente comando (desde la línea de comandos del equipo anfitrión con Docker Desktop):

(Cambiaremos «xampp-xampp-1» por el nombre que hayamos establecido al contenedor)

Se reiniciarán lo servicios de Apache, MySQL y ProFTPD:

También podremos reiniciar lo servicios desde dentro de la propia máquina (accediendo con SSH) y ejecutando el comando:

Desarrollar sitio web PHP con acceso a MySQL/MariaDB en servidor XAMPP de Docker

Como ejemplo, vamos a crear un sitio web en PHP que accederá al servidor de MariaDB y obtendrá los registros de la tabla «facturas». Para ello, en primer lugar crearemos la tabla facturas, desde phpMyAdmin, en el catálogo «ajpdsoft» (el catálogo persistente indicando en el fichero compose.yml). Ejecutando la siguiente sentencia SQL (o bien desde el modo gráfico):

Insertaremos varios registros a modo de ejemplo, con las siguientes sentencias SQL:

Quedando los siguientes registros en la tabla facturas:

Para probar un sitio web PHP con acceso a esa tabla de facturas, accederemos con algún cliente SSH al servidor XAMPP doquerizado, por ejemplo con Filezilla. Usaremos el mismo puerto que el establecido para SSH:

Accederemos a la carpeta:

/www/ajpdsoft

Que estará vacía. Pulsaremos con el botón derecho del ratón y en el menú emergente elegiremos «Crear nuevo archivo»:

Introduciremos el nombre index.php:

Pulsaremos con el botón derecho del ratón sobre el fichero index.php y elegiremos «Ver/Editar»:

Añadiremos el siguiente código PHP para acceder al servidor MySQL/MariaDB, obtener los registros de la tabla facturas y mostrarlos por pantalla en HTML:

Guardaremos los cambios en el fichero index.php, en Filezilla nos mostrará un mensaje de confirmación para subir el fichero, pulsaremos en «Sí»:

Una vez creado el fichero index.php, si intentamos acceder a la URL:

http://localhost:41063/www/ajpdsoft/index.php

Veremos que se nos descargará el fichero info.php, como si de un fichero de descarga se tratara, en lugar de ejecutarse como PHP. Para solucionar este problema, crearemos un fichero con el nombre httpd.conf en la carpeta:

/opt/lampp/apache2/conf.d

Con el siguiente contenido:

Lo crearemos en la carpeta indicada para que sea persistente, dado que es la ubicación que hemos indicado para el volumen correspondiente del contenedor en el fichero compose.yml.

Puesto que hemos aplicado cambios en ficheros de configuración de Apache, reiniciaremos los servicios, ejecutando (desde la línea de comandos del equipo anfitrión con Docker Desktop):

Ahora sí podremos ejecutar nuestro sitio web en PHP con acceso a MySQL/MariaDB en Docker:

http://localhost:41063/www/ajpdsoft/index.php