Cómo instalar, crear y administrar LXC (contenedores de Linux) en RHEL / CentOS 7


LXC , acrónimo de Linux Containers , es una solución liviana de virtualización basada en el núcleo de Linux, que prácticamente se ejecuta sobre el sistema operativo, lo que le permite ejecutar varias distribuciones aisladas al mismo tiempo .

La diferencia entre LXC y la virtualización KVM es que LXC no emula hardware, sino que comparte el mismo espacio de nombres del kernel, similar a las aplicaciones chroot.

Esto convierte a LXC en una solución de virtualización muy rápida en comparación con otras soluciones de virtualización, como KVM, XEN o VMware.

Este artículo lo guiará sobre cómo instalar, implementar y ejecutar contenedores LXC en una distribución de CentOS/RHEL y Fedora.

Un sistema operativo Linux en funcionamiento con instalación mínima:

  1. Installation of CentOS 7 Linux
  2. Installation of RHEL 7
  3. Installation of Fedora 23 Server

Paso 1: Instalando la virtualización LXC en Linux

1. la virtualización LXC se proporciona a través de los repositorios de Epel. Para usar este repositorio, abra un terminal e instale los repositorios de Epel en su sistema emitiendo el siguiente comando:

# yum install epel-release

2. Antes de continuar con el proceso de instalación de LXC, asegúrese de que el Perl intérprete de idiomas y los paquetes debootstrap estén instalados emitiendo los siguientes comandos.

# yum install debootstrap perl libvirt

3. Finalmente, instale la solución de virtualización LXC con el siguiente comando.

# yum install lxc lxc-templates

4. Después de que se haya instalado el servicio LXC, verifique si se está ejecutando el daemon LXC y libvirt .

# systemctl status lxc.service
# systemctl start lxc.service
# systemctl start libvirtd 
# systemctl status lxc.service

Estado> Comprobar el estado del daemon LXC

[[email protected] ~]# systemctl status lxc.service
lxc.service - LXC Container Initialization and Autoboot Code
   Loaded: loaded (/usr/lib/systemd/system/lxc.service; disabled)
   Active: inactive (dead)

[[email protected] ~]# systemctl start lxc.service
[[email protected] ~]# systemctl status lxc.service
lxc.service - LXC Container Initialization and Autoboot Code
   Loaded: loaded (/usr/lib/systemd/system/lxc.service; disabled)
   Active: active (exited) since Fri 2016-04-01 02:33:36 EDT; 1min 37s ago
  Process: 2250 ExecStart=/usr/libexec/lxc/lxc-autostart-helper start (code=exited, status=0/SUCCESS)
  Process: 2244 ExecStartPre=/usr/libexec/lxc/lxc-devsetup (code=exited, status=0/SUCCESS)
 Main PID: 2250 (code=exited, status=0/SUCCESS)

Apr 01 02:33:06 mail systemd[1]: Starting LXC Container Initialization and Autoboot Code...
Apr 01 02:33:06 mail lxc-devsetup[2244]: Creating /dev/.lxc
Apr 01 02:33:06 mail lxc-devsetup[2244]: /dev is devtmpfs
Apr 01 02:33:06 mail lxc-devsetup[2244]: Creating /dev/.lxc/user
Apr 01 02:33:36 mail lxc-autostart-helper[2250]: Starting LXC autoboot containers:  [  OK  ]
Apr 01 02:33:36 mail systemd[1]: Started LXC Container Initialization and Autoboot Code.

y verifique el estado de virtualización del kernel LXC emitiendo el siguiente comando.

# lxc-checkconfig

Configuración> Comprobar configuración de virtualización del kernel LXC

[[email protected] ~]# lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.10.0-229.el7.x86_64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
Bridges: enabled
Advanced netfilter: enabled
CONFIG_NF_NAT_IPV4: enabled
CONFIG_NF_NAT_IPV6: enabled
CONFIG_IP_NF_TARGET_MASQUERADE: enabled
CONFIG_IP6_NF_TARGET_MASQUERADE: enabled
CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled

--- Checkpoint/Restore ---
checkpoint restore: missing
CONFIG_FHANDLE: enabled
CONFIG_EVENTFD: enabled
CONFIG_EPOLL: enabled
CONFIG_UNIX_DIAG: enabled
CONFIG_INET_DIAG: enabled
CONFIG_PACKET_DIAG: enabled
CONFIG_NETLINK_DIAG: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Paso 2: Crear y administrar contenedores LXC en Linux

5. para enumerar los contenedores de plantillas LXC disponibles que ya están instalados en su sistema, ejecute el siguiente comando.

# ls -alh /usr/share/lxc/templates/

Contenedores> Lista de Contenedores de Plantillas LXC

