7. Despliegue básico en servidor

Introducción a Docker

Docker es similar a VirtualBox solo que se gestiona con la línea de órdenes y consume muchísimos menos recursos el crear cada máquina virtual.

En el entorno de Docker hay que diferenciar dos conceptos:

Imagen: Son como plantillas de una máquina virtual

Contenedor: Es la máquina virtual en ejecución pero el software que se ejecuta es el que se define en la Imagen

Mas información:

Entendiendo la nube: el significado de SaaS, PaaS y IaaS

Docker, qué es y cómo funciona la virtualización de contenedores

De Docker a Kubernetes: entendiendo qué son los contenedores y por qué es una de las mayores revoluciones de la industria del desarrollo

Entendiendo Docker. Conceptos básicos: Imágenes, Contenedores, Links…

Instalación

Para instalar docker , lanzar las siguientes órdenes en Ubuntu:

snap remove docker
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

Las instrucciones actualizadas están en Install Docker Engine on Ubuntu

Para comprobar que todo funciona , lanzar la siguiente orden:

sudo docker run hello-world

Gestión de Imágenes

Las imágenes se descargan de una página llamada DockerHub. Es algo similar a GitHub pero para imágenes de Docker.

Orden	Explicación
docker image pull	Bajar una imagen de DockerHub
docker image rm	Borrar una imagen en local
docker image ls	Ver las imagenes que hay en local
docker image save	Exportar una imagen a un fichero
docker image load	Importan una imagen desde un fichero

docker image pull

Se usa para descargar una imagen de DockerHub en nuestra máquina.

Tiene un único parametro que es el nombre de la imagen a descargar. El nombre de la imagen tiene el siguiente formato: usuario/nombre de la imagen:tag de la imagen

Siendo:

usuario: El nombre del usuario que ha subido la imagen. Si la imagen es oficial de DockerHub no tendrá usuario y no se pondrá la / posterior

nombre de la imagen: Es obligatorio y es el nombre de la imagen a descargar

tag de la imagen: Es la versión de la imagen. Si no se pone la versión , no hay que poner los dos puntos anteriores y se descargará la que está etiquetada como "latest"o "lts.

Descarga la imagen llamada "mysql-server" creada por el usuario "mysql" pero la versión "8.0.22"

docker image pull mysql/mysql-server:8.0.22

Proxy

Al igual que con otras herramientas, para clase habrá que configurar el proxy:

mkdir /etc/systemd/system/docker.service.d
echo "[Service]" >> /etc/systemd/system/docker.service.d/http-proxy.conf
echo "Environment=\"HTTP_PROXY=http://172.16.0.9:8080/\"" >> /etc/systemd/system/docker.service.d/http-proxy.conf
systemctl daemon-reload

Si todo está correcto, la siguiente orden debe mostrar Environment=HTTP_PROXY=HTTP_PROXY=http://172.16.0.9:8080/"

systemctl show --property Environment docker

Mas información:

Cannot download Docker images behind a proxy

Gestión de Contenedores

Orden	Explicación
docker container run	Crear un nuevo contenedor y ejecutarlo a partir de una imagen
docker container start	Iniciar un contenedor que está parado
docker container stop	Parar un contenedor
docker container rm	Borrar un contenedor que está parado
docker container ls	Ver los contenedores que hay
docker container exec	Ejecutar una orden en el contenedor. Normalmente es el Shell
docker container stats	Mostrar uso de CPU,memoria,etc de los contenedores

Las dos órdenes mas complejas e importantes para la gestión de los contenedores son:

docker container run

docker container exec

docker container run

Pone en marcha la imagen creando un contenedor.Su forma mas sencilla de usar es docker run nombre_imagen. Aunque prácticamente siempre se usan la mayoría de los siguientes parámetros:

-d: Indicar que es un servidor (demonio)

-it: Si queremos intereactuar en la consola con la aplicación (NO es un demonio). Las opciones -d y -it son excluyentes.

--restart always : Añadiremos este flag si queremos que se vuelva a iniciar el contenedor si acaba dicho contenedor. Es útil ya que se iniciará el contenedor si se reinicia la máquina real.

--name nombreContanedor: Indica el nombre que va a tener el contenedor. Es muy útil ya que así sabemos cual es cada una de las imágenes.

-p puertoExterno:puertoInterno: Indica en que puerto de la máquina real se "mapea" el puerto que usa el software servidor del contenedor.

-e nombreVariableDeEntorno:valorVariableDeEntorno: Permite indicar el valor de una variable de entorno. Es la forma mas común de configurar un contenedor. Se debe mirar la configuración de la imagen para saber las variables a usar ya que es específico de cada imagen.

-v carpetaMaquinaReal:carpetaInternaContenedor: Indica que una carpeta de dentro del contenedor será realmente una carpeta real de nuestra máquina. Se usa para que no se pierdan los datos si borramos la máquina y la volvemos a crear.

Si usamos una carpeta real , deberá tener todos los permisos ya que el usuario que usa el contenedor es distinto al nuestro.

Ejecuta mariadb del tag 10.1

En modo demonio

Que si por algún motivo acaba el contenedor se vuelva a reiniciar

Los datos de "/var/lib/mysql" se guardarán en la carpeta local "/opt/mariadb". Está indicado en la documentación de la imagen.

Se indica que la variable de entorno MYSQL_ROOT_PASSWORD tiene el valor de root. Esto se hace para configurar la contraseña de root de la imagen. Está indicado en la documentación de la imagen

Se verá en el puerto 4000

Se llamará el contenedor "prueba_mariadb"

docker container run \
-d \
--restart always \
-v /opt/mariadb:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-p 4000:3306 \
--name prueba_mariadb \
mariadb:10.1

