A veces queremos instalar una versión específica de MariaDB, MariaDB Galera Cluster o MaxScale en un sistema determinado, pero no hay paquetes disponibles. O tal vez, simplemente queremos aislar MariaDB del resto del sistema, para estar seguros de que no causaremos ningún daño.

Sin duda, una máquina virtual serviría para el alcance. Sin embargo, esto significa instalar un sistema en la parte superior de otro sistema. Requiere muchos recursos.

En muchos casos, la mejor solución es Docker. Docker es un marco que ejecuta contenedores. Un contenedor está destinado a ejecutar un demonio específico y el software que se necesita para que ese demonio funcione correctamente. Docker no virtualiza un sistema completo; un contenedor solo incluye los paquetes que no están incluidos en el sistema subyacente.

Docker requiere una cantidad muy pequeña de recursos. Puede ejecutarse en un sistema virtualizado. Se utiliza tanto en entornos de desarrollo como de producción.

Docker es un proyecto de código abierto, publicado bajo la licencia Apache, versión 2.

Tenga en cuenta que, si bien sus repositorios de paquetes podrían tener un paquete llamado docker, probablemente no es el Docker del que estamos hablando. El paquete Docker podría llamarse docker.io o docker-engine.

Instalación de Docker en su sistema con el script de instalación universal

El siguiente script instalará los repositorios de Docker, los módulos y paquetes del kernel necesarios en las distribuciones de Linux más comunes:

curl -sSL https://get.docker.com/ | sh

Uso de imágenes MariaDB

La forma más sencilla de usar MariaDB en Docker es elegir una imagen MariaDB y crear un contenedor.

Descarga de una imagen

Puede descargar una imagen MariaDB para Docker desde el Repositorio oficial de MariaDB, o elija otra imagen que se adapte mejor a sus necesidades. Puede buscar en Docker Hub (el conjunto oficial de repositorios) una imagen con este comando:

 docker search mariadb

Una vez que haya encontrado una imagen que desee utilizar, puede descargarla a través de Docker. También se descargarán algunas capas, incluidas las dependencias necesarias. Tenga en cuenta que, una vez que se descarga una capa para una determinada imagen, Docker no necesitará descargarla nuevamente para otra imagen.

Por ejemplo, si desea instalar la imagen MariaDB predeterminada, puede escribir:

docker pull mariadb/server:10.3

Esto instalará la versión 10.3. Las versiones 10.1 y 10.2 también son opciones válidas.

Verá una lista de capas necesarias. Para cada capa, los Dockers dirán si ya está presente o su progreso de descarga.

Para obtener una lista de imágenes instaladas:

docker images

Creando un contenedor

Una imagen no es un proceso en ejecución; es solo el software que se necesita para iniciar. Para ejecutarlo, primero debemos crear un contenedor. El comando necesario para crear un contenedor generalmente se puede encontrar en la documentación de la imagen. Por ejemplo, para crear un contenedor para la imagen oficial de MariaDB:

docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD=mypass -d mariadb/server:10.3

mariadbtest es el nombre que queremos asignar al contenedor. Si no especificamos un nombre, se generará una identificación automáticamente.

10.1 y 10.2 también son versiones de destino válidas:

docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD=mypass -d mariadb/server:10.1
docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD=mypass -d mariadb/server:10.2

Opcionalmente, después del nombre de la imagen, podemos especificar algunas opciones para mysqld. Por ejemplo:

docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD=mypass -d mariadb/server:10.3 --log-bin --binlog-format=MIXED

Docker responderá con la identificación del contenedor. Pero, solo para estar seguros de que el contenedor se ha creado y se está ejecutando, podemos obtener una lista de contenedores en ejecución de esta manera:

docker ps

Deberíamos obtener una salida similar a esta:

CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS              PORTS               NAMES
819b786a8b48        mariadb/server             "/docker-entrypoint.   4 minutes ago       Up 4 minutes        3306/tcp            mariadbtest        

Ejecutar y detener el contenedor

Docker nos permite reiniciar un contenedor con un solo comando:

docker restart mariadbtest

El contenedor también se puede detener así:

docker stop mariadbtest