total 344K
drwxr-xr-x. 2 root root 4.0K Apr  1 02:32 .
drwxr-xr-x. 6 root root  100 Apr  1 02:32 ..
-rwxr-xr-x. 1 root root  11K Nov 15 10:19 lxc-alpine
-rwxr-xr-x. 1 root root  14K Nov 15 10:19 lxc-altlinux
-rwxr-xr-x. 1 root root  11K Nov 15 10:19 lxc-archlinux
-rwxr-xr-x. 1 root root 9.7K Nov 15 10:19 lxc-busybox
-rwxr-xr-x. 1 root root  29K Nov 15 10:19 lxc-centos
-rwxr-xr-x. 1 root root  11K Nov 15 10:19 lxc-cirros
-rwxr-xr-x. 1 root root  17K Nov 15 10:19 lxc-debian
-rwxr-xr-x. 1 root root  18K Nov 15 10:19 lxc-download
-rwxr-xr-x. 1 root root  49K Nov 15 10:19 lxc-fedora
-rwxr-xr-x. 1 root root  28K Nov 15 10:19 lxc-gentoo
-rwxr-xr-x. 1 root root  14K Nov 15 10:19 lxc-openmandriva
-rwxr-xr-x. 1 root root  14K Nov 15 10:19 lxc-opensuse
-rwxr-xr-x. 1 root root  35K Nov 15 10:19 lxc-oracle
-rwxr-xr-x. 1 root root  12K Nov 15 10:19 lxc-plamo
-rwxr-xr-x. 1 root root 6.7K Nov 15 10:19 lxc-sshd
-rwxr-xr-x. 1 root root  23K Nov 15 10:19 lxc-ubuntu
-rwxr-xr-x. 1 root root  12K Nov 15 10:19 lxc-ubuntu-cloud

6. El proceso de creación de un contenedor LXC es muy simple. La sintaxis del comando para crear un nuevo contenedor se explica a continuación.

# lxc-create -n container_name -t container_template

En el siguiente extracto crearemos un nuevo contenedor llamado mydeb basado en una plantilla debian que se extraerá de los repositorios de LXC.

Contenedor> Crear contenedor LXC

[[email protected] ~]# lxc-create -n mydcb -t debian
debootstrap is /usr/sbin/debootstrap
Checking cache download in /var/cache/lxc/debian/rootfs-jessie-amd64 ... 
Downloading debian minimal ...
W: Cannot check Release signature; keyring file not available /usr/share/keyrings/debian-archive-keyring.gpg
I: Retrieving Release 
I: Retrieving Packages 
I: Validating Packages 
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
...
...

7. Después de una serie de dependencias base y paquetes que se descargarán e instalarán en su sistema, se creará el contenedor. Cuando el proceso finalice, un mensaje mostrará la contraseña de su cuenta raíz predeterminada. Cambie esta contraseña una vez que inicie e inicie sesión en la consola del contenedor para estar seguro.

are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
Failed to read /proc/cmdline. Ignoring: No such file or directory
invoke-rc.d: policy-rc.d denied execution of start.
Timezone in container is not configured. Adjust it manually.
Root password is 'root', please change !
Generating locales (this might take a while)...
  en_IN.en_IN...character map file `en_IN' not found: No such file or directory
/usr/share/i18n/locales/en_IN:55: LC_MONETARY: unknown character in field `currency_symbol'
 done
Generation complete.

8. Ahora, puede usar lxc-ls para enumerar sus contenedores y lxc-info para obtener información sobre un contenedor en ejecución/detenido.

Para iniciar el contenedor recién creado en segundo plano (se ejecutará como un demonio especificando la opción -d ) emita el siguiente comando:

# lxc-start -n mydeb -d

9. Una vez que se haya iniciado el contenedor, puede hacer una lista de los contenedores en ejecución usando el comando lxc-ls --active y obtener información detallada sobre el contenedor en ejecución.

# lxc-ls --active

10. Para iniciar sesión en la consola del contenedor, ejecute el comando lxc-console contra un nombre de contenedor activo. Inicie sesión con el usuario root y la contraseña generada de forma predeterminada por lxc supervisor.

Una vez que haya iniciado sesión en el contenedor, puede ejecutar varios comandos para verificar la distribución mostrando el contenido del archivo /etc/issue.net , cambie la contraseña de root emitiendo el comando passwd o vea detalles sobre las interfaces de red con ifconfig .

# lxc-console -n mydeb
# cat /etc/issue.net
# ifconfig
# passwd

Contenedor> Conectar a contenedor LXC

[[email protected]~]# lxc-console -n mydcb

Connected to tty 1
Type &ltCtrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself

Debian GNU/Linux 8 mydcb tty1

