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

De WikiEducator
Saltar a: navegación, buscar
(Contenedor Vs Imagen)
 
(65 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
{{Usuario:ManuelRomero/ProgramacionWeb/Docker/nav}}
 
{{Usuario:ManuelRomero/ProgramacionWeb/Docker/nav}}
 +
{{TOC}}
  
 +
<br>
 +
{{#widget:Slides}}
 +
<div class="slides layout-regular template-default">
 +
 +
 +
<!--1------------------------------------------------------>
 +
<div class="slide">
 
===Contenedor Vs Imagen===
 
===Contenedor Vs Imagen===
*Este es un concepto importante que puede quedar claro si vemos la imagen anterior
+
<font color=blue>
*La imagen es el fichero que nos va a permir instalar esta '''especie de máquina virtual'''.
+
*Estos conceptos son la base para utilizar '''''docker'''''.
*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.
+
</font>
*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.
+
[[archivo:contenedor_vs_imagen.png|600px|center]]
*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.
+
</div>
*Tenemos diferentes formas de crear un contenedor a partir de una imagen:
+
 
#comando '''''run'''''
+
<!--2------------------------------------------------------>
#fichero '''''yml''''' con '''''docker-composer '''''
+
<div class="slide">
*A continuación veremos las dos formas
+
;La imagen
[[Archivo:creacion_conenedor_1.png]]
+
*<span class=resaltado>La imagen</span> es el fichero que nos va a permitir instalar esta '''especie de máquina virtual'''.  
 +
*No se emula hardware, sino solo servicios (software: sistema de ficheros, sistema operativo y servicios), por lo que un conetenedor '''''no es una máquina''''', aunque sí que tenga una ip. Sí que se puede ver como un dispositivo o nodo de la red independiente.
 +
*Podríamos hacer una comparación con la '''iso''' para instalar el sistema operativo, pero ''solo para tener una idea, ya que el concepto es diferente''.
 +
</div>
 +
 
 +
<!--3------------------------------------------------------>
 +
<div class="slide">
 +
;El contenedor
 +
*<span class=resaltado>El contenedor</span> 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.
 +
*En realidad el contenedor almacena los cambios que haya sobre la imagen y todo va siendo pequeños incrementos  sobre un fichero base, lo que se vuelve un sistema muy robusto, ágil y ligero.
 +
</div>
 +
 
 +
<!--4------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
<font color=blue>
 +
;Contenedor Vs Imagen
 +
</font>
 +
*También, 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.  
 +
[[Archivo:contenedor_vs_imagen_1.png]]
 +
</div>
 +
 
 +
<!--5------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
===Crear un contenedor===
 +
*Hay varias formas de crear un contenedor, y vamos poco a poco a aprenderlas según vayamos necesitando
 +
{{MRM_Puntos clave|Title= Crear un contenedor|
 +
;Siempre a partir de una imagen
 +
}}
 +
 
 +
</div>
 +
<!--6------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
 
 +
*Lo primero que tendremos que hacer es descargar una imagen.
 +
{{Nota|El nombre de las imágenes y de los contenedores consta de '''''nombre:tag'''''}}
 +
<source lang=bash>
 +
docker pull ubuntu:latest
 +
</source>
 +
{{Nota|Cuando creamos un contenedor (siempre a partir de una imagen), si esta no existe en local, intentará localizarla en la nube y la descargará, por lo que no necesitaremos hacer un '''''pull''''' de la misma
 +
}}
 +
</div>
 +
<!--7------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
 
 +
;<span class=resaltado>docker run</span>
 +
*Permite crear y arrancar un contenedor
 +
*En realidad ejecuta un comando en un '''''nuevo  contenedor''''', por lo tanto lo crea.
 +
 
 +
[[Archivo:creacion_conenedor_1.png|800px|center]]
 +
</div>
 +
 
 +
 
 +
<div class="slide">
 +
<!--8------------------------------------------------------>
 +
 
 +
;Creando  un contenedor a partir de una imagen del repositorio <br />
 +
*Vamos a crear un contenedor a partir de la imagen <span class=resaltado>'''''ubuntu:latest''''';</span><br />
 +
*Existe un repositorio de imágenes en la nube donde el comando docker va a ir a buscarlas cuando las necesite '''''https://hub.docker.com/'''''.
 +
*Podemos registrarnos, como en '''''git'''''', y aportar las imágenes que creemos (lo veremos a continuación)
 +
<source lang=bash>
 +
docker run ubuntu:latest
 +
</source>
 +
{{nota|Este comando habrá creado un contenedor}}
 +
</div>
 +
 
 +
 
 +
<div class="slide">
 +
<!--9------------------------------------------------------>
 +
 
 +
;Ver todos los contenedores <span class=resaltado>docker ps -a</span>
 +
*Podemos ver todos los contenedores
 +
<source lang=bash>
 +
docker ps -a
 +
</source>
 +
*Si no damos la opción '''''-a''''' solo se visualziarán los contenedores activos
 +
 
 +
</div>
 +
<div class="slide">
 +
<!--10------------------------------------------------------>
 +
 
 +
;Borrando un contenedor: <span class=resaltado>docker rm</span>
 +
*Como el contenedor tiene un nombre que el sistema le ha dado, vamos a borrarlo y crear otro asignando un nombre
 +
<source lang=bash>
 +
docker rm <nombre_del_contenedor>
 +
</source>
 +
</div>
 +
<div class="slide">
 +
<!--10------------------------------------------------------>
 +
 
 +
;Borrando una imagen: <span class=resaltado>docker rmi</span>
 +
*Igualmente podríamos elminar una imagen de nuestro sistema.
 +
{{Nota|Si existe algún contenedor que dependa de esa imagen, no se podrá borrar}}
 +
<source lang=bash>
 +
docker rmi <nombre_de_la_imagen>
 +
</source>
 +
;Para ver los nombres de las imágenes en mi sistema (actualmente descargados)
 +
<source lang=bash>
 +
docker images
 +
</source>
 +
 
 +
</div>
 +
<div class="slide">
 +
<!--11----------------------------------------------------->
 +
 
 +
;Crear un contenedor asignando el nombre:  <span class=resaltado>docker run  --name nombre</span>
 +
<source lang=bash>
 +
docker run --name web ubuntu:latest
 +
</source>
 +
*Lo visualizamos
 +
<source lang=bash>
 +
docker ps -a
 +
</source>
 +
</div>
 +
 
 +
 
 +
<div class="slide">
 +
<!--8------------------------------------------------------>
 +
;Terminal en el contenedor: interactivamente:  <span class=resaltado>docker run -ti ....</span>
 +
*Con el contenedor creado previamente podemos ejectura acciones, pero si queremos interactuar con él, debemos de permitir abrir un terminal y establecer interacción
 +
*Para ello hemos de aportar el parámetro '''''-t''''' para poder abrir terminal y '''''-i''''' para interactuar, lo podemos escribir junto o separado
 +
<source lang=bash>
 +
docker run -ti --name web ubuntu:latest
 +
#Da lo mismo escribirlo así
 +
docker run -t -i --name web ubuntu:latest
 +
</source>
 +
</div>
 +
 
 +
 
 +
<!--10------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
====Estableciendo un forward o mapeando puertos====
 +
;Situación:
 +
*Ahora tenemos un docker. Podremos acceder a él a través de la ip, ya que se ha creado una red interna entre el anfitrión y el contenedor.
 +
*La configuración de la red, se puede establecer, en linux, por defecto suele empezar con la red '''''172.17.0.0''''', por lo que se crea la siguiente situación (imagen siguiente).
 +
</div>
 +
<div class="slide">
 +
;Estableciendo un forward o mapeando puertos
 +
 +
[[Archivo:Docker_forward_1.png|200px|center]]
 +
</div>
 +
 
 +
 
 +
<!--11------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
;Estableciendo un forward o mapeando puertos
 +
*Si en el docker tenemos instalado un servidor web, como va a ser nuestro caso, y queremos que atienda nuestras solicitudes, sería fácil acceder a él a través de la ip.
 +
*Pero se presenta un problema en sistema windows y si queremos acceder a nuestro docker, desde otra máquina, ya que la red es interna, y en windows no se permite acceder al docker por ip.
 +
</div>
 +
 
 +
 
 +
<!--11------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
 
 +
;Estableciendo un forward o mapeando puertos
 +
*La solución es mapear o realizar un fordward de puertos, de modo que estableceremos un puerto en nuestro anfitrión (el valor que queramos asignar por encima del 1024) que mapearemos al puerto 80 o 443 de nuestro docker, de manera que todas las solicitudes que reciba nuestro anfitrión se redirigan al servidor web del docker.
 +
[[Archivo:docker_forward_2.png|400px|center]]
 +
</div>
 +
 
 +
 
 +
<!--12------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
;Estableciendo un forward o mapeando puertos <br/><span class=resaltado>docker run -p puerto_anfitrion:puerto:docker ...</span>
 +
<source lang=php>
 +
#Primero borramos el docker que teníamos
 +
docker rm web
 +
#Lo volvemos a crear, mapeando puertos
 +
docker run -ti -p 8080:80  --name web ubuntu:latest
 +
</source>
 +
</div>
 +
 
 +
<!--13------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
====Compartiendo carpetas entre anfitrión y docker====
 +
;Situación:
 +
*Ahora ocurre que el apache de docker va a ejecutar recursos que vamos a debemos tener almacenados en el docker
 +
*Esos recursos van a ser programas de php que escribiremos
 +
*Usaremos un EDI, por ejemplo phpstorm, para crear dichos recursos, pero el EDI, no lo vamos a ejectuar dentro del docker, sino en nuestra máquina anfitriona
 +
</div>
 +
 
 +
<!--13------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
;Compartiendo carpetas entre anfitrión y docker
 +
 
 +
[[Archivo:docker_compartir_carpeta_1.png|250px|center]]
 +
</div>
 +
 
 +
 
 +
<!--14------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
;Compartiendo carpetas entre anfitrión y docker
 +
*Vamos a crear una carpeta compartida entre anfitrión y contenedor
 +
*De forma que todo lo que haya en esa carpeta y creemos en el anfitrión, estará disponible en el contenedor
 +
*La acción es bidireccional, todo lo que haya y creemos en el contenedor, estará disponible en el anfitrión
 +
[[Archivo:docker_compartir_carpeta_2.png|400px|center]]
 +
</div>
 +
 
 +
 
 +
<!--15------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
;Estableciendo un forward o mapeando puertos <br /><span class=resaltado>docker run -v dir/anfitrion:/dir/contenedor ...</span>
 +
<source lang=php>
 +
#Primero borramos el docker que teníamos
 +
docker rm web
 +
#Lo volvemos a crear, mapeando puertos
 +
docker run -ti -p 8080:80  -v /home/user/docker:/var/www/html --name web ubuntu:latest</span>
 +
</source>
 +
</div>
 +
 
 +
 
 +
<!--15------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
;Estableciendo un forward o mapeando puertos
 +
{{nota|
 +
*Se creará un directorio en local según especificquemos
 +
*Si trabajamos en linux, el directorio lo habrá creado docker, y por lo tanto será propiedad de root (hay que cambiar permisos)
 +
*En windows no existe esta circunstancia
 +
*Ahora ya podemos crear los proyectos con nuestro edi, y el apache del docker los encontrará para ejecutarlos
 +
}}
 +
</div>
 +
 
 +
<!--16------------------------------------------------------>
 +
 
 +
<div class="slide">
 +
*Vamos a instalar en el contenedor los paquetes que necesito para nuestra arquitectura web:
 +
;Apache
 +
;PHP
 +
;xdebug
 +
*Para ello vamos a la sección de instalación del sistem y realizamos las instalaciones correspondientes
 +
<source lang=bash>
 +
docker run -ti --name web ubuntu:latest
 +
</source>
 +
</div>
 +
 
 +
 
 +
 
 +
 
 +
<!--
 +
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 />
 +
 
 +
</div>
 +
<div class="slide">
 +
:1.- comando '''''run''''':ej. Descargar una imagen llamada '''''ubuntu:latest'''''  
 +
 
 +
:2.-#fichero '''''yml''''' con '''''docker-composer '''''.
 +
docker-composer up
 +
</div>
 +
<div class="slide">
 +
 
 +
====Obtener o Crear una Imagen====
 +
*Para obtener una imagen, la podemos descargar de la nube o bien construirla a partir de otra imagen o de un contenedor:
 +
# '''''pull''''' para abtener una imagel
 +
# Fichero '''''Dockerfile'''' con el comando '''''build''''' para construir a partir de otra imagen
 +
<source lang=bash>
 +
docker build .
 +
</source>
 +
# Comando '''''commit''''' a partir de un contenedor con todo lo que tenga instalado
 +
<source lang=bash>
 +
docker commit contenedor:v1 - .
 +
</source>
 +
 
 +
# Comando '''''import''''' a partir de un fichero '''tar''' previamente creado de un contenedor con el comando '''''export''''',
 +
<source lang=bash>
 +
docker export contenedor.tar
 +
</source>
 +
 
 +
</div>
 +
<div class="slide">
 +
[[Archivo:imagen_contenedor_2.png]]
 +
</div>
 +
<div class="slide">
 +
 
 +
 
 +
</div>
 +
 
 
*{{Docker/Registro}}
 
*{{Docker/Registro}}
  
Línea 228: Línea 524:
 
  https://onthedock.github.io/post/170920-autoarranque-de-contenedores/
 
  https://onthedock.github.io/post/170920-autoarranque-de-contenedores/
 
</div>
 
</div>
 +
-->

Última revisión de 04:39 8 nov 2022




Contenedor Vs Imagen

  • Estos conceptos son la base para utilizar docker.

Contenedor vs imagen.png
La imagen
  • La imagen es el fichero que nos va a permitir instalar esta especie de máquina virtual.
  • No se emula hardware, sino solo servicios (software: sistema de ficheros, sistema operativo y servicios), por lo que un conetenedor no es una máquina, aunque sí que tenga una ip. Sí que se puede ver como un dispositivo o nodo de la red independiente.
  • Podríamos 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
  • 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.
  • En realidad el contenedor almacena los cambios que haya sobre la imagen y todo va siendo pequeños incrementos sobre un fichero base, lo que se vuelve un sistema muy robusto, ágil y ligero.


Contenedor Vs Imagen

  • También, 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.

Contenedor vs imagen 1.png


Crear un contenedor

  • Hay varias formas de crear un contenedor, y vamos poco a poco a aprenderlas según vayamos necesitando


Icon key points.gif

Crear un contenedor

Siempre a partir de una imagen



  • Lo primero que tendremos que hacer es descargar una imagen.

(Comment.gif: El nombre de las imágenes y de los contenedores consta de nombre:tag)


 docker pull ubuntu:latest

(Comment.gif: Cuando creamos un contenedor (siempre a partir de una imagen), si esta no existe en local, intentará localizarla en la nube y la descargará, por lo que no necesitaremos hacer un pull de la misma )


docker run
  • Permite crear y arrancar un contenedor
  • En realidad ejecuta un comando en un nuevo contenedor, por lo tanto lo crea.
Creacion conenedor 1.png


Creando un contenedor a partir de una imagen del repositorio
  • Vamos a crear un contenedor a partir de la imagen ubuntu:latest;
  • Existe un repositorio de imágenes en la nube donde el comando docker va a ir a buscarlas cuando las necesite https://hub.docker.com/.
  • Podemos registrarnos, como en git', y aportar las imágenes que creemos (lo veremos a continuación)
docker run ubuntu:latest

(Comment.gif: Este comando habrá creado un contenedor)



Ver todos los contenedores docker ps -a
  • Podemos ver todos los contenedores
docker ps -a
  • Si no damos la opción -a solo se visualziarán los contenedores activos
Borrando un contenedor
docker rm
  • Como el contenedor tiene un nombre que el sistema le ha dado, vamos a borrarlo y crear otro asignando un nombre
docker rm <nombre_del_contenedor>
Borrando una imagen
docker rmi
  • Igualmente podríamos elminar una imagen de nuestro sistema.

(Comment.gif: Si existe algún contenedor que dependa de esa imagen, no se podrá borrar)


docker rmi <nombre_de_la_imagen>
Para ver los nombres de las imágenes en mi sistema (actualmente descargados)
docker images
Crear un contenedor asignando el nombre
docker run --name nombre
docker run --name web ubuntu:latest
  • Lo visualizamos
docker ps -a


Terminal en el contenedor
interactivamente: docker run -ti ....
  • Con el contenedor creado previamente podemos ejectura acciones, pero si queremos interactuar con él, debemos de permitir abrir un terminal y establecer interacción
  • Para ello hemos de aportar el parámetro -t para poder abrir terminal y -i para interactuar, lo podemos escribir junto o separado
docker run -ti --name web ubuntu:latest
#Da lo mismo escribirlo así
docker run -t -i --name web ubuntu:latest


Estableciendo un forward o mapeando puertos

Situación
  • Ahora tenemos un docker. Podremos acceder a él a través de la ip, ya que se ha creado una red interna entre el anfitrión y el contenedor.
  • La configuración de la red, se puede establecer, en linux, por defecto suele empezar con la red 172.17.0.0, por lo que se crea la siguiente situación (imagen siguiente).
Estableciendo un forward o mapeando puertos
Docker forward 1.png


Estableciendo un forward o mapeando puertos
  • Si en el docker tenemos instalado un servidor web, como va a ser nuestro caso, y queremos que atienda nuestras solicitudes, sería fácil acceder a él a través de la ip.
  • Pero se presenta un problema en sistema windows y si queremos acceder a nuestro docker, desde otra máquina, ya que la red es interna, y en windows no se permite acceder al docker por ip.


Estableciendo un forward o mapeando puertos
  • La solución es mapear o realizar un fordward de puertos, de modo que estableceremos un puerto en nuestro anfitrión (el valor que queramos asignar por encima del 1024) que mapearemos al puerto 80 o 443 de nuestro docker, de manera que todas las solicitudes que reciba nuestro anfitrión se redirigan al servidor web del docker.
Docker forward 2.png


Estableciendo un forward o mapeando puertos
docker run -p puerto_anfitrion:puerto:docker ...
#Primero borramos el docker que teníamos
docker rm web
#Lo volvemos a crear, mapeando puertos
docker run -ti -p 8080:80  --name web ubuntu:latest


Compartiendo carpetas entre anfitrión y docker

Situación
  • Ahora ocurre que el apache de docker va a ejecutar recursos que vamos a debemos tener almacenados en el docker
  • Esos recursos van a ser programas de php que escribiremos
  • Usaremos un EDI, por ejemplo phpstorm, para crear dichos recursos, pero el EDI, no lo vamos a ejectuar dentro del docker, sino en nuestra máquina anfitriona


Compartiendo carpetas entre anfitrión y docker
Docker compartir carpeta 1.png


Compartiendo carpetas entre anfitrión y docker
  • Vamos a crear una carpeta compartida entre anfitrión y contenedor
  • De forma que todo lo que haya en esa carpeta y creemos en el anfitrión, estará disponible en el contenedor
  • La acción es bidireccional, todo lo que haya y creemos en el contenedor, estará disponible en el anfitrión
Docker compartir carpeta 2.png


Estableciendo un forward o mapeando puertos
docker run -v dir/anfitrion:/dir/contenedor ...
#Primero borramos el docker que teníamos
docker rm web
#Lo volvemos a crear, mapeando puertos
docker run -ti -p 8080:80  -v /home/user/docker:/var/www/html --name web ubuntu:latest</span>


Estableciendo un forward o mapeando puertos

(Comment.gif:

  • Se creará un directorio en local según especificquemos
  • Si trabajamos en linux, el directorio lo habrá creado docker, y por lo tanto será propiedad de root (hay que cambiar permisos)
  • En windows no existe esta circunstancia
  • Ahora ya podemos crear los proyectos con nuestro edi, y el apache del docker los encontrará para ejecutarlos

)



  • Vamos a instalar en el contenedor los paquetes que necesito para nuestra arquitectura web:
Apache
PHP
xdebug
  • Para ello vamos a la sección de instalación del sistem y realizamos las instalaciones correspondientes
docker run -ti --name web ubuntu:latest