El contenedor no será destruido por este comando. Los datos seguirán viviendo dentro del contenedor, incluso si MariaDB no se está ejecutando. Para reiniciar el contenedor y ver nuestros datos, podemos emitir:

docker start mariadbtest

Con docker stop, el contenedor se terminará elegantemente: a SIGTERM la señal será enviada al mysqld y Docker esperará a que el proceso se apague antes de devolver el control al shell. Sin embargo, también es posible establecer un tiempo de espera, después del cual el proceso se cerrará inmediatamente con un SIGKILL. O es posible matar inmediatamente el proceso, sin tiempo de espera.

docker stop --time=30 mariadbtest
docker kill mariadbtest

En caso de que queramos destruir un contenedor, quizás porque la imagen no se ajusta a nuestras necesidades, podemos detenerlo y luego ejecutar:

docker rm mariadbtest

Tenga en cuenta que el comando anterior no destruye el volumen de datos que Docker ha creado para / var / lib / mysql. Si también desea destruir el volumen, use:

docker rm -v mariadbtest

Pausar contenedores

Un recipiente también se puede congelar con el pause mando. Docker congelará el proceso usando croups. MariaDB no sabrá que se está congelando y, cuando unpause Esto, MariaDB reanudará su trabajo como se esperaba.

Ambos pause y unpause aceptar uno o más nombres de contenedor. Entonces, si estamos ejecutando un clúster, podemos congelar y reanudar todos los nodos simultáneamente:

docker pause node1 node2 node3
docker unpause node1 node2 node3

Pausar un contenedor es muy útil cuando necesitamos liberar temporalmente los recursos de nuestro sistema. Si el contenedor no es crucial en este momento (por ejemplo, está realizando algún trabajo por lotes), podemos liberarlo para permitir que otros programas se ejecuten más rápido.

Solución de problemas de un contenedor

Si el contenedor no se inicia o no funciona correctamente, podemos investigar con el siguiente comando:

docker logs mariadbtest

Este comando muestra lo que el demonio envió a la salida estándar desde el último intento de inicio: el texto que normalmente vemos cuando invocamos mysqld desde la línea de comando.

En algunos sistemas, incluidas las versiones recientes de Ubuntu, comandos como docker stop mariadbtest y docker restart mariadbtest puede fallar con un error de permisos. Esto puede deberse al paquete AppArmor, e incluso sudo no le permitirá ejecutar el comando. Puede eliminar totalmente AppArmor usando los siguientes comandos:

sudo apt-get purge --auto-remove apparmor
sudo service docker restart
docker system prune --all --volumes

Reiniciar el sistema permitirá que Docker funcione normalmente. Hay más información disponible en los foros de Docker: https://forums.docker.com/t/can-not-stop-docker-container-permission-denied-error/41142/3

Accediendo al contenedor

Para acceder al contenedor a través de Bash, podemos ejecutar este comando:

docker exec -it mariadbtest bash

Ahora podemos usar comandos normales de Linux como CD, ls, etc. Tendremos privilegios de root. Incluso podemos instalar nuestro editor de archivos favorito, por ejemplo:

apt-get update
apt-get install vim

En algunas imágenes, no se configura ningún repositorio de forma predeterminada, por lo que es posible que debamos agregarlas.

Tenga en cuenta que si ejecutamos mysqladmin shutdown o el comando SHUTDOWN para detener el contenedor, el contenedor se desactivará y automáticamente saldremos de nuestro sistema.

Conexión a MariaDB desde fuera del contenedor

Si intentamos conectarnos al servidor MariaDB en localhost, el cliente pasará por alto la red e intentará conectarse al servidor utilizando un archivo de socket en el sistema de archivos local. Sin embargo, esto no funciona cuando MariaDB se ejecuta dentro de un contenedor porque el sistema de archivos del servidor está aislado del host. El cliente no puede acceder al archivo de socket que está dentro del contenedor, por lo que no se puede conectar.

Por lo tanto, las conexiones al servidor MariaDB deben realizarse mediante TCP, incluso cuando el cliente se ejecuta en la misma máquina que el contenedor del servidor.

La mayoría de las imágenes de MariaDB, incluida la oficial, tienen conexiones TCP externas deshabilitadas usando el bind-address opción en su archivo # my.cnf #. La imagen de la ventana acoplable utilizada en esta guía se basa en Ubuntu, por lo que el archivo se encuentra en /etc/mysql/my.cnf.