mydcb login: root
Password: 
Last login: Fri Apr  1 07:39:08 UTC 2016 on console
Linux mydcb 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
[email protected]:~# cat /etc/issue.net
Debian GNU/Linux 8
[email protected]:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:3e:d9:21:d7  
          inet6 addr: fe80::216:3eff:fed9:21d7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:107 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:5796 (5.6 KiB)  TX bytes:648 (648.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

[email protected]:~# passwd root
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

11. Para desconectarse de la consola del contenedor y volver a la consola del host, dejando el contenedor en estado activo, presione Ctrl + a y luego q en el teclado.

Para detener un contenedor en ejecución, ejecute el siguiente comando.

# lxc-stop -n mydcb

12. Para crear un contenedor LXC basado en una plantilla de Ubuntu, ingrese al directorio /usr/sbin/ y cree el siguiente enlace simbólico debootstrap .

# cd /usr/sbin
# ln -s debootstrap qemu-debootstrap

13. Edite el archivo qemu-debootstrap con el Vi y reemplace las siguientes dos líneas MIRROR de la siguiente manera:

DEF_MIRROR=”http://mirrors.kernel.org/ubuntu”
DEF_HTTPS_MIRROR=”https://mirrors.kernel.org/ubuntu”

Para referencia, vea el siguiente contenido y coloque las dos líneas anteriores como se indica:

....
MAKE_TARBALL=""
EXTRACTOR_OVERRIDE=""
UNPACK_TARBALL=""
ADDITIONAL=""
EXCLUDE=""
VERBOSE=""
CERTIFICATE=""
CHECKCERTIF=""
PRIVATEKEY=""

DEF_MIRROR=”http://mirrors.kernel.org/ubuntu”
DEF_HTTPS_MIRROR=”https://mirrors.kernel.org/ubuntu”

14. Finalmente, cree un nuevo contenedor LXC basado en la plantilla de Ubuntu que emita el mismo comando lxc-create .

Una vez que el proceso de generación del contenedor de Ubuntu finalice, un mensaje mostrará sus credenciales de inicio de sesión predeterminadas del contenedor, como se ilustra en la siguiente captura de pantalla.

# lxc-create -n myubuntu -t ubuntu

Contenedor> Crear contenedor LXC Ubuntu

Checking cache download in /var/cache/lxc/precise/rootfs-amd64 ... 
Installing packages in template: ssh,vim,language-pack-en
Downloading ubuntu precise minimal ...

15. Para crear un contenedor específico basado en una plantilla local, use la siguiente sintaxis:

# lxc-create -n container_name -t container_template -- -r distro_release -a distro_architercture 

Aquí hay un extracto de la creación de un contenedor debian sibilante con una arquitectura del sistema amd64 .

# lxc-create -n mywheezy -t debian -- -r wheezy -a amd64

Arquitectura> Crear contenedor LXC basado en la arquitectura Distro

debootstrap is /sbin/debootstrap
Checking cache download in /var/cache/lxc/debian/rootfs-wheezy-amd64 ... 
Downloading debian minimal ...
W: Cannot check Release signature; keyring file not available /usr/share/keyrings/debian-archive-keyring.gpg
I: Retrieving Release 
I: Retrieving Packages 
I: Validating Packages 
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
I: Found additional required dependencies: insserv libbz2-1.0 libdb5.1 libsemanage-common libsemanage1 libslang2 libustr-1.0-1 
I: Found additional base dependencies: adduser debian-archive-keyring gnupg gpgv isc-dhcp-common libapt-pkg4.12 libbsd0 libclass-isa-perl libedit2 libgdbm3 libgssapi-krb5-2 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0 libncursesw5 libprocps0 libreadline6 libssl1.0.0 libstdc++6 libswitch-perl libusb-0.1-4 libwrap0 openssh-client perl perl-modules procps readline-common 
I: Checking component main on http://http.debian.net/debian...
I: Retrieving libacl1 2.2.51-8
I: Validating libacl1 2.2.51-8
I: Retrieving adduser 3.113+nmu3
I: Validating adduser 3.113+nmu3
I: Retrieving apt 0.9.7.9+deb7u7
I: Validating apt 0.9.7.9+deb7u7
I: Retrieving libapt-pkg4.12 0.9.7.9+deb7u7
I: Validating libapt-pkg4.12 0.9.7.9+deb7u7
I: Retrieving libattr1 1:2.4.46-8
I: Validating libattr1 1:2.4.46-8
I: Retrieving base-files 7.1wheezy9
I: Validating base-files 7.1wheezy9
I: Retrieving base-passwd 3.5.26
...

16. Por ejemplo, también se pueden crear contenedores específicos para diferentes distribuciones de distro y arquitecturas a partir de una plantilla genérica que se descargará de los repositorios de LXC como se ilustra en el siguiente ejemplo.

# lxc-create -n mycentos6 -t download -- -d centos -r 6 -a i386

Aquí está la lista de modificadores de línea de comando de lxc-create :

-n = name 
-t = template
-d = distibution
-a = arch
-r = release

17. Los contenedores se pueden eliminar de su host con el comando lxc-destroy emitido contra un nombre de contenedor.

# lxc-destroy -n mywheezy

18. Se puede clonar un contenedor a partir de un contenedor existente emitiendo el comando lxc-clone :

# lxc-clone mydeb mydeb-clone

19. Y, finalmente, todos los contenedores creados residen en el directorio /var/lib/lxc/. Si, por algún motivo, necesita ajustar manualmente la configuración del contenedor, debe editar el archivo de configuración de cada directorio de contenedor.

# ls /var/lib/lxc

Estas son solo las cosas básicas que necesita saber para trabajar en LXC.