Primeros pasos con
Imágenes de Incus Personalizadas
Inicio Rápido
Desde está página podrás configurar un entorno de desarrollo en unos simples pasos. Para consultar información detallada, visite el resto de secciones de la documentación.
El objetivo de esta guía no es el de aprender a utilizar el sistema de virtualización de Incus, si no cómo utilizar las imágenes de sistemas operativos creadas para ejecutarse sobre Incus. Aquí aprenderá a utilizar los comandos esenciales para manejar las imágenes personalizadas. Si desconoce el sistema de Incus, le recomiendo que le eche un vistazo a la documentación para aprender a utilizarlo.
Para poder configurar el entorno, se da por hecho que tiene instalada la última versión de estable de Incus.
1. Importar imagen
La imagen con la que vamos a trabajar es: debian-apache-php-mysql8-0.1.0.tar.gz
$ wget https://github.com/jrubiales/imagenes-incus-personalizadas/releases/download/v0.1.0/debian-apache-php-mysql8-0.1.0.tar.gz
$ incus image import debian-apache-php-mysql8-0.1.0.tar.gz
Incus devolverá lo siguiente:
> Image imported with fingerprint: 69695c414e15c68a71495d8b60c03b39dcf9b2a3249ea6df85f4fc58995c1a37
Con el siguiente comando, listamos las imágenes:
$ incus image list
+--------------------------+----------------+--------+------------------------------------------------------------------------+--------------+-----------+-----------+----------------------+ | ALIAS | HUELLA DIGITAL | PUBLIC | DESCRIPCIÓN | ARQUITECTURA | TYPE | SIZE | UPLOAD DATE | +--------------------------+----------------+--------+------------------------------------------------------------------------+--------------+-----------+-----------+----------------------+ | | 69695c414e15 | no | Debian bookworm amd64 with Apache2+PHP+MySQL8 (cloud) (20240318_16:22) | x86_64 | CONTAINER | 456.54MiB | 2024/03/22 00:37 CET | +--------------------------+----------------+--------+------------------------------------------------------------------------+--------------+-----------+-----------+----------------------+
También podemos importarlo añadiendole un alias:
$ incus image import debian-apache-php-mysql8-0.1.0.tar.gz --alias "debian-apache-php-mysql8"
$ incus image list
+--------------------------+----------------+--------+------------------------------------------------------------------------+--------------+-----------+-----------+----------------------+ | ALIAS | HUELLA DIGITAL | PUBLIC | DESCRIPCIÓN | ARQUITECTURA | TYPE | SIZE | UPLOAD DATE | +--------------------------+----------------+--------+------------------------------------------------------------------------+--------------+-----------+-----------+----------------------+ | debian-apache-php-mysql8 | 69695c414e15 | no | Debian bookworm amd64 with Apache2+PHP+MySQL8 (cloud) (20240318_16:22) | x86_64 | CONTAINER | 456.54MiB | 2024/03/22 00:46 CET | +--------------------------+----------------+--------+------------------------------------------------------------------------+--------------+-----------+-----------+----------------------+
2. Creación de la instancia (contenedor)
La imagen importada solo podrá ser usada para crear contenedores.
Vamos a crear un contendedor llamado "debian-web" a partir de la imagen importada anteriormente debian-apache-php-mysql8
$ incus init debian-apache-php-mysql8 debian-web
> Creando debian-web
$ incus list
+------------------------------+---------+----------------------+----------------------------------------------+-----------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------------------------------+---------+----------------------+----------------------------------------------+-----------------+-----------+ | debian-web | STOPPED | | | CONTAINER | 0 | +------------------------------+---------+----------------------+----------------------------------------------+-----------------+-----------+
En este punto podríamos configurar algún parámetro del contenedor, el fichero cloud-init o arrancar el contendedor.
$ incus start debian-web
+------------------------------+---------+----------------------+----------------------------------------------+-----------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------------------------------+---------+----------------------+----------------------------------------------+-----------------+-----------+ | debian-web | RUNNING | 10.203.99.131 (eth0) | fd42:d7ce:7828:c29:216:3eff:fef2:76bc (eth0) | CONTAINER | 0 | +------------------------------+---------+----------------------+----------------------------------------------+-----------------+-----------+
Otra forma para crear y arrancar el contenedor directamente seria:
$ incus launch debian-apache-php-mysql8 debian-web
Launching debian-web
$ incus list
+------------------------------+---------+----------------------+----------------------------------------------+-----------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------------------------------+---------+----------------------+----------------------------------------------+-----------------+-----------+ | debian-web | RUNNING | 10.203.99.131 (eth0) | fd42:d7ce:7828:c29:216:3eff:fef2:76bc (eth0) | CONTAINER | 0 | +------------------------------+---------+----------------------+----------------------------------------------+-----------------+-----------+
3. Configurar entorno desarrollo
Accedemos al contenedor por la consola con el siguiente comando:
$ incus exec debian-web bash
Lanzamos el script generate-apache2-vhost que nos hará una serie de preguntas. Este script permite crear host virtuales de apache de forma rápìda e intuitiva, y sin tener que editar configuraciones.
$ generate-apache2-vhost
Introduzca el hostname (ej. example.com): midominio.test Introduzca el alias (ej. www.midominio.test)? (opcional): www.midominio.test Introduce el directorio donde se almacenará el proyecto web (opcional) [Por defecto=/var/www/midominio.test]: Introduce el directorio raiz donde se almacenará el punto de entrada de la web (ej. /var/www/midominio.test/public) (opcional) [Por defecto=/var/www/midominio.test]: ¿Desea generar automáticamente el host virtual en /etc/apache2/sites-available? (s/n) [Por defecto=n]: s ¿Desea generar automáticamente el árbol de directorios del proyecto en /var/www? (s/n) [Por defecto=n]: s
Con esto ya tenemos configurado nuestro host virtual. Podemos comprobarlo de la siguiente manera:
$ ls -l /etc/apache2/sites-enabled/
total 0
lrwxrwxrwx 1 root root 35 Mar 16 02:14 000-default.conf -> ../sites-available/000-default.conf
lrwxrwxrwx 1 root root 36 Mar 22 01:14 midominio.test.conf -> ../sites-available/midominio.test.conf
$ ls -la /var/www/
total 16
drwxr-xr-x 4 root root 4096 Mar 22 01:14 .
drwxr-xr-x 12 root root 4096 Mar 16 02:14 ..
drwxr-xr-x 4 www-data www-data 4096 Mar 16 02:34 html
drwxrwx--- 2 debian www-data 4096 Mar 22 01:14 midominio.test
Procedemos a crear el fichero index.php. Si has seleccionado otro directorio raiz, tendrás que modificar el path.
$ echo "<?php phpinfo(); ?>" > /var/www/midominio.test/index.php
Si editamos el archivo /etc/hosts de nuestro equipo y apuntamos el domino virtual midominio.test a la IP del contenedor, que en este caso es la10.203.99.131, podremos ver el contenido de la web.
$ echo "10.203.99.131 midominio.test www.midominio.test" | sudo tee -a /etc/hosts
Si todo ha ido bien, al acceder al sitio http://midominio.test, visualizarás la página de información de PHP.
4. Despliegue en el entorno de desarrollo
A partir de este momento, en función del flujo de trabajo del desarrollador, existen diversos métodos para sincronizar directorios locales con el contenedor. Un método sencillo seria crear un shell script y, utilizando la herramienta rsync, sincronizar el directorio de trabajo local con el contenedor. De esta forma podemos automatizar el despligue de nuestra web en el entorno de desarrollo de manera rápida y sencilla.
Para utilizar rsync de forma segura y evitar que esté preguntando las credenciales constantemente, crearemos una clave SSH y la añadiremos al contendedor.
$ ssh-keygen -t rsa -b 4096 -C "dev@midominio.test"
Generating public/private rsa key pair. Enter file in which to save the key (/home/dev/.ssh/id_rsa): /home/dev/.ssh/id_rsa_web_deploy Enter passphrase (empty for no passphrase): *NO INTRODUCIR PASSWORD* Enter same passphrase again: *NO INTRODUCIR PASSWORD* Your identification has been saved in /home/dev/.ssh/id_rsa_web_deploy Your public key has been saved in /home/dev/.ssh/id_rsa_web_deploy.pub The key fingerprint is: SHA256:77/GTlKNG42SnnRv51njKH+E3dg5OHb/ES7rhERv3NM dev@midominio.test The key's randomart image is: +---[RSA 4096]----+ | | | | | . | | ..o=. .| | S +.*+**E| | +.=oOo*=| | =o+o*+=| | . ++.=+*| | .+B*.o+| +----[SHA256]-----+
Copia la clave creada, accede al contenedor y añadela al fichero /home/debian/.ssh/authorized_keys
$ cat .ssh/id_rsa_web_deploy.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCjhuL9lmTLDX7yl/UPEy9405QhQp0yhEjG//D/uiHoJQetkAKNhtYAFOTWOwuZIYaMTsFMlrsrP/wItPqyxkrAkZhqKl1VmeUOlEkHXDhNy5YH7/5krJZQMb5ZmE5BRAj09/3X7/LtbiyCBopgIvWQlnE3DmvvjFYajUv6Ycb53woKoNKtYPPkhYs99THlKEp8Izz+TZ0aucAfA5QQBwdHvbdkD7yCC+TNdz66JNzXBbQ0O4wVMUVwMw9Dx2g/GgQQ3F8iGRJCcuEnhbAFrndQi8zRDdpt5COjfcaifPhEJNi7G4qkUsN1+XBTkkfWaVU+gYeM42rjga4Koe+HceRx04OC9iaav32Qqjd/rKlaeHyom3TuXKL/a1bGdJXcG0o+KIipxVT/rKFneQXfm7BZYLgDITNLqhfUkTwoRB6HGxwOfnEKMRZ0kzyDpdTMyr5wAptr0vugB05FaJ6ym/fdSWuVmf4Zpoz+bk/9JZMKiLqS5EFlrmHDag5OZwxRJePSkR1J0uQPX8j14ucf43LAWfEFBp/Rb3Phi/lQrk2PXdtydpaz6n/gDF/2kwOrkp15uom5nhNnC9oYdAwau6VWDDhJ0LQSLU4bnNHYp83AUP7A5vDEJPrFMQIIbbByRF8K/+//rgiNYTFQGO2D7FIw6n67Dyq7QDZbAkJdAOsNmw== dev@midominio.test
Copia la clave SSH (toda la línea) en el contenedor:
$ incus exec debian-web bash
$ echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCjhuL9lmTLDX7yl/UPEy9405QhQp0yhEjG//D/uiHoJQetkAKNhtYAFOTWOwuZIYaMTsFMlrsrP/wItPqyxkrAkZhqKl1VmeUOlEkHXDhNy5YH7/5krJZQMb5ZmE5BRAj09/3X7/LtbiyCBopgIvWQlnE3DmvvjFYajUv6Ycb53woKoNKtYPPkhYs99THlKEp8Izz+TZ0aucAfA5QQBwdHvbdkD7yCC+TNdz66JNzXBbQ0O4wVMUVwMw9Dx2g/GgQQ3F8iGRJCcuEnhbAFrndQi8zRDdpt5COjfcaifPhEJNi7G4qkUsN1+XBTkkfWaVU+gYeM42rjga4Koe+HceRx04OC9iaav32Qqjd/rKlaeHyom3TuXKL/a1bGdJXcG0o+KIipxVT/rKFneQXfm7BZYLgDITNLqhfUkTwoRB6HGxwOfnEKMRZ0kzyDpdTMyr5wAptr0vugB05FaJ6ym/fdSWuVmf4Zpoz+bk/9JZMKiLqS5EFlrmHDag5OZwxRJePSkR1J0uQPX8j14ucf43LAWfEFBp/Rb3Phi/lQrk2PXdtydpaz6n/gDF/2kwOrkp15uom5nhNnC9oYdAwau6VWDDhJ0LQSLU4bnNHYp83AUP7A5vDEJPrFMQIIbbByRF8K/+//rgiNYTFQGO2D7FIw6n67Dyq7QDZbAkJdAOsNmw== dev@midominio.test" >> /home/debian/.ssh/authorized_keys
Crea el siguiente archivo en el directorio raiz del proyecto local que quieras publicar en el contenedor:
#!/bin/bash
while true;
do
rsync -avP -e "ssh -i ~/.ssh/id_rsa_web_deploy" --delete --exclude '.git' --chown debian:www-data . debian@midominio.test:/var/www/midominio.test
sleep 1;
done
El tiempo de publicación irá en función del tamaño del proyecto. La primera vez que se ejecuta tardará un poco hasta que completa la primera subida, las siguientes publicaciones serán instantáneas..