Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/Docker/Conceptos»

De WikiEducator
Saltar a: navegación, buscar
(Dockerfile)
 
(9 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
<!--{{Usuario:ManuelRomero/ProgramacionWeb/Docker/nav}}-->
+
{{Usuario:ManuelRomero/ProgramacionWeb/Docker/nav}}
<div class=parrafo>/
+
<div class=parrafo>
  
 +
<!--
 +
{{MRM_Resumen|Title=Hosting: certweb.infenlaces.com|
 +
;Conexión con clave pública/clave privada
 +
 +
;1.- Creamos una pareja clave/pública clave/privada
 +
*Vamos a nuestro directorio (en nuestro home) '''''.ssh''''' (existirá si tenemos instalado ssh)
 +
<source lang=bash>
 +
cd /home/alumno/.ssh
 +
ssh-keygen
 +
</source>
 +
;2.- Copiamos la clave pública al servidor con ssh
 +
*XXXXX es el puerto creado para comunicar por ssh, la P debe de ser mayúscula, no minúscula como cuando nos conectamos
 +
<source lang=bash>
 +
scp -PXXXXX /home/alumno/.ssh/id_key.pub usuario@usuario.certweb.infenlaces.com:/home/alumno/.ssh/id_publica_insti.pub
 +
</source>
 +
;3.- Nos conectamos al servidor y copiamos la clave pública en el fichero '''''authorized_keys'''''
 +
<source lang=bash>
 +
ssh  -p usuario@usuario.certweb.infenlaces.com
 +
</source>
 +
* ... una vez conectado
 +
* El operador '''''>>''''' es una forma de añadir una salida (en este caso '''''cat id_publica_insti.pub''''' es el contenido del fichero) a otro fichero (si no existe lo crea)
 +
* Si solo se usara '''''>''''' se crearía el fichero o se eliminaría lo que tuviese
 +
* El nombre id_publica_insti.pub  es el nombre del fichero dónde hemos copiado nuestra clave pública
 +
<source lang=bash>
 +
cd .ssh
 +
cat id_publica_insti.pub >> authorized_keys
 +
</source>
 +
;Ahora la próxima vez que nos conectemos no pedirá la clave
 +
*Prueba a ponerte un alias para hacerlo todo más cómodo
 +
}}
 +
{{MRM_Resumen|Title=Hosting: Conectarse con phpstorm|
 +
*Vamos al menú Tools<nowiki>=></nowiki>Deployment<nowiki>=></nowiki>Browse Remote Host
 +
*Seleccionamos SFTP, ya que no tenemos directamente la opción SSH
 +
*Establecemos nuestras credenciales
 +
*Realizamos test para verificar la conexión
 +
*Especificamos el directorio en el cual nos queremos conectar (que sea nuestro DocumentRoot)
 +
*Tener en cuenta que cuando modificamos algún fichero, hay que descargarlo (Ctrl-Alt-Q)
 +
 +
}}
 +
{{MRM_Resumen|Title=Hosting: Conectarse con Visual Code|
 +
https://diarioprogramador.com/conectar-a-un-servidor-por-ssh-desde-visual-studio-code/
 +
}}
 +
 +
{{MRM_Resumen|Title=Comandos a utilizar|
 +
 +
;Crear un contenedor a partir de una imagen
 +
 +
<source lang=bash>
 +
docker run --name nombre_contenedor -t -i  -p 8800:80  -v /home/usuario/dir_maquina_local:/var/www/html ubuntu:latest
 +
</source>
 +
;Crear una imagen a partir de un contenedor
 +
{{nota|(cuidado los volúmenes compartidos no se copian)}}
 +
<source lang=bash>
 +
docker commit -m "mensaje" -a "autor" contendor nombre_imagen_que_creo:tag
 +
</source>
 +
}}
 +
 +
-->
 
*{{Docker/conceptosGenerales}}
 
*{{Docker/conceptosGenerales}}
 +
 +
  
  
Línea 59: Línea 119:
 
  docker help
 
  docker help
 
</source>
 
</source>
 
===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'''.
 
*Podríamo hacer una comparación con la iso para instalar el sistema operativo, pero solo para tener una idea, ya que el concepto es diferente.
 
*El contenedor será el software que corresponde al sistema corriendo con el cual podemos interactuar. Se instala a partir de una imagen y siempre dependerá de ella, es decir, no podremos eliminar la imagen mientras tenga un contenedor asociado.
 
*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.
 
*Tenemos diferentes formas de crear un contenedor a partir de una imagen:
 
#comando '''''run'''''
 
#fichero '''''DockerFile'''''
 
*A continuación veremos las dos formas
 
[[Archivo:creacion_conenedor_1.png]]
 
*{{Docker/Registro}}
 
 
===Acciones concretas===
 
;Crear un contenedor a partir de una imagen del repositorio<br />
 
1.-A partir de la imagen '''''ubuntu:latest'''''<br />
 
2.-El contenedor que se quede activo disponible interactivamente '''''-ti'''''<br />
 
3.-El nombre del contenedor lop doy explícito  '''''-name idioma'''''<br />
 
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'''''<br />
 
 
{{MRM_Puntos clave|Title=Crear un contenedor|
 
;Se puede crear de diferentes formas
 
*'''''run'''''. Con este comando es la forma mas básica de crearlo
 
*'''''Dockerfile''''': Se crea el fichero y con el comando built podemos construir un contenedor a partir de la especificación del fichero
 
*'''''docker.compose.yml''''',  un fichero que me va a permitir crear/levantar varios contenedores especificando todas mis necesidades
 
}}
 
<source lang="bash">
 
  sudo docker run --name idioma -v /var/www/idioma:/var/www/html -ti ubuntu:latest
 
</source>
 
*Verificamos que se han creado los dos directoris (tanto el anfitrión (idioma) como en el contenedor (www/html)
 
 
;En el contenedor
 
[[Archivo:mapeo_dir_docker1.png]]
 
;En el anfitrión
 
[[Archivo:mapeo_dir_anfitrion1.png]]
 
*Mira los permisos (lo ha creado docker,  docker siempre actúa como root)
 
*los modificamos
 
<source lang=bash>
 
sudo apt-get chown manuel:www-data /var/www/idioma
 
</source>
 
 
*para ver más opciones disponibles
 
<source lang=bash>
 
sudo docker help run
 
</source>
 
;Ver los contenedores del sistema
 
<source lang="bash">
 
  sudo docker ps -a
 
</source>
 
;Ver los las imágenes  del sistema
 
<source lang="bash">
 
sudo docker images
 
</source>
 
 
;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)
 
{{MRM_Clave|Title=Paquetes a instalar|
 
;apache y php
 
apt-get install apache2 php libapache2-mod-php
 
;gettext (luego comentaremos)
 
}}
 
{{MRM_Clave|Title=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
 
}}
 
{{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
 
{{MRM_Puntos clave|Title=Crear una imagen|
 
;commit}}
 
*Igual que en git,
 
docker [opciones] nombre_container [nombre_img:tag]
 
<source lang="bash">
 
docker commit -m "Con webservice" -a "Manuel Romero<dir@dom.com>" idioma img_idioma:v1
 
</source>
 
[[Imagen:commit_img1.png]]<br />
 
*Y vemos cómo se ha creado
 
[[Imagen:img_creada1.png]]<br />
 
 
 
=====Arrancar un contenedor =====
 
 
*Una vez cerrado el contenedor (no parado), éste sigue estando disponible
 
*Una vez que cerremos el contenedor, mientras no lo destruyamos, podremos disponer de él, aunque apaguemos la máquina, digamos que se queda pausado
 
;Crear una imagen en local a partir de un contenedor
 
{{MRM_Puntos clave|Title=Arrancar un contenedor|
 
;start
 
;exec
 
}}
 
 
*Para usarlo hay que realizar dos acciones
 
<source lang=bash>
 
~ ➭  docker start  dwes
 
dwes
 
~ ➭  docker exec -ti dwes /bin/bash
 
root@496b9ba15066:/#
 
</source>
 
 
 
 
: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
 
<source lang=bash>
 
docker run --name nombre_contenedor_nuevo -v /var/www/iternova:/var/www -dti nombre_imagen
 
</source>
 
 
====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]]
 
====Exportar e Importar====
 
;Exportar
 
*Se exportará un contenedor a una imagen y se almacenará en un fichero tar.
 
*De esta forma la imagen contendrá todos los servicios instalados en el contenedor.
 
*Recordad que los contendios de los volúmenes no forman parte del contenedor, aunque se pueda acceder desde ellos. Físicamente estarán en el directorio especificado en el volumen de la máquina anfitriona.
 
{{MRM_Actividad|Title=Pasos a seguir para exportar una imagen|
 
1.- Paramos la imagen
 
<source lang=bash>
 
docker stop nombre_contendor
 
</source>
 
2.- Exportar la imagen
 
<source lang=bash>
 
docker export nombre_contendor -0 nombre.tar
 
</source>
 
*Esto nos creará un fichero con nombre '''''nombre.tar''''' que contendrá la imagen
 
}}
 
;Importar
 
*Se importará una imagen a partir de un fichero tar que la contiene
 
*Una vez importada la imagen podremos crear un contenedor con los parámetros que consideremos.
 
*El contenedor creado, contendrá todos los servicios que tenía el contenedor  a partir del cual se creó la imagen en el fichero tar (contenedor que exportamos previamente).
 
{{MRM_Actividad|Title=Pasos a seguir para importar una imagen|
 
2.- Importar la imagen
 
<source lang=bash>
 
docker import nombre.tar nombre_imagen:tag
 
</source>
 
*Esto nos creará una imagen que la llamamos como consideremos a partir del fichero nombre.tar
 
*Ahora podemos comprobar que tenemos la imagen
 
<source lang=bash>
 
docker images
 
</source>
 
*Ahora podemos crear un contendor, por ejemplo siguiendo con la clase
 
<source lang=bash>
 
docker run --name nombre_contenedor_que_creo -v c:\Users\web:/var/www/html -p 80:80 -dti nombre_imagen:tag
 
</source>
 
}}
 
 
 
*{{Docker/comandosImágenes}}
 
*{{Docker/comandosContenedor}}
 
*{{Docker/volumenesYCopiarContenedorHost}}
 
{{MRM_Web|Title=Docker composer|
 
https://medium.com/@carlos.compains/creando-un-entorno-de-desarrollo-con-docker-a56790af6271
 
}}
 
 
===Dockerfile===
 
<br />
 
{{MRM_Web|Title=Referencia de DockerFile|
 
https://docs.docker.com/engine/reference/builder
 
}}
 
*Hasta ahora hemos creado un '''''contenedor''''' a partir de una '''''imagen''''' usando el comando '''''run'''''
 
*Una vez que tenemos el contenedor le agregamos los servicios que necesitamos
 
*Para no perder el trabajo, de ese contenedor creamos una imagen y ya lo tenemos disponible para crear nuevos contenedores con todos los servicios instalados
 
 
 
 
*Es un '''''fichero de texto''''', que me permite crear '''''una imagen''''' a partir de otra, y añadir una serie de comandos para instalar a esa imagen, aplicaciones, servicios, librerías diversas con el objetivo de construirme una imagen para lanzar un contenedor personalizado a mis necesidades.
 
*Una vez creado el fichero, lo ejecutaremos y crearemos la imagen con el comando '''''buld'''''
 
*Si el fichero está en el directorio actual, lo ejecutaremos con el comando '''''punto'''''
 
*Para ejecutar la máquina ejecutamos
 
<source lang=bash>
 
docker build .
 
</source>
 
;Estructura del fichero
 
<source lang=bash>
 
# comentarios
 
INSTRUCCIONES argumentos
 
</source>
 
En un fichero dockerfile tendremos dos tipos de líneas
 
#comentarios (líneas que empiezan por '''''#''''')
 
#Sentencias líneas que tiene una instrucción con una serie de argumentos para ejecutarlas
 
##Por se recomienda poner las instrucciones en mayúsculas
 
====Instrucciones====
 
;FROM
 
FROM <imagen>
 
FROM <imagen>:<tag>
 
FROM <imagen>@<digest>
 
*
 
*Es la primera instrucción
 
*Especifica la imagen base de la que parte la instalación que queremos hacer
 
* En esta página puedes encontrar imágenes base de las cuales partir (hay miles)
 
*En el FROM se puede especificar de forma opción el tag o digest (sirve para especificar la imagen, como por ejemplo la versión).
 
*Lo primero que tenemos que especificar es la imagen de la que partimos '''''instruccion FROM'''''
 
{{Ejemplo|
 
<source lang=bash>
 
;imagen en base a ubuntu 14.04
 
FROM ubuntu:14.04
 
</source>
 
<source lang=bash>
 
;imagen en base a debian
 
FROM debian:stable
 
 
</source>
 
 
}}
 
;MAINTAINER
 
MAINTAINER <name>
 
*Especifica el autor de la imagen y su correo
 
MAINTAINER Manuel Romero <ManuelRomeroMiguel@gmail.com>
 
;RUN
 
RUN <command>
 
RUN ["ejecutable", "parametro1", "parametro2"]
 
 
*Ejecuta cualquier comando en la imagen que estamos usando. El resultado de la ejecución se puede tomar para el siguiente paso en el dockfile, por ejemplo si ejecuto la instalación de apache, en el siguiente comando puedo contar que apache ya está instalado
 
*Es un comando muy utilizado.
 
*Si usamos apt-get install especificaremos el flag -y para que no haga falta que sea interactivo y tome la decisión por defecto
 
*Añadimos a nuestro fichero las siguientes librerías
 
<source lang=bash>
 
#Ahora empezamos a instalar todos los paquetes necesarios
 
 
==Otros aspectos==
 
*Instalar un contenedor como un servicio
 
https://blog.marcnuri.com/docker-configurando-contenedor-servicio-linux/
 
https://onthedock.github.io/post/170920-autoarranque-de-contenedores/
 
</div>
 

Última revisión de 18:34 27 mar 2024



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  ca-certificates   curl   gnupg-agent  lsb-release

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

  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

4.- Añadimos el repositorio stalbe. Si quieres pañadir uno nightly o test, modifica la palabra estable por el tipo de vesión que desees instalar

 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
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 usermod -a -G docker $USER
  • Cambiamos el grupo de usuarios actual al grupo de usuarios de docker
   newgrp docker
  • Si no funciona, prueba a dar los permisos para conectarte al socket del demonio Docker
sudo chmod 666 /var/run/docker.sock
  • Para ver todos los comando
 docker help
Obtenido de «https://es.wikieducator.org/index.php?title=Usuario:ManuelRomero/ProgramacionWeb/Docker/Conceptos&oldid=30838»