Características básicas de LXD: sistemas de contenedores Linux
LXD es el administrador de contenedores del sistema de próxima generación, por lo que dice fuente. Ofrece una interfaz de usuario similar a la de las máquinas virtuales, pero en su lugar utiliza contenedores de Linux.
Núcleo LXD es un demonio privilegiado (un servicio que se ejecuta con derechos de root) que proporciona una API REST a través de un socket Unix local, así como a través de la red si está instalada la configuración adecuada. Los clientes, como la herramienta de línea de comandos proporcionada con LXD, realizan solicitudes a través de esta API REST. Esto significa que ya sea que acceda a un host local o remoto, todo funciona igual.
En este artículo no nos detendremos en los conceptos de LXD, no consideraremos todas las capacidades disponibles descritas en la documentación, incluida la reciente implementación en las últimas versiones de LXD de soporte para máquinas virtuales QEMU en paralelo con contenedores. En cambio, aprenderemos solo los conceptos básicos de la administración de contenedores: configurar grupos de almacenamiento, redes, ejecutar un contenedor, aplicar límites de recursos y cómo usar instantáneas para que pueda obtener una comprensión básica de LXD y usar contenedores en Linux.
Para obtener información completa, consulte la fuente oficial:
Esto significa que se instalarán dos paquetes a la vez, uno como paquete del sistema y el otro como paquete instantáneo. La instalación de dos paquetes en un sistema puede crear algún problema en el que el paquete del sistema puede quedar huérfano si el administrador de paquetes snap elimina el paquete snap.
encontrar paquete lxd en el repositorio snap puedes usar el siguiente comando:
snap find lxd
Name Version Summary
lxd 3.21 System container manager and API
lxd-demo-server 0+git.6d54658 Online software demo sessions using LXD
nova ocata OpenStack Compute Service (nova)
nova-hypervisor ocata OpenStack Compute Service - KVM Hypervisor (nova)
distrobuilder 1.0 Image builder for LXC and LXD
fabrica 0.1 Build snaps by simply pointing a web form to...
satellite 0.1.2 Advanced scalable Open source intelligence platform
Al ejecutar el comando list Puedes asegurarte de que el paquete lxd aún no instalado:
snap list
Name Version Rev Tracking Publisher Notes
core 16-2.43.3 8689 stable canonical✓ core
A pesar de que LXD es un paquete instantáneo, debe instalarse a través del paquete del sistema. lxd, que creará el grupo correspondiente en el sistema, las utilidades necesarias en /usr/bin etcétera
sudo apt update
sudo apt install lxd
Asegurémonos de que el paquete esté instalado como un paquete instantáneo:
snap list
Name Version Rev Tracking Publisher Notes
core 16-2.43.3 8689 stable canonical✓ core
lxd 3.21 13474 stable/… canonical✓ -
Para instalar el paquete LXD en el sistema, necesita ejecutar los siguientes comandos, el primero actualizará la lista de paquetes en el sistema disponibles en el repositorio, el segundo instalará directamente el paquete:
sudo pacman -Syyu && sudo pacman -S lxd
Después de instalar el paquete, para que un usuario normal pueda administrar LXD, debe agregarlo al grupo del sistema. lxd:
sudo usermod -a -G lxd user1
Asegurémonos de que el usuario user1 añadido al grupo lxd:
id -Gn user1
user1 adm dialout cdrom floppy sudo audio dip video plugdev netdev lxd
Si el grupo lxd no está visible en la lista, entonces necesita activar la sesión de usuario nuevamente. Para hacer esto, debe cerrar sesión e iniciar sesión con el mismo usuario.
Activar en systemd cargando el servicio LXD al iniciar el sistema:
Antes de que comience la inicialización, debemos comprender cómo está organizado lógicamente el almacenamiento en LXD.
Almacenamiento (Almacenamiento) состоит de uno o más Grupo de almacenamiento que utiliza uno de los sistemas de archivos compatibles, como ZFS, BTRFS, LVM o directorios normales. Cada Grupo de almacenamiento se divide en volúmenes (Volumen de almacenamiento) que contienen imágenes, contenedores o datos para otros fines.
Imágenes - Estas son distribuciones especialmente ensambladas sin el kernel de Linux y disponibles en fuentes externas.
contenedores - estas son distribuciones implementadas a partir de imágenes, listas para usar
Instantáneas - estas son instantáneas del estado de los contenedores a los que puede regresar
Para administrar el almacenamiento en LXD, use el comando lxc storage un certificado que puede obtener especificando la clave - lxc storage --help
El siguiente comando muestra una lista de todos Grupo de almacenamiento en almacenamiento LXD:
lxc storage list
+---------+-------------+--------+--------------------------------+---------+
| NAME | DESCRIPTION | DRIVER | SOURCE | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| hddpool | | btrfs | /dev/loop1 | 2 |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool | | btrfs | /var/lib/lxd/disks/ssdpool.img | 4 |
+---------+-------------+--------+--------------------------------+---------+
Para ver una lista de todos Volumen de almacenamiento en el seleccionado Grupo de almacenamiento sirve al equipo lxc storage volume list:
lxc storage volume list hddpool
+-------+----------------------------------+-------------+---------+
| TYPE | NAME | DESCRIPTION | USED BY |
+-------+----------------------------------+-------------+---------+
| image | ebd565585223487526ddb3607f515... | | 1 |
+-------+----------------------------------+-------------+---------+
lxc storage volume list ssdpool
+-----------+----------------------------------+-------------+---------+
| TYPE | NAME | DESCRIPTION | USED BY |
+-----------+----------------------------------+-------------+---------+
| container | alp3 | | 1 |
+-----------+----------------------------------+-------------+---------+
| container | jupyter | | 1 |
+-----------+----------------------------------+-------------+---------+
| image | ebd565585223487526ddb3607f515... | | 1 |
+-----------+----------------------------------+-------------+---------+
Además, si por Grupo de almacenamiento Al crear, se seleccionó el sistema de archivos BTRFS, luego obtenga una lista Volumen de almacenamiento o subvolúmenes en la interpretación BTRFS, puede utilizar el conjunto de herramientas de este sistema de archivos:
sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/hddpool
ID 257 gen 818 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/ssdpool
ID 257 gen 1820 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
ID 260 gen 1819 parent 5 top level 5 path containers/jupyter
ID 263 gen 1820 parent 5 top level 5 path containers/alp3
Antes de crear y utilizar contenedores, debe realizar una inicialización general de LXD que crea y configura la red y el almacenamiento. Esto se puede hacer manualmente usando comandos de cliente estándar que están disponibles en la lista llamando al comando lxc --help o usando el asistente de inicialización lxd init respondiendo algunas preguntas.
Seleccionar un sistema de archivos para el grupo de almacenamiento ^
Durante la inicialización, LXD hace varias preguntas, incluida la determinación del tipo de sistema de archivos predeterminado Grupo de almacenamiento. De forma predeterminada, se selecciona el sistema de archivos BTRFS. Será imposible cambiar a otro FS después de la creación.. Para seleccionar un FS se sugiere tabla de comparación de características:
Feature
Directorio
Btrfs
LVM
ZFS
CEPH
Almacenamiento de imágenes optimizado
no
si
si
si
si
Creación de instancia optimizada
no
si
si
si
si
Creación de instantáneas optimizada
no
si
si
si
si
Transferencia de imágenes optimizada
no
si
no
si
si
Transferencia de instancia optimizada
no
si
no
si
si
Copiar en escrito
no
si
si
si
si
Basado en bloques
no
no
si
no
si
Clonación instantánea
no
si
si
si
si
Controlador de almacenamiento utilizable dentro de un contenedor
si
si
no
no
no
Restaurar desde instantáneas más antiguas (no las más recientes)
si
si
si
no
si
Cuotas de almacenamiento
Sí(*)
si
si
si
no
Inicializando la red y el grupo de almacenamiento usando el asistente ^
El siguiente comando que veremos sugiere configurar los componentes principales de LXD respondiendo preguntas simples usando el asistente de inicialización.
Ejecutar comando lxc init e ingrese las respuestas a las preguntas después de los dos puntos como se muestra en el siguiente ejemplo o cámbielas según sus condiciones:
lxd init
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]: ssdpool
Name of the storage backend to use (lvm, btrfs, dir) [default=btrfs]:
Create a new BTRFS pool? (yes/no) [default=yes]:
Would you like to use an existing block device? (yes/no) [default=no]:
Size in GB of the new loop device (1GB minimum) [default=15GB]: 10GB
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 10.0.5.1/24
Would you like LXD to NAT IPv4 traffic on your bridge? [default=yes]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: none
Would you like LXD to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] no
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
En el paso anterior creamos Grupo de almacenamiento que recibió el nombre ssdpool y cuyo archivo se encuentra en mi sistema en /var/lib/lxd/disks/ssdpool.img. Esta dirección del sistema de archivos corresponde a la unidad SSD física de mi PC.
Las siguientes acciones, para ampliar la comprensión del papel desempeñado por Grupo de almacenamiento en el repositorio, crearemos un segundo Grupo de almacenamiento que estará ubicado físicamente en un tipo de disco diferente, HDD. El problema es que LXD no te permite crear Grupo de almacenamiento fuera de dirección /var/lib/lxd/disks/ e incluso los enlaces simbólicos no funcionarán, ver la respuesta del desarrollador. Podemos evitar esta limitación durante la inicialización/formateo. Grupo de almacenamiento especificando el valor como un dispositivo de bloque en lugar de la ruta al archivo de loopback especificando esto en la clave source.
Entonces, antes de crear Grupo de almacenamiento debe definir un archivo de bucle invertido o una partición existente en su sistema de archivos que utilizará. Para ello crearemos y utilizaremos un archivo cuyo tamaño limitaremos a 10GB:
dd if=/dev/zero of=/mnt/work/lxd/hddpool.img bs=1MB count=10000
10000+0 records in
10000+0 records out
10000000000 bytes (10 GB, 9,3 GiB) copied, 38,4414 s, 260 MB/s
Conectemos el archivo loopback a un dispositivo loopback gratuito:
gracias a la llave --show Al ejecutar el comando se devuelve a la pantalla el nombre del dispositivo al que está conectado nuestro archivo loopback. Si es necesario, podemos mostrar una lista de todos los dispositivos ocupados de este tipo para asegurarnos de que nuestras acciones son correctas:
En la lista puede encontrar que el dispositivo tiene /dev/loop1 archivo de bucle invertido incluido /mnt/work/lxd/hddpool.img, y en el dispositivo /dev/loop0 archivo de bucle invertido incluido /var/lib/lxd/disks/ssdpool.img que corresponde al valor predeterminado Grupo de almacenamiento.
El siguiente comando crea uno nuevo. Grupo de almacenamiento en LXD según el archivo loopback que acabamos de preparar. LXD formateará el archivo loopback /mnt/work/lxd/hddpool.img en el dispositivo /dev/loop1 para el sistema de archivos BTRFS:
Después de la creación Grupo de almacenamiento, si es necesario, se puede ampliar. Para Grupo de almacenamiento Según el sistema de archivos BTRFS, ejecute los siguientes comandos:
Inserción automática de un archivo loopback en la ranura de un dispositivo loopback ^
Tenemos un pequeño problema, al reiniciar el sistema host, el archivo /mnt/work/lxd/hddpool.img "saldrá volando" del dispositivo /dev/loop1 y el servicio LXD fallará al cargar porque no lo verá en este dispositivo. Para resolver este problema, necesita crear un servicio del sistema que insertará este archivo en el dispositivo. /dev/loop1 cuando se inicia el sistema host.
Vamos a crear unidad Tipo de archivo de coches в /etc/systemd/system/ para el sistema de inicialización SystemD:
cat << EOF | sudo tee -a /etc/systemd/system/lxd-hddpool.service
[Unit]
Description=Losetup LXD Storage Pool (hddpool)
After=local-fs.target
[Service]
Type=oneshot
ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img
RemainAfterExit=true
[Install]
WantedBy=local-fs.target
EOF
Activa el servicio:
sudo systemctl enable lxd-hddpool
Created symlink /etc/systemd/system/local-fs.target.wants/lxd-hddpool.service → /etc/systemd/system/lxd-hddpool.service.
Después de reiniciar el sistema host, verificamos el estado del servicio:
systemctl status lxd-hddpool.service
● lxd-hddpool.service - Losetup LXD Storage Pool (hddpool)
Loaded: loaded (/etc/systemd/system/lxd-hddpool.service; enabled; vendor preset: disabled)
Active: active (exited) since Wed 2020-04-08 03:43:53 MSK; 1min 37s ago
Process: 711 ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img (code=exited, status=0/SUCCESS)
Main PID: 711 (code=exited, status=0/SUCCESS)
апр 08 03:43:52 manjaro systemd[1]: Starting Losetup LXD Storage Pool (hddpool)...
апр 08 03:43:53 manjaro systemd[1]: Finished Losetup LXD Storage Pool (hddpool).
A partir del resultado podemos verificar que el estado del servicio es lector activo, a pesar de que se completó la ejecución de nuestro script desde un comando, la opción nos permitió hacer esto RemainAfterExit=true.
Dado que todos los procesos del contenedor en realidad se ejecutan de forma aislada en el sistema host utilizando su kernel, para proteger aún más el acceso de los procesos del contenedor al sistema host, LXD ofrece privilegios de proceso, donde:
Contenedores privilegiados - estos son contenedores en los que los procesos con UID y GID corresponden al mismo propietario que en el sistema host. Por ejemplo, un proceso que se ejecuta en un contenedor con un UID de 0 tiene los mismos derechos de acceso que un proceso en el sistema host con un UID de 0. En otras palabras, el usuario raíz en el contenedor tiene todos los derechos no solo en el contenedor, sino también en el sistema host si puede salir del espacio de nombres aislado del contenedor.
Contenedores sin privilegios - estos son contenedores en los que los procesos pertenecen al propietario del UID y GID con un número de 0 a 65535, pero para el sistema host el propietario está enmascarado utilizando los bits SubUID y SubGID agregados, respectivamente. Por ejemplo, un usuario con UID=0 en un contenedor será visto en el sistema host como SubUID + UID. Esto protege el sistema host porque si algún proceso en el contenedor puede escapar de su espacio de nombres aislado, solo puede comunicarse con el sistema host como un proceso con un UID/GID desconocido y muy alto.
De forma predeterminada, los contenedores recién creados tienen un estado sin privilegios y, por lo tanto, debemos definir un SubUID y un SubGID.
Creemos dos archivos de configuración en los que configuraremos la máscara para SubUID y SubGID, respectivamente:
Dado que previamente inicializamos la red usando el asistente de inicialización lxd init y creó un dispositivo de red lxdbr0, luego en esta sección simplemente nos familiarizaremos con las redes en LXD y cómo crear un conmutador virtual (puente) usando el comando del cliente.
El siguiente diagrama demuestra cómo un conmutador (puente) conecta el host y los contenedores en una red:
Los contenedores pueden comunicarse a través de una red con otros contenedores o con el host en el que se sirven estos contenedores. Para hacer esto, necesita vincular las tarjetas de red virtuales de los contenedores con un conmutador virtual. Primero crearemos un conmutador y las interfaces de red del contenedor se vincularán en los capítulos siguientes, después de que se haya creado el contenedor.
El siguiente comando crea un conmutador con una subred 10.0.5.0/24 y dirección IPv4 10.0.5.1/24, y también incluye ipv4.nat para que los contenedores puedan acceder a Internet a través del host utilizando el servicio NAT:
Cada contenedor en LXD tiene su propia configuración y puede extenderla con configuraciones declaradas globalmente llamadas perfiles de configuración. La aplicación de perfiles de configuración a un contenedor tiene un modelo en cascada; el siguiente ejemplo lo demuestra:
En este ejemplo, se han creado tres perfiles en el sistema LXD: default, hddpool и hostfs. Los tres perfiles se aplican a un contenedor que tiene una configuración local (área gris). Perfil default tiene un dispositivo root que tiene un parametro pool es igual a ssdpool, pero gracias al modelo de aplicación de configuración en cascada, podemos aplicar un perfil al contenedor hddpool que tiene un parametro pool anulará el mismo parámetro del perfil default y el contenedor recibirá la configuración del dispositivo root con parámetro pool igual hddpooly el perfil hostfs simplemente agrega un nuevo dispositivo al contenedor.
Para ver la lista de perfiles de configuración disponibles, utilice el siguiente comando:
lxc profile list
+---------+---------+
| NAME | USED BY |
+---------+---------+
| default | 1 |
+---------+---------+
| hddroot | 0 |
+---------+---------+
| ssdroot | 1 |
+---------+---------+
Se puede obtener una lista completa de comandos disponibles para trabajar con un perfil agregando la clave --help:
lxc profile --help
Description:
Manage profiles
Usage:
lxc profile [command]
Available Commands:
add Add profiles to instances
assign Assign sets of profiles to instances
copy Copy profiles
create Create profiles
delete Delete profiles
device Manage instance devices
edit Edit profile configurations as YAML
get Get values for profile configuration keys
list List profiles
remove Remove profiles from instances
rename Rename profiles
set Set profile configuration keys
show Show profile configurations
unset Unset profile configuration keys
Perfil de configuración predeterminado default no tiene una configuración de tarjeta de red para el contenedor y todos los contenedores recién creados no tienen una red, para ellos es necesario crear dispositivos de red locales (dedicados) con un comando separado, pero podemos crear un dispositivo de red global en la configuración perfil que se compartirá entre todos los contenedores que utilicen este perfil. De esta manera, inmediatamente después del comando de crear un nuevo contenedor, tendrán una red con acceso a la red. Al mismo tiempo, no hay restricciones, siempre podremos crear un dispositivo de red local más adelante si es necesario.
El siguiente comando agregará el dispositivo al perfil de configuración. eth0 типа nic conectado a la red lxdbr0:
lxc profile device add default eth0 nic network=lxdbr0 name=eth0
Es importante tener en cuenta que, dado que agregamos el dispositivo al perfil de configuración, si especificamos una dirección IP estática en el dispositivo, todos los contenedores que usarán este perfil compartirán la misma dirección IP. Si es necesario crear un contenedor con una dirección IP estática asignada para el contenedor, entonces debe crear una configuración de dispositivo de red a nivel de contenedor (configuración local) con el parámetro de dirección IP, y no a nivel de perfil.
Comprobemos el perfil:
lxc profile show default
config: {}
description: Default LXD profile
devices:
eth0:
name: eth0
network: lxdbr0
type: nic
root:
path: /
pool: ssdpool
type: disk
name: default
used_by: []
En este perfil podemos ver que para todos los contenedores recién creados se crearán dos dispositivos:
eth0 - Tipo de dispositivo nic conectado a un conmutador (puente de red) lxdbr0
root - Tipo de dispositivo disk que utiliza un grupo de almacenamiento ssdpool
Para utilizar creado previamente Grupo de almacenamiento contenedores, crear un perfil de configuración ssdroot en el que agregaremos un dispositivo como disk con punto de montaje / (root) usando el creado previamente Grupo de almacenamiento - ssdpool:
Los contenedores se crean a partir de imágenes que son distribuciones especialmente ensambladas que no tienen un kernel de Linux. Por lo tanto, antes de ejecutar el contenedor, se debe implementar desde esta imagen. La fuente de imágenes es un repositorio local al que se descargan imágenes desde repositorios externos.
Para mostrar un número limitado de columnas utilizamos la opción -c con parametros dasut, y también limitó la longitud de la lista con el comando head.
El filtrado está disponible para mostrar una lista de imágenes. El siguiente comando enumerará todas las arquitecturas de distribución disponibles. alpinolinux:
Para comenzar a usar el contenedor, debe agregar una imagen del repositorio global al local local:. Ahora el repositorio local está vacío, el comando se asegurará de esto lxc image list. Si el método list Si no especifica un repositorio, se utilizará el repositorio local de forma predeterminada. local:
lxc image list local:
+-------+-------------+--------+-------------+--------------+------+------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE |
+-------+-------------+--------+-------------+--------------+------+------+
Las imágenes del repositorio se gestionan mediante los siguientes métodos:
Equipo
Descripción
imagen lxc alias
Administrar alias de imágenes
imagen lxc copia
Copiar imágenes entre servidores
imagen lxc borrar
Eliminar imágenes
imagen lxc editar
Editar propiedades de imagen
imagen lxc exportar
Exportar y descargar imágenes
imagen lxc importar
Importar imágenes al almacén de imágenes.
imagen lxc info
Mostrar información útil sobre imágenes
imagen lxc lista
Lista de imágenes
imagen lxc refrescar
Actualizar imágenes
imagen lxc Mostrar
Mostrar propiedades de imagen
Copie la imagen al repositorio local desde el global images::
Además del modo interactivo, LXD también admite un modo de instalación de configuración no interactivo, esto es cuando la configuración se especifica en forma de archivo YAML, un formato especial que le permite instalar toda la configuración a la vez, sin pasar por la ejecución. de muchos comandos interactivos que se discutieron anteriormente en este artículo, incluida la configuración de red, la creación de perfiles de configuración, etc. No cubriremos esta área aquí, puedes comprobarla por tu cuenta. en la documentación.
Siguiente comando interactivo lxc config que veremos le permite establecer la configuración. Por ejemplo, para garantizar que las imágenes descargadas en el repositorio local no se actualicen automáticamente desde los repositorios globales, podemos habilitar este comportamiento con el siguiente comando:
Para crear un contenedor use el comando lxc init a la que se pasan valores репозиторий:образ y luego el ID deseado para el contenedor. El repositorio se puede especificar como local. local: también lo es cualquier global. Si no se especifica el repositorio, de forma predeterminada se utiliza el repositorio local para buscar la imagen. Si la imagen se especifica desde el repositorio global, la imagen primero se descargará al repositorio local y luego se usará para crear el contenedor.
Ejecutemos el siguiente comando para crear nuestro primer contenedor:
lxc init alpine3 alp --storage=hddpool --profile=default --profile=hddroot
Veamos las teclas de comando que usamos aquí en orden:
alpine3 — Se especifica un alias (alias) para la imagen que se cargó previamente en el repositorio local. Si el alias no se creó para esta imagen, siempre puede hacer referencia a la imagen por su Huella dactilar que se muestra en la tabla.
alp — Establece el identificador del contenedor.
--storage — Esta clave indica en qué Grupo de almacenamiento se creará un contenedor
--profile — Estas claves aplican en cascada la configuración de los perfiles de configuración creados previamente al contenedor.
Lanzamos el contenedor, que comienza a lanzar el sistema init de la distribución:
lxc start alp
También puedes usar el comando lxc launch que te permite combinar equipos lxc init и lxc start en una sola operación.
Comprobando el estado del contenedor:
lxc list -c ns46tb
+------+---------+------------------+------+-----------+--------------+
| NAME | STATE | IPV4 | IPV6 | TYPE | STORAGE POOL |
+------+---------+------------------+------+-----------+--------------+
| alp | RUNNING | 10.0.5.46 (eth0) | | CONTAINER | hddpool |
+------+---------+------------------+------+-----------+--------------+
En la sección profiles Podemos asegurarnos de que este contenedor utilice dos perfiles de configuración: default и hddroot. En la sección devices solo podemos detectar un dispositivo porque el dispositivo de red se creó en el nivel de perfil default. Para ver todos los dispositivos utilizados por el contenedor, debe agregar una clave --expanded:
Si intentamos establecer una dirección IP para un dispositivo de red eth0 el equipo lxc config device set alp destinado a la configuración del contenedor, entonces recibiremos un error que informará que el dispositivo no existe porque el dispositivo eth0 que es utilizado por el contenedor pertenece al perfil default:
lxc config device set alp eth0 ipv4.address 10.0.5.5
Error: The device doesn't exist
Por supuesto, podemos establecer una dirección IP estática para eth0 dispositivos en el perfil, pero será el mismo para todos los contenedores que usarán este perfil. Por tanto, agreguemos un dispositivo dedicado al contenedor:
lxc config device add alp eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5
Luego necesitas reiniciar el contenedor:
lxc restart alp
Si miramos la configuración del contenedor ahora, no necesitamos usar la opción --expanded para ver el dispositivo de red eth0, ya que lo creamos a nivel de contenedor y se puso en cascada sobre el mismo dispositivo desde el perfil. default:
Para ejecutar comandos en un contenedor directamente, sin pasar por las conexiones de red, use el comando lxc exec que ejecuta comandos en el contenedor sin iniciar el shell del sistema. Si necesita ejecutar un comando en un shell usando patrones de shell como variables, redirecciones de archivos (tubería), etc., entonces necesita iniciar explícitamente el shell y pasar el comando como una clave, por ejemplo:
lxc exec alp -- /bin/sh -c "echo $HOME"
El comando utilizó un carácter de escape especial. para carácter especial $ para que la variable $HOME no se interpretó en la máquina host, sino que se interpretó solo dentro del contenedor.
También es posible iniciar el modo shell interactivo y luego finalizar la sesión ejecutando la tecla de acceso rápido. CTRL+D:
En LXD, puede administrar los recursos del contenedor utilizando un conjunto especial de configuración. Puede encontrar una lista completa de los parámetros de configuración del contenedor. en la documentación.
limit.cpu - vincula un contenedor a uno o más núcleos de CPU
limits.cpu.allowance - gestiona las cuotas del programador CFS cuando ha pasado el límite de tiempo o el mecanismo universal de intercambio de recursos de CPU cuando ha pasado el porcentaje
limits.cpu.priority - prioridad del programador cuando a varias instancias que comparten un conjunto de procesadores se les asigna el mismo porcentaje de procesadores
Además de restricciones como limits.read, limits.write También podemos limitar la cantidad de espacio en disco consumido por el contenedor (solo funciona con ZFS o BTRFS):
lxc config device set alp root size=2GB
Después de la instalación, en el parámetro devices.root.size Podemos verificar el límite establecido:
lxc config show alp
...
devices:
root:
path: /
pool: hddpool
size: 2GB
type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""
Para ver las cuotas de disco utilizadas podemos obtenerlas desde el comando lxc info:
lxc info alp
...
Resources:
Processes: 5
Disk usage:
root: 1.05GB
CPU usage:
CPU usage (in seconds): 1
Memory usage:
Memory (current): 5.46MB
Network usage:
eth0:
Bytes received: 802B
Bytes sent: 1.59kB
Packets received: 4
Packets sent: 14
lo:
Bytes received: 0B
Bytes sent: 0B
Packets received: 0
Packets sent: 0
A pesar de que hemos establecido un límite de 2 GB para el dispositivo raíz del contenedor, las utilidades del sistema como df No verá esta restricción. Para ello realizaremos una pequeña prueba y descubriremos cómo funciona.
Creemos 2 nuevos contenedores idénticos en el mismo Grupo de almacenamiento (HDDpool):
lxc exec alp1 -- ls -lh
total 1000M
-rw-r--r-- 1 root root 1000.0M Mar 27 10:16 file.img
Si buscamos en el segundo contenedor, comprobamos la existencia de un archivo en la misma ubicación, entonces este archivo no estará allí, lo cual es de esperar, ya que los contenedores se crean por su cuenta. Volumen de almacenamiento en el mismo Grupo de almacenamiento:
lxc exec alp2 -- ls -lh
total 0
Pero comparemos los valores que produce. df en uno y otro contenedor:
lxc exec alp1 -- df -hT
Filesystem Type Size Used Available Use% Mounted on
/dev/loop1 btrfs 9.3G 1016.4M 7.8G 11% /
...
lxc exec alp2 -- df -hT
Filesystem Type Size Used Available Use% Mounted on
/dev/loop1 btrfs 9.3G 1016.4M 7.8G 11% /
...
Dispositivo /dev/loop1 montado como la partición raíz Grupo de almacenamiento que utilizan estos contenedores, por lo que reparten su volumen entre dos.
LXD tiene la capacidad de crear instantáneas y restaurar el estado del contenedor a partir de ellas.
Para crear una instantánea, ejecute el siguiente comando:
lxc snapshot alp snapshot1
Equipo lxc snapshot no hay clave disponible listPor lo tanto, para ver la lista de instantáneas, debe usar el comando que muestra información general sobre el contenedor:
lxc info alp
...
...
Snapshots:
snapshot1 (taken at 2020/04/08 18:18 UTC) (stateless)
Puede restaurar un contenedor desde una instantánea usando el comando lxc restore especificando el contenedor para el cual se realizará la restauración y el alias de la instantánea:
lxc restore alp snapshot1
El siguiente comando se utiliza para eliminar una instantánea. Tenga en cuenta que la sintaxis del comando no es similar a la de todos los demás; aquí debe especificar una barra diagonal después del nombre del contenedor. Si se omite la barra diagonal, entonces el comando para eliminar una instantánea se interpreta como un comando para eliminar un contenedor.
lxc delete alp/snapshot1
En el ejemplo anterior, analizamos las llamadas instantáneas sin estado. LXD tiene otro tipo de instantáneas: con estado, que guarda el estado actual de todos los procesos en el contenedor. Hay una serie de características interesantes y útiles asociadas con las instantáneas con estado.