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


LXC, acrónimo de Linux Containers, es una solución de virtualización liviana basada en el kernel de Linux, que prácticamente se ejecuta en la parte superior del sistema operativo, lo que le permite ejecutar múltiples distribuciones aisladas al mismo tiempo.

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

Esto hace que LXC sea una solución de virtualización muy rápida en comparación con otras soluciones de virtualización, como VMware.

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

Un sistema operativo Linux que funcione con una instalación mínima:

  1. Instalación de CentOS 7 Linux
  2. Instalación de RHEL 7
  3. Instalación del servidor Fedora 23

Paso 1: Instalar la virtualización LXC en Linux

1. La virtualización LXC se proporciona a través de los repositorios de Epel. Para utilizar este repositorio, abra una 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 los paquetes Perl Language Interpreter y 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. Una vez instalado el servicio LXC, verifique si LXC y el demonio libvirt se están ejecutando.

# systemctl status lxc.service
# systemctl start lxc.service
# systemctl start libvirtd 
# systemctl status 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: 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
[[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 ya instalados en su sistema, emita el siguiente comando.

# ls -alh /usr/share/lxc/templates/
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 sencillo. 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.

[[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 finalice el proceso, un mensaje mostrará la contraseña predeterminada de su cuenta de root. 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 listar 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 iniciado el contenedor, puede enumerar los contenedores en ejecución mediante 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, emita el comando lxc-console con un nombre de contenedor en ejecución. Inicie sesión con el usuario root y la contraseña generada por defecto 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 ver detalles sobre las interfaces de red con ifconfig .

# lxc-console -n mydeb
# cat /etc/issue.net
# ifconfig
# passwd
[[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, emita el siguiente comando.

# lxc-stop -n mydcb

12. Para crear un contenedor LXC basado en una plantilla de Ubuntu, ingrese el 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 editor 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”

Como referencia, consulte 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 emitiendo el mismo comando lxc-create .

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

# lxc-create -n myubuntu -t 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 wheezy con una arquitectura de sistema amd64.

# lxc-create -n mywheezy -t debian -- -r wheezy -a amd64
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 versiones de distribución y arquitecturas a partir de una plantilla genérica que se descargará de los repositorios 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 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. Un contenedor se puede clonar desde 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 alguna razón necesita ajustar manualmente la configuración del contenedor, debe editar el archivo de configuración de cada directorio del contenedor.

# ls /var/lib/lxc

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