Lo mas complicado de la orden docker container run son los parámetros -v y -p

docker container exec

Permite lanzar órdenes dentro del contanedor. Podría verse como algo similar a conectarse por ssh al contenedor.

Muestra el contenido del fichero /etc/passwd que está dentro del contenedor

docker container exec -it nombre_container cat /etc/passwd

Ejecutar bash dentro del contenedor par poder lanzar culaquier orden dentro de él.

docker container exec -it nombre_container /bin/bash

Ejercicios

Para hacer estos ejercicios deberás tener instalado una máquina virtual de VirtualBox con Ubuntu Server 18.04.5. Aunque no es necesario si ya usas Linux en tu equipo.

Al instalar Ubuntu recuerda marcar el servidor de SSH cuando te pida el software a instalar.
Al instalar Ubuntu si estás en el centro recuerda también indicar el proxy

Ejercicio 1

Dada las siguientes dos imágenes:

jenkins

jenkins/jenkins

Responde:

¿Cual usarías?Explica porqué

Indica las órdenes para realizar lo siguiente:

Baja a tu máquina la última versión de la imagen que has elegido.

Baja a tu máquina otra imagen con el tag "lts" de la imagen que has elegido.

Muestra las imágenes que tienes descargadas en tu máquina

Borra una de las imágenes que tienes

Muestra las imágenes que tienes descargadas en tu máquina

Guarda la imagen que tienes en un fichero

Borra la imagen que aun queda

Carga la imagen que habías guardado en un fichero

Muestra las imágenes que tienes descargadas en tu máquina

Ejercicio 2

Con la imagen de Jenkins que te has bajado, crea un contenedor con los siguientes datos:

El puerto interno 8080 que se vea en la máquina en el puerto 11211

Que los datos de configuración de Jenkins (en "/var/jenkins_home") se guarden en la carpeta "/opt/prueba_jenkins" de la máquina real en

Que el nombre del contenedor sea "Prueba Jenkins"

Que sea un demonio

Ahora vamos a configurar Jenkins:

Navega a la IP de tu máquina Linux, deberá ver la página del Jenkins que acabas de instalar.

Indica de 3 formas distinta como mostrar el contenido (usando cat) del fichero /var/jenkins_home/secrets/initialAdminPassword del contenedor.

Viéndolo desde la carpeta que está dentro del contenedor

Viéndolo desde la carpeta que está en la máquina real

Usando bash dentro del contenedor y una dentro del bash del contenedor, mostrar el contenido del fichero.

Pega el contenido del fichero "initialAdminPassword" en la página web y pulsa "continue"

Pulsa en "Install seuggested plugins"

Crea el usuario que se llamará "system_builder" y pulsa "Save and Continue"

Pulsa "Save and Finish"

Pulsa "Start using Jenkins"

Se deberá mostrar una imagen similar a la siguiente:

Ejercicio 3

Indica los siguientes comandos:

Muestra la lista de contenedores.

Borra el contenedor de Jenkins. No te dejará.

Para el contendor de Jenkins

Muestra la lista de contenedores. No debe verse el de Jenkins.

Mira por internet la opción para ver "TODOS" los contendores.Y muestra ahora todos los contenedores.

Borra el contenedor de Jenkins. Ya te dejará.

Vuelve a crear el contenedor de Jenkins como en el ejercicio anterior.

Navega a la página web del Jenkins y comprueba que ya está todo instalado. ¿Como es que no se ha borrado si hemos borrado el contenedor y vuelto a crearlo?

Ejercicio 4

Indica los siguientes comandos:

Arranca un contenedor de MariaDB. Tag: 10.1 pero no indiques nada referido a las carpetas.

Haz lo siguiente:

Conéctate desde tu ordenador Windows al MariaDB y crea una tabla e inserta un dato.

Indica los siguientes comandos:

Borra el contenedor de MariaDB

Arranca un contenedor de MariaDB pero no indiques nada referido a las carpetas

Haz lo siguiente:

Conéctate desde tu ordenador Windows al MariaDB y comprueba que no está la tabla que habías creado.

Ejercicio 5

Indica los siguientes comandos:

Arranca un contenedor de MariaDB. Tag: 10.1 pero ahora indica que la carpeta "/var/lib/mysql" se guarde en "/opt/mariadb" de la máquina real

Haz lo siguiente:

Conéctate desde tu ordenador Windows al MariaDB y crea una tabla e inserta un dato.

Indica los siguientes comandos:

Borra el contenedor de MariaDB

Arranca un contenedor de MariaDB y vuelve a indicar que la carpeta "/var/lib/mysql" se guarde en "/opt/mariadb" de la máquina real

Haz lo siguiente:

Conéctate desde tu ordenador Windows al MariaDB y comprueba que SI que está la tabla que habías creado.

Ejercicio 6

Indica los siguientes comandos:

Arranca un contenedor de PHP con apache. Tag: 7.2-apache e indica que la carpeta "/var/www/html" se guarde en "/opt/apache" de la máquina real y que el puerto 80 del contenedor se vea en el puerto 22322 de la máquina real.

Crea el fichero index.php con el siguiente contenido

Cópialo de forma que navegando a "http://localhost:22322" se vea el resultado que ha generado la página en php. Será similar a lo siguiente:

Ejercicio 7

Reinicia la máquina real.

Comprueba que navegando a "http://localhost:22322" se produce un error.

Borra el contenedor

Vuelve a crear el contenedor pero ahora añade que siempre se reinicie.

Reinicia la máquina real

Comprueba que navegando a "http://localhost:22322" ahora si que funciona.