MySQL en un contedor LXD

Con frecuencia es necesario instalar algún servidor en una MV para realizar una práctica. Pero en las aulas está instalado y configurado LXD, así que también es posible trabajar de una manera más ágil utilizando un contenedor LXD.

Aquí se va a mostrar el caso práctico para MySQL pero esto mismo se puede utilizar prácticamente cualquier servicio.

Cuestiones básicas

Los contenedores utilizan virtualización a nivel de sistema operativo, consumen muchos menos recursos que las máquinas virtuales y ofrecen un mayor rendimiento. Además el usuario se ahorra tener que importar/exportar las imágenes de las MVs porque se descargan automáticamente desde un repositorio. La herramienta para gestionar los contenedores es lxc y a continuación se muestra como lanzar un nuevo contenedor.

vcarceler@dptinf-29:~$ lxc list
+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+
vcarceler@dptinf-29:~$ lxc launch ubuntu:18.04 smx2a-vcarceler-mysql
Creating smx2a-vcarceler-mysql
Starting smx2a-vcarceler-mysql              
vcarceler@dptinf-29:~$ lxc list
+-----------------------+---------+-----------------------+------+------------+-----------+
|         NAME          |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+-----------------------+---------+-----------------------+------+------------+-----------+
| smx2a-vcarceler-mysql | RUNNING | 192.168.17.139 (eth0) |      | PERSISTENT | 0         |
+-----------------------+---------+-----------------------+------+------------+-----------+
vcarceler@dptinf-29:~$

¡Ya tenemos un contenedor en marcha!

Es importante utilizar un nombre que indique: grupo, usuario y función. Para que se sepa de quién es el contenedor. También es importante detener con lxc stop el contenedor cuando acabe la clase para que no arranque automáticamente cuando se reinicie el equipo.

Instalación de MySQL en el contenedor

Una vez que tenemos el contenedor podemos obtener un shell en su interior.

vcarceler@dptinf-29:~$ lxc exec smx2a-vcarceler-mysql -- /bin/bash
root@smx2a-vcarceler-mysql:~#

E instalar MySQL de la manera habitual.

root@smx2a-vcarceler-mysql:~# apt update
:
root@smx2a-vcarceler-mysql:~# apt install mysql-server

Se puede comprobar que MySQL ya está en ejecución.

root@smx2a-vcarceler-mysql:~# ps fax
  PID TTY      STAT   TIME COMMAND
  313 ?        Ss     0:00 /bin/bash
 1714 ?        R+     0:00  \_ ps fax
    1 ?        Ss     0:00 /sbin/init
   64 ?        Ss     0:00 /lib/systemd/systemd-journald
   73 ?        Ss     0:00 /lib/systemd/systemd-udevd
  157 ?        Ss     0:00 /lib/systemd/systemd-networkd
  158 ?        Ss     0:00 /lib/systemd/systemd-resolved
  195 ?        Ss     0:00 /lib/systemd/systemd-logind
  197 ?        Ss     0:00 /usr/sbin/atd -f
  199 ?        Ss     0:00 /usr/sbin/cron -f
  200 ?        Ssl    0:00 /usr/lib/accountsservice/accounts-daemon
  202 ?        Ssl    0:00 /usr/sbin/rsyslogd -n
  206 ?        Ss     0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --sy
  225 ?        Ssl    0:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
  226 ?        Ss     0:00 /usr/sbin/sshd -D
  228 ?        Ssl    0:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdow
  232 console  Ss+    0:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 l
  234 ?        Ssl    0:00 /usr/lib/policykit-1/polkitd --no-debug
 1180 ?        Sl     0:00 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
root@smx2a-vcarceler-mysql:~#

En el interior de un contenedor únicamente se ven los procesos del contenedor. En la máquina anfitriona se ven todos los procesos del sistema (incluidos los de los contenedores).

Configuración de MySQL para permitir el acceso de clientes remotos

Por razones de seguridad la configuración por defecto del servidor MySQL únicamente admite conexiones desde el propio equipo. Pues en el fichero de configuración /etc/mysql/mysql.conf.d/mysqld.cnf se utiliza la directiva bind-address para indicar la interfaz 127.0.0.1.

root@smx2a-vcarceler-mysql:~# cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep bind-address
bind-address        = 127.0.0.1
root@smx2a-vcarceler-mysql:~#

Para que el servidor acepte conexiones de equipos remotos convendrá substituir 127.0.0.1 por 0.0.0.0 para que el servidor abra un puerto en todas las interfaces de red. Después será necesario reiniciar el servicio (o el contenedor) y ya se podrá utilizar mysql (o cualquier otro cliente) para establecer una conexión con el servidor.

root@smx2a-vcarceler-mysql:~# vi /etc/mysql/mysql.conf.d/mysqld.cnf 
root@smx2a-vcarceler-mysql:~# systemctl restart mysql

Declarar una nueva BBDD con un usuario y la IP desde la que se va a acceder:

root@smx2a-vcarceler-mysql:~# mysql -u root 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.28-0ubuntu0.18.04.4 (Ubuntu)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE bbdd;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON bbdd.* TO usuario@192.168.17.29 IDENTIFIED BY 'secreto';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>

Y desde la máquina física (o desde otro equipo del aula) conectar con nuetro servidor:

vcarceler@dptinf-29:~$ mysql -u usuario -h 192.168.17.139 -psecreto bbdd
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.28-0ubuntu0.18.04.4 (Ubuntu)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>