Para usar MariaDB, necesitaremos editar el archivo de configuración para cambiar la opción apropiada y luego reiniciar el contenedor.

Dentro del contenedor, edite el archivo my.cnf y verifique la línea que comienza bind-address. Ponga un hash al principio de la línea para comentarlo:

#bind-address            = 127.0.0.1

Guarda el archivo.

Mientras todavía está dentro del contenedor, envíe el comando de apagado a MariaDB. Esto apagará el servidor y también volverá a salir al host:

mysqladmin -u root -p shutdown

Inicie el recipiente de nuevo. Esta vez, el servidor MariaDB tendrá la red habilitada:

docker start mariadbtest

Busque la dirección IP que se ha asignado al contenedor:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariadbtest

Ahora puede conectarse al servidor MariaDB mediante una conexión TCP a esa dirección IP.

Forzar una conexión TCP

Después de habilitar las conexiones de red en MariaDB como se describió anteriormente, podremos conectarnos al servidor desde fuera del contenedor.

En el host, ejecute el cliente y establezca la dirección del servidor (“-h”) en la dirección IP del contenedor que encontró en el paso anterior:

mysql -h 172.17.0.2 -u root -p

Esta forma simple de conexión debería funcionar en la mayoría de situaciones. Dependiendo de su configuración, también puede ser necesario especificar el puerto para el servidor o forzar el modo TCP:

mysql -h 172.17.0.2 -P 3306 --protocol=TCP -u root -p

Configuración de puertos para contenedores agrupados y replicación

Varios servidores MariaDB que se ejecutan en contenedores Docker separados pueden conectarse entre sí mediante TCP. Esto es útil para formar un clúster de Galera o para la replicación.

Al ejecutar un clúster o una configuración de replicación a través de Docker, querremos que los contenedores usen puertos diferentes. La forma más rápida de lograr esto es mapear los puertos de los contenedores a diferentes puertos en nuestro sistema. Podemos hacer esto al crear los contenedores (docker run comando), utilizando el -p opción, varias veces si es necesario. Por ejemplo, para los nodos de Galera usaremos un mapeo similar a este:

-p 4306:3306 -p 5567:5567 -p 5444:5444 -p 5568:5568

Instalación de MariaDB en otra imagen

Es posible descargar una imagen de distribución de Linux e instalar MariaDB en ella. Esto no es mucho más difícil que instalar MariaDB en un sistema operativo normal (lo cual es fácil), pero sigue siendo la opción más difícil. Normalmente, probaremos primero las imágenes existentes. Sin embargo, es posible que no haya ninguna imagen disponible para la versión exacta que queremos, o queremos una instalación personalizada, o quizás queremos utilizar una distribución para la que no hay imágenes disponibles. En estos casos, instalaremos MariaDB en una imagen del sistema operativo.

Daemonización del sistema operativo

Primero, necesitamos que la imagen del sistema se ejecute como un demonio. Si omitimos este paso, MariaDB y todas las bases de datos se perderán cuando el contenedor se detenga.

Para demonizar una imagen, necesitamos darle una orden que nunca termina. En el siguiente ejemplo, crearemos un demonio Debian Jessie que constantemente hace ping a la dirección especial 8.8.8.8:

docker run --name debian -p 3306:3306 -d debian /bin/sh -c "while true; do ping 8.8.8.8; done"

Instalación de MariaDB

En este punto, podemos ingresar al shell y emitir comandos. Primero necesitaremos actualizar los repositorios o no habrá paquetes disponibles. También podemos actualizar los paquetes, en caso de que algunos de ellos sean más nuevos que la imagen. Luego, necesitaremos instalar un editor de texto; lo necesitaremos para editar archivos de configuración. Por ejemplo:

docker exec -ti debian bash
apt-get -y update
apt-get -y upgrade
apt-get -y install vim

Ahora estamos listos para instalar MariaDB de la forma que prefiramos.

Ver también

El contenido reproducido en este sitio es propiedad de sus respectivos dueños, y MariaDB no revisa este contenido con anticipación. Los puntos de vista, la información y las opiniones expresadas por este contenido no representan necesariamente las de MariaDB o de cualquier otra parte.