Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/Docker/contenedorVsImagen»
De WikiEducator
(4 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 136: | Línea 136: | ||
docker ps -a | docker ps -a | ||
</source> | </source> | ||
− | |||
</div> | </div> | ||
+ | |||
+ | |||
<div class="slide"> | <div class="slide"> | ||
<!--8------------------------------------------------------> | <!--8------------------------------------------------------> | ||
− | ;Terminal en el contenedor: interactivamente: <span class=resaltado>docker run -ti ..../span> | + | ;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 | *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 | + | *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> | <source lang=bash> | ||
docker run -ti --name web ubuntu:latest | docker run -ti --name web ubuntu:latest | ||
+ | #Da lo mismo escribirlo así | ||
+ | docker run -t -i --name web ubuntu:latest | ||
</source> | </source> | ||
</div> | </div> | ||
− | + | ||
− | + | <!--10------------------------------------------------------> | |
− | < | + | |
− | + | ||
− | + | ||
− | + | ||
<div class="slide"> | <div class="slide"> | ||
====Estableciendo un forward o mapeando puertos==== | ====Estableciendo un forward o mapeando puertos==== | ||
;Situación: | ;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. | *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 | + | *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]] | [[Archivo:Docker_forward_1.png|200px|center]] | ||
</div> | </div> | ||
+ | |||
+ | |||
+ | <!--11------------------------------------------------------> | ||
+ | |||
<div class="slide"> | <div class="slide"> | ||
;Estableciendo un forward o mapeando puertos | ;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. | *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. | *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. | *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]] | [[Archivo:docker_forward_2.png|400px|center]] | ||
</div> | </div> | ||
+ | |||
+ | |||
+ | <!--12------------------------------------------------------> | ||
+ | |||
<div class="slide"> | <div class="slide"> | ||
− | ;Estableciendo un forward o mapeando puertos <span class=resaltado>docker run -p puerto_anfitrion:puerto:docker ...</span> | + | ;Estableciendo un forward o mapeando puertos <br/><span class=resaltado>docker run -p puerto_anfitrion:puerto:docker ...</span> |
<source lang=php> | <source lang=php> | ||
#Primero borramos el docker que teníamos | #Primero borramos el docker que teníamos | ||
docker rm web | docker rm web | ||
#Lo volvemos a crear, mapeando puertos | #Lo volvemos a crear, mapeando puertos | ||
− | docker run -ti -p 8080:80 --name web ubuntu: | + | docker run -ti -p 8080:80 --name web ubuntu:latest |
</source> | </source> | ||
</div> | </div> | ||
+ | |||
+ | <!--13------------------------------------------------------> | ||
+ | |||
<div class="slide"> | <div class="slide"> | ||
====Compartiendo carpetas entre anfitrión y docker==== | ====Compartiendo carpetas entre anfitrión y docker==== | ||
Línea 184: | Línea 206: | ||
*Esos recursos van a ser programas de php que escribiremos | *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 | *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> | </div> | ||
+ | |||
+ | <!--13------------------------------------------------------> | ||
+ | |||
<div class="slide"> | <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 | ;Compartiendo carpetas entre anfitrión y docker | ||
*Vamos a crear una carpeta compartida entre anfitrión y contenedor | *Vamos a crear una carpeta compartida entre anfitrión y contenedor | ||
Línea 194: | Línea 226: | ||
[[Archivo:docker_compartir_carpeta_2.png|400px|center]] | [[Archivo:docker_compartir_carpeta_2.png|400px|center]] | ||
</div> | </div> | ||
+ | |||
+ | |||
+ | <!--15------------------------------------------------------> | ||
+ | |||
<div class="slide"> | <div class="slide"> | ||
− | ;Estableciendo un forward o mapeando puertos <span class=resaltado>docker run -v dir/anfitrion:/dir/contenedor ...</span> | + | ;Estableciendo un forward o mapeando puertos <br /><span class=resaltado>docker run -v dir/anfitrion:/dir/contenedor ...</span> |
<source lang=php> | <source lang=php> | ||
#Primero borramos el docker que teníamos | #Primero borramos el docker que teníamos | ||
Línea 202: | Línea 238: | ||
docker run -ti -p 8080:80 -v /home/user/docker:/var/www/html --name web ubuntu:latest</span> | docker run -ti -p 8080:80 -v /home/user/docker:/var/www/html --name web ubuntu:latest</span> | ||
</source> | </source> | ||
+ | </div> | ||
+ | |||
+ | |||
+ | <!--15------------------------------------------------------> | ||
+ | |||
+ | <div class="slide"> | ||
+ | ;Estableciendo un forward o mapeando puertos | ||
{{nota| | {{nota| | ||
*Se creará un directorio en local según especificquemos | *Se creará un directorio en local según especificquemos | ||
Línea 210: | Línea 253: | ||
</div> | </div> | ||
+ | <!--16------------------------------------------------------> | ||
<div class="slide"> | <div class="slide"> | ||
Línea 221: | Línea 265: | ||
</source> | </source> | ||
</div> | </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}} | ||
+ | |||
+ | ===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 04:39 8 nov 2022