-
Notifications
You must be signed in to change notification settings - Fork 0
Contenedores
Esta página describe unos pasos a seguir para crear contenedores en servidores linux de forma sencilla.
Estos contenedores funcionan de manera muy parecida a una máquina virtual, permiten acceso por terminal o ssh o incluso x si hace falta, pero comparten el kernel con la máquina host. El uso de systemd permite una configuración muy rápida y fácil, pero a la que luego se le pueden añadir opciones como límites de recursos, carpetas compartidas, etc.
-
systemd: las distribuciones linux modernas vienen con él de serie. -
debootstrap: para crear un SO debian en un directorio. (sustituir por alternativas para usar red hat, etc.)
-
sshpiperd: permite redirigir conexiones ssh de algunos usuarios a su máquina virtual correspondiente.
Nota: En lo que sigue, tfg-ejemplo es el nombre del contenedor, y alumno es el nombre de un usuario.
Estas instrucciones son de memoria y no 100% detalladas, pero si hay algún problema al seguirlas se pueden actualizar para corregir el fallo/omisión que haya.
En la máquina host, tener en cuenta que las máquinas se crean en la carpeta /var/lib/machines por defecto. Se puede hacer un symlink de esta carpeta a un disco duro por ejemplo que tenga mucho espacio.
-
systemctl enable --now systemd-networkd systemd-resolvedSi no está, usamos el stack de networking de systemd para poder acceder fácilmente a los contenedores y que éstos tengan acceso de red. Sólo hace falta una vez por host. -
# mkdir -p /var/lib/machines/tfg-ejemploCreamos el directorio para la máquina -
# debootstrap --include=dbus stretch /var/lib/machines/tfg-ejemplo http://ftp.es.debian.org/debian/Instalamos un sistema debian (en este caso stretch) en ese directorio. -
# systemctl enable --now systemd-nspawn@tfg-ejemploHabilitamos y lanzamos el servicio del contenedor -
# machinectl shell tfg-ejemplo /bin/bashLanzamos una terminal root dentro del contenedor. Los comandos a partir de ahora son en esa terminal -
# systemctl enable systemd-networkdHabilitamos el servicio de networking de systemd para que la máquina sea visible desde fuera. -
Con la terminal de root, cambiamos la contraseña root, creamos los usuarios correspondientes, instalamos sudo u otros paquetes necesarios, etc. Recomendado instalar
localesy configurarlo (dpkg-reconfigure locales).
Con esto ya está, el contenedor está ejecutando y se inicia automáticamente con la máquina. Además, en la máquina host hay una interfaz ethernet virtual que se puede usar para acceder al contenedor. Si networkd está bien configurado (ejecutar networkctl para comprobar) se podrá acceder a las máquinas simplemente escribiendo su nombre (eg. ssh alumno@tfg-ejemplo). También se puede redireccionar internamente puertos o paths externos a la url interna.
Si queremos que los usuarios puedan acceder al contenedor por ssh, se le puede asignar una IP y un nombre de dominio, para lo cual hay que hablar con la UCM, etc. Otra opción es habilitar un puerto adicional para ssh y redireccionarlo al contenedor correspondiente con iptables. Finalmente, la tercera opción es redireccionar a algunos usuarios en el ssh a la máquina correspondiente. Para ello usamos el programa sshpiper.
-
$ mkdir go ; GOPATH="./go" go get -u github.com/tg123/sshpiper/sshpiperdDescargamos sshpiper. -
# cp ./go/bin/sshpiperd /usr/local/bin/Instalamos el binario en el sistema. -
# mkdir /var/sshpiperCreamos el workdir para sshpiper. -
# mkdir /var/sshpiper/alumno ; echo "tfg-ejemplo" >/var/sshpiper/alumno/sshpiper_upstreamEn este fichero ponemos el nombre del host al que redireccionar el ssh. Se puede hacer por cada usuario existente. -
# sshpiperdLanzamos ssh piper para que redireccione las conexiones, y probamos a hacer$ ssh alumno@maquina-host -p 2222El puerto por defecto es el 2222
Ya está. Para que sshpiper funcione permanentemente, usar el método favorito (por ejemplo un servicio de systemd).