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>