Usuario:ManuelRomero/ProgramacionWeb/INAEM2019/Docker/Conceptos

De WikiEducator
Saltar a: navegación, buscar




Icon objectives.jpg
Objetivo
Ver qué es docker desde el punto de vista de ser usado para dockerizar un desarrollo web
  • Docker, contenedor, imagen, domandos
Conceptos e instalaciones
  • Comandos de docker en el cliente
  • Contenedores e imágenes (crear y gestionar en ambas direcciones).
  • Portabilidad de los contenedores
  • Crear nuestro ambiente de trabajo dockerizado


Recursos de la web
  • La mejor la oficial:
https://docs.docker.com/engine/
  • Artículo interesante de Mauricio Collados, donde he sacado ideas para este tema
https://medium.com/ingenier%C3%ADa-en-tranqui-finanzas/una-gu%C3%ADa-no-tan-r%C3%A1pida-de-docker-y-kubernetes-933f5b6709df
  • Curso gratuito de docker
https://jgaitpro.com/p/introduccion-a-containers-en-docker
  • Instalar contenedor en windows (ver minutos 6:10 - 9:21
https://www.youtube.com/watch?v=9FoWrDx6n2k


Icon present.gif
Tip: Esta es una lectura para contextualizar qué es docker y para qué sirve


Qué es docker

  • Docker es una empresa https://www.docker.com/company/ que entre otros productos ofrece una tecnología de virtualización basada en contenedores.
  • Empieza su desarrollo en 2010 impulsada por Solomon Hykes, y actualmente la compañía se llama Moby Proyect.
Icon present.gif
Tip: MRM TODO Historia ???



  • Entre otras, en una idea inicial, Docker permite tomar instantáneas de un determinado entorno de ejecución, incluyendo el sistema operativo, servicios y procesos necesarios, aislándolo del sistema anfitrión dónde se esté ejecutando. Para hacer instantáneas, se procede igual que los commit de git (también es el comando docker commit) y pudiendo en cualquier momento recuperar dicho entorno de ejecución en un determinado instante, siempre independizados del entorno (Sistema anfitrión dónde se esté ejecutando el elemento concreto de docker).
  • En este proceso de empaquetamiento en una sola entidad con forma de archivo (contenedor) se van a agrupar el código fuente y las dependencias requeridas para que el software funcione.
  • Aquí está el concepto de contenedor un programa que virtualiza el software deseado para ese determinado entorno de ejecución. De este contenedor podemos comitear a imágenes nuevas en cualquier momento. Igualmente de una imagen concreta se puede levanta un contendor de forma muy rápida (cuestión de segundos o menos....). Si vamos realizando nuevas instalaciones en el contenedor, vamos guardando solo los cambios que se van produciendo. Podremos visualizar los difernetes cambios.

(Comment.gif: En cada commit solo se guardan los cambios realizados desde el commit anterior.)




Icon define.gif
Definición
Es un sistema de virtualización de código abierto basado en contenedores.



Icon define.gif
"Idea intuitiva de virtualizar un S.O."

Utilizar software para emular el sistema necesario que pueda contener un determinado sistema operativo disponible para ser usado




Icon qmark.gif
"Docker virtualiza un S.O. ??"
  • No es cierto, docker utiliza y comparte el kernel del sistema operativo anfitrión, virtualiza todo lo necesario para poder crear un determinado entorno de ejecución de forma totalmente aislada al sistema operativo anfitrión, incluyendo cambios en el propio sistema operativo. En esta línea sí que se puede comparar a una instantánea de un sistema operativo, pero no es su objetivo ni lo que pretende. Su objetivo es crear un entorno de ejecución independiente y chroot
Docker general 1.png

Cómo actúa Docker en una máquina anfitriona

  • El elemento funcional u operativo de en un sistema basado en docker es el contenedor

Qué es un contenedor



Icon define.gif
Un contenedor

Es una pieza de software liviana, independiente, empaquetable y ejecutable que incluye todo lo que necesita para correr: código, runtime, herramientas de sistema, librerías y configuraciones traducido de la página oficial de docker



Docker distancia 1.png


  • No se virtualiza el sistema operativo entero, solo los servicios que queremos usar con sus dependencias (Esta es la idea de un contenedor)
  • El kernel del sistema operativo es compartido con el host anfitrión dónde el contenedor es ejecutado.
Con todo ello conseguimos
  • Un sistema muy ligero, tanto en peso como en ejecución. Esto se consigue, ya que en realidad lo que voy almacenando en el contenedor son las diferencias respecto a una imagen o al kernel del sistema operativo, no tengo una réplica de todo como ocurre en una máquina virtual. Utilizo todo del sistema dónde me alojo y tengo en cuenta la peculiaridades o diferencias que he agregado en el contenedor que estoy ejecutando.
  • Totalmente portable: podemos desplegar un contenedor en cualquier otro anfitrión o máquina que soporte esa tecnología. El contenedor lo podemos llevar en un fichero tar
  • Es seguro, el docker está encerrado en un chroot, podemos asegurar las versiones de nuestros servicios y sistema operativo.
  • Muy flexible y de fácil adaptación con el exterior: es muy cómodo y sencillo pasar ficheros entre el contenedor y el host. Se puede mantener un volumen que sea compartido por ambos sistemas de ficheros (el del host y el del contenedor).

Vitualización basada en contenedores Vs Máquinas virtuales

  • Un sistema de virtualización basado en docker es muy diferente de un sistema basado en máquinas virtuales
  • En ambos perseguimos el objetivo de tener un sistema operativo diferente e independiente de la máquina anfitriona donde desplegamos la virtualización. Pero el método de conseguirlo es totalmente diferente.

Docker distancia MV.png

Icon present.gif
Tip: Esta imagen tiene imágenes y texto obtenidos de wikipedia que he adaptado
https://es.wikipedia.org/wiki/Hipervisor 


  • Observamos en la imagen, como cada máquina virtual implementa la parte del hardware como parte de la máquina virtual, incluso reservando recursos físicos de la máquina anfitriona para cada máquina virtual.
  • Arrancar cada máquina puede constar minutos, al igual que cuando arrancamos físicamente nuestro equipo
  • Como ventaja tenemos realmente una máquina independiente, pero perdemos la flexibilidad, velocidad y ligero de un contenedor, no tiene nada que ver.

Docker en el desarrollo web

  • Es una manera de que el desarrollador tenga justo lo que necesita, sin alterar el sistema o host principal dónde desarrolla

Docker 1.jpg

  • Está basado en una imagen. A partir de ella (y dependiendo siempre de ella) tendremos uno o varios contenedores, software operativo que virtualiza y me ofrece todas sus prestanciones.
  • La dependencia entre una image y sus contenedores es total, de modo que no podremos borrar una imagen si hay contenedores que se hayan creado a partir de ella.
  • Esto es normal, ya que la gran velocidad y flexibilidad de docker está basada en que solo guardamos los cambios que realicemos, por eso todo es tan dinámico.


Instalar Docker




Pasos a realizar

1.- Desinstalar versiones antiguas

sudo apt-get remove docker docker-engine docker.io containerd runc

2.-Ahora vamos a instalar usando el repositorio de docker para ubuntu

 sudo apt-get install  apt-transport-https  ca-certificates   curl   gnupg-agent  software-properties-common

3.- Añadimos la clave GPG oficial de docker

 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4.- Añadimos el repositorio

sudo add-apt-repository  "deb [arch=amd64] https://download.docker.com/linux/ubuntu  $(lsb_release -cs)  stable"
Icon present.gif
Tip: lsb_release -cs; -c, codename, para mostrar el nombre de código de la distribución, -s, short para solo mostrar el valor del nombre


5.- Actualizamos el índice de los paquetes apt e instalamos docker

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
Ahora para poder ejecutar docker el usuario actual sin usar sudo
  • Agragamos el usuario actual ( u otro si queremos que sea otro) al grupo de docker
 sudo gpasswd -a $USER docker
  • Creamos el grupo de docker si no existe
   newgrp docker
  • Para ver todos los comando
 docker help

Contenedor Vs Imagen

  • Este es un concepto importante que puede quedar claro si vemos la imagen anterior
  • La imagen es el fichero que nos va a permir instalar esta especie de máquina virtual.
  • Es como el iso para instalar el sistema operativo
  • El contenedor es el sistema corriendo con el cual podemos interactuar. Se instala a partir de una imagen
  • Lo bueno que tiene docker es que a partir de un contenedor podemos crear una imagen con todo el software que tenga ese contenedor. Cuando volvamos a desplegar la imagen creada en otro contenedor, tendremos disponible todo el software incluido. En la sección siguiente realizaremos estas acciones.

Registros de imágenes



Icon inter.gif
Recursos de la Web


  • Un registro es un sistema de almacenamiento de imágenes de docker dónde se pueden subir y bajar imágenes.
  • Para que el usuario interactúe con el registro, necesita dos comandos


pull => Obtener una imagen del registro a tu sistema.
push => Subir una imagen al registro.

  • Lo habitual es usar el registro oficial llamado docker hub
  • También podremos, por rapidez, crear un registro local y que sea éste el que responda a las solicitudes de nuestra red; ésto claramente ahorra tiempo y no colapsará la red externa.


Icon casestudy.gif
Ejemplo
docker pull ubuntu


El nombre de la imagen identifica su origen o registro del que se obtiene. </parrafo>

Acciones concretas

Crear un contenedor a partir de una imagen del repositorio

1.-A partir de la imagen ubuntu:latest
2.-El contenedor que se quede activo disponible interactivamente -ti
3.-El nombre del contenedor lop doy explícito -name idioma
4.-La crearemos con un volumen mapeando el directorio /var/www/html del contenedor con /var/www/idioma de mi anfitrión -v /var/www/html:/var/www



Icon key points.gif

Crear un contenedor

run
  sudo docker run -d -t -i  --name idioma -v /var/www/idioma:/var/www/html ubuntu:latest
  • Verificamos que se han creado los dos directoris (tanto el anfitrión (idioma) como en el contenedor (www/html)
En el contenedor

Mapeo dir docker1.png

En el anfitrión

Mapeo dir anfitrion1.png

  • Mira los permisos (lo ha creado docker, docker siempre actúa como root)
  • los modificamos
sudo apt-get chown manuel:www-data /var/www/idioma
  • para ver más opciones disponibles
 sudo docker help run
Ver los contenedores del sistema
  sudo docker ps -a
Ver los las imágenes del sistema
 sudo docker images
Modificar un contenedor
  • Una vez abierto el contenedor podemos proceder a instalar cosas.
  • Para la práctica necesitamos instalar una serie de paquetes (si necesitamos más los ponemos)


Icon key points.gif

Paquetes a instalar

apache y php
apt-get install apache2 php libapache2-mod-php
gettest (luego comentaremos)




Icon key points.gif

Paquetes a instalar

net-tools y vim
  • Estos paquetes los instalo para poder ver la ip y como editor
apt-get install net-tools vim


Icon present.gif
Tip: Si tenemos dudas podemos mirar el apartado de instalación del primer tema del curso, también si queremos instalar java, xdebug u otros paquetes


Crear una imagen en local a partir de un contenedor


Icon key points.gif

Crear una imagen

commit
  • Igual que en git,
docker [opciones] nombre_container [nombre_img:tag]
docker commit -m "Con webservice" -a "Manuel Romero<dir@dom.com>" idioma img_idioma:v1

Commit img1.png

  • Y vemos cómo se ha creado

Img creada1.png


Arrancar un contenedor
  • Una vez cerrado el contenedor (no parado), éste sigue estando disponible
  • Una vez que cerremos el contenedor, mientras no lo destrullamos, podremos disponer de él, aunque apaguemos la máquina, digamos que se queda pausado
Crear una imagen en local a partir de un contenedor


Icon key points.gif

Crear un contenedor

start
exec



  • Para usarlo hay que realizar dos acciones
~ ➭  docker start  dwes
dwes
~ ➭  docker exec -ti dwes /bin/bash 
root@496b9ba15066:/#


Crear un contenedor a partir de una imagen en local
  • Con el comando run, pero especificando la imagen local
Crear un contenedor con un volumen lógico a partir de una imagen en local
  • Para ello usamos el parámetro -v
 docker run --name nombre_contenedor_nuevo -v /var/www/iternova:/var/www -dti nombre_imagen

Realziar una copia de un contenedor en un fichero

  • Podemos hacerlo de diferentes maneras. una sencilla es usar el comando export / import

Archivo:Export docker.png Archivo:Import docker.png

Resumen



Icon summary.gif
Resumen
Descargar una imagen de docker
PULL.
sudo docker pull nombre_imagen
  • La imagen suele tener un nombre del tipo nombre:tag
  • Por ejemplo para descargar ubuntu:latest
sudo docker pull ubuntu:latest
  • Para ver las imágenes disponibles
https://hub.docker.com/search?q=&type=image



Icon summary.gif
Resumen
Crear un contenedor a partir de una imagen
run
sudo docker run -d -t -i --name nombre_contenedor nombre_imagen
  • Por ejemplo crear el contenedor base_datos a partir de ubuntu:latest
sudo docker run -d -t -i --name base_datos ubuntu:latest
  • run tiene muchas opciones (ver docker help run )
  • Por ejemplo crear un directorio mapeado entre máquina anfitriona y el contenedor
sudo docker run -d -t -i --name base_datos -v /var/www/docker_base_datos:/var/www/html ubuntu:latest
  • Este comando creará en el anfitrión un directorio llamado docker cuyo contenido estará acesible también en el subdirectorio /var/www/html del docker
  • Hay que saber que docker al crear directorios lo hace con credenciales de root.
  • Crear un contenedor cuyo servidor web sea accesible desde el esterior, para este caso tendremos que dejar un puerto abierto en el anfitrión para dirigir al puerto 80 del docker
sudo docker run -d -t -i --name base_datos -p 21080:80 ubuntu:latest
  • De esta forma al acceder al puerto 21080 de nuestro host, éste redirigirá al 80 del docker. Por ejemplo si nuestro equipo tiene la ip 172.30.165.10, al esciribir en la url

http://172.30.165.10:21080 aparecerá la página del index del servidor web del docker



Icon summary.gif
Resumen
Crear una imagen a partir de un contenedor; Commit
  • Por ejemplo crear la imagen img_basedatos con tag v1 a partir del contenedor base_datos
docker commit -m "Con webservice y mysql " -a "Manuel Romero<dir@dom.com>" base_datos img_basedatos:v1



Icon summary.gif
Resumen
Exportar un contenedor; Export
  • COn este comando podemos crear un fichero .tar para llevarlo a dónde queramos
  • Suele ser un fichero de menos de 1G (Depende lo que haya en el contenedor
  • Podemos exportar nuestro contenedor a un fichero llamado base_Datso.tar
docker export -o base_datos.tar base_datos




Icon summary.gif
Resumen
Importar un contenedor (imagen); Import
  • Al importar un fichero con extensión .tar creamos una imagen basada en el contenedor que exportamos al fichero tar
  • Importar el contenedor llamado base_datos.tar
docker import base_datos.tar img2_base_datos:v1 /bin/bash