Despliegue de aplicaciones: Contenedores y Máquinas Virtuales - 23/24
Contenido
Prerrequisitos
Instalación Docker
Instrucciones para instalar sobre Ubuntu 22.04 (Jammy Jellyfish):
1 #Actualizar la lista de paquetes
2 sudo apt update
3
4 #Instalar algunos prerrequisitos que permitan a apt usar paquetes a través de HTTPS
5 sudo apt install apt-transport-https ca-certificates curl software-properties-common
6
7 #Añadir la clave GPG del repositorio oficial de Docker al sistema
8 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
9
10 #Añadir el repositorio de Docker a las fuentes de apt
11 echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
12
13 #Actualizar la lista de paquetes existente para que se reconozca el repositorio añadido:
14 sudo apt update
15
16 #Instalar Docker
17 sudo apt install docker-ce
18
19 #Verificar que Docker está instalado, el demonio iniciado y el proceso habilitado para iniciarse al arrancar.
20 sudo systemctl status docker
21
22 #Por defecto, Docker debe usarse con el usuario root o con un usuario entre del grupo docker, que es creado durante la instalación de Docker. Si intentamos utilizar el comando "docker" sin sudo, obtendremos un mensaje informativo comunicando que no se encuentra el servicio docker.
23
24 #Añadir nuestro usuario al grupo docker (a veces, se necesita reiniciar la sesión/equipo para que este cambio tenga efecto)
25 sudo usermod -aG docker ${USER}
26 su - ${USER}
Instalación Vagrant
Instrucciones para instalar sobre Ubuntu 22.04 (Jammy Jellyfish):
1 #Actualizar la lista de paquetes
2 sudo apt update
3
4 #Instalar vagrant, ansible y virtual box
5 sudo apt install vagrant ansible virtualbox
Es altamente recomendable realizar esta práctica en un sistema Linux NO VIRTUALIZADO, es decir, instalado directamente en el equipo (por ejemplo, en una partición). En caso contrario, los más probable es que no llegue a funcionar la práctica. Raramente, llegará a funcionar pero con un rendimiento muy bajo. Si desea continuar usando máquinas virtuales, lea este texto hasta el final.
Tanto el uso dentro de virtualbox como en WSL requieren de bastante configuración: En caso de usar máquina virtual hay que habilitar la virtualización anidada y asegurarse de tener suficiente espacio en disco.
- Espacio en disco.
- En caso de usar WSL, tutorial de la propia Vagrant.
Sesión
Archivo:09-Contenedores y VM 2324.pdf
Docker
Docker básico
- Hola mundo:
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
- Imágenes
#Listado de imágenes en local
$ docker images
$ docker image ls
#Imágenes intermedias
$ docker image ls -a
#Descargar una imagen en el repositorio local
$ docker pull nombre_imagen
#Borrar imagen
$ docker image rm id_imagen
$ docker rmi id_imagen
- Contenedores
#Listado de contenedores
$ docker ps
$ docker container ls
$ docker ps -a
$ docker container ls -a
#Parar contenedor
$ docker stop id_contenedor
$ docker container stop id_contenedor
#Borrar contenedor
$ docker rm id_contenedor
$ docker container rm id_contenedor
#Borrar todos los contenedores
#-a --> todos los contenedores
#-q --> sólo sus id
$ docker rm $(docker ps -aq)
Contenedores interactivos
#-t --> terminal
#-i --> interactivo
#/bin/bash --> comando
$ docker run -it ubuntu bin/bash
#Siguiendo las instrucciones previas:
#Verifique en otra terminal que el contenedor está "vivo".
#Salga del contenedor y verifique en la otra terminal que ahora su estado es "exited".
#Para dejar el contenedor vivo pero no interactuar con él
#-d --> detached (independiente)
$ docker run -td ubuntu bin/bash
#Siguiendo las instrucciones previas:
#Verifique en otra terminal que el contenedor está "vivo".
#Para comenzar a interactuar con un contenedor que está vivo previamente
$ docker exec -it id_contenedor /bin/bash
Construir nuevas imágenes a partir de una existente
# 1) Arrancar contenedor
$ docker run -I ubuntu bash
# 2) Instalar nuevas dependencias
$ apt-get update
$ apt-get install apache2
$ exit
# 3) Crear nueva imagen a partir del contenedor
$ docker commit -m "mensaje_descriptivo" -a "nombre_autor" id_contenedor nombre_nueva_imagen
# 4) Siguiendo las instrucciones anteriores, cree un nuevo contenedor a partir de esta nueva imagen
Puertos y volúmenes
# 1) Arrancar un contenedor basado en una imagen de nginx y mapear los puertos
$ docker run -p 8010:80 -d kitematic/hello-world-nginx
# 2) Abrir en el navegador localhost:8010 y comprobar que el sistema desplegado en el puerto 80 del contenedor es accesible desde fuera en el puerto 8010.
# 1) Acceder a la terminal del contenedor del paso anterior
$ docker exec -ti id_contenedor sh
# 2) Modificar la plantilla HTML para verificar que los cambios son visibles desde fuera del contenedor. (La plantilla HTML se encuentra en el directorio /website_files/index.html)
# 3) Recargar navegador y comprobar que los cambios son visibles "en caliente"
# 4) Siguiendo las instrucciones previas, parar el contenedor
# 5) Siguiendo las instrucciones previas, arrancar de nuevo un contenedor de la misma imagen y verificar en el navegador y en la plantilla que los cambios se han perdido (es una nueva instancia)
# 6) Siguiendo las instrucciones previas, parar el contenedor
# 7) Arrancar un nuevo contenedor con esa imagen que utilice volúmenes para aportar persistencia
$ docker run -p 8010:80 -d -v ~/code:/website_files kitematic/hello-world-nginx
# 8) Replicar en este contenedor los pasos 2 y 3
# 9) Siguiendo las instrucciones anteriores, parar el contenedor
# 10) Volver a lanzar un nuevo contenedor de la misma forma que en el paso 7)
# 11) Verificar en el navegador que aunque es otro contenedor, los cambios se mantienen
Vagrant
Introducción a Vagrant
- En primer lugar, comprobar que la instalación es correcta, ejecutando una máquina sencilla:
# 1) En un directorio ej1, inicializar el directorio para crear un entorno de la box que se ejecutará a través de un Vagrantfile inicial
$ vagrant init ubuntu/trusty32
# 2) Levantar una máquina virtual en base a la box descrita en el Vagrantfile
$ vagrant up
# 3) Verificar que tenemos dos sistemas funcionando:
$ vagrant ssh -c 'hostnamectl' #si pide contraseña --> vagrant
$ hostnamectl #en otra terminal
# 4) Para ver que la máquina virtual se está ejecutando, podemos verlo directamente en virtualbox o en la terminal
$ vagrant global-status
# 5) Para entrar en la máquina virtual:
$ vagrant ssh #si pide contraseña --> vagrant
# 6) Crear un fichero en el sistema guest. Dentro de la máquina crear un fichero.
$ cd /home
$ vi hola.txt
# 7) Mandar señal de apagado a la máquina y liberar recursos
$ vagrant halt #(la opción -f simula un apagado forzado)
# 8) Siguiendo las instrucciones previas, levantar de nuevo la máquina y verificar que el fichero creado sigue ahí
# 9) Parar la máquina, borrarla y liberar espacio
$ vagrant destroy
- Gestionando boxes:
# Lista de boxes disponibles en nuestro sistema local
$ vagrant box list
#Para eliminar una box
$ vagrant box remove ubuntu/trusty32
Carpetas compartidas y redirección de puertos
# 1) Crear una carpeta que actuará como entorno de la máquina
# 2) Inicializar entorno con la box obihann/nginx
$ vagrant init obihann/nginx
# 3) Arrancar la máquina
$ vagrant up
# 4) Verificar que existe la carpeta compartida indicada en el Vagrantfile.
# 5) Esta máquina levanta un nginx en el puerto 80 de la MV. Habilitar el forwarding de puertos para que el sistema sea accesible desde el navegador en el host.
# 6) Recargar la máquina virtual
$ vagrant reload
# 7) Añadir un index.html al directorio /www y comprobar que se puede visualizar en el host desde localhost:8080
# 8) Siguiendo las instrucciones anteriores, parar y borrar la máquina para liberar recursos.