Docker esencial

Instalando paquetes en una imagen

¡Prueba gratis durante 10 días

nuestros 1243 cursos !

Prueba gratis Mostrar modalidades de suscripción
Para empezar a personalizar nuestra imagen, una vez hemos partido de un sistema operativo base, podemos empezar a instalar paquetes para cubrir las dependencias de nuestra aplicación. Deberemos tener en cuenta un par de consideraciones, especialmente cuando usemos una distribución que use una caché de paquetes, como Debian o Ubuntu.

Transcripción

Cuando aprendamos a ejecutar comandos dentro de nuestro Dockerfile para hacer las primeras imágenes, probablemente lo primero que queramos hacer será instalar unos paquetes del repositorio del Linux que estemos usando para agregar alguna función. ¿Cuál será nuestra primera idea? Pues, probablemente, con este comando "RUN" y estando en este Debian 9, si lo que queremos es, por ejemplo, agregar un servidor web para darle esta función lo primero que intentaremos será un "apt-get install". Ojo, un truco, poner siempre "-y", que lo que hace es responder automáticamente como "yes" a todas las preguntas que nos haga "APT", ya que, como no es una instalación interactiva, no nos preguntará a nosotros. No podemos darle al "Intro" mientras se compila el Dockerfile. así que le tendremos que decir que responda "yes" por nosotros "nginx". Probablemente, esto es lo primero que se nos va a ocurrir. Guardamos, salimos... ...ejecutamos. ¿Qué nos encontramos? Que es imposible para "APT" instalar el paquete "nginx", no lo encuentra. No es que nos hayamos equivocado de nombre, no esté en los repositorios o en Debian, si no que encontramos lo siguiente. Si ejecutamos Debian 9 en Docker e intentamos hacerlo a mano, nos encontramos lo mismo. Y, de hecho, si buscamos lo mismo "nginx" que "vim", que muchos otros paquetes, no los vamos a encontrar. ¿Por qué? Porque las imágenes Docker que están en los repositorios intentan ocupar el mínimo espacio posible para que su distribución sea lo más rápido posible y ocupen el menor espacio posible. Por lo tanto, lo que hacen es borrarse todas la cachés. Todas las cachés de los repositorios "APT" están borradas y este Debian no sabe qué es lo que hay en los repositorios. Lo primero que tendríamos que hacer sería un "apt" o "apt-get update". Descargamos la información de los repositorios. Y ahora sí que está "nginx" disponible. Por lo tanto, volvemos, editamos el Dockerfile y seguramente que lo primero que se os ocurra es hacer un "run apt-get update" en la primera línea. ¿Va a funcionar? Sí. ¿Es lo más adecuado? No exactamente. ¿Por qué? Primero, porque con cada uno de los comandos que metemos en nuestro Dockerfile creamos una capa nueva. En principio, eso no es malo, porque nuestros primeros ficheros no van a tener muchísimas capas. Pero es cierto que cuando empecemos a hacer ficheros más complejos podríamos llegar al límite de capas de Docker, que es bastante algo, pero podríamos llegarlo. Y aparte, el rendimiento puede empeorarse un poco si tenemos muchísimas capas. Segundo, un tema de caché. Hay una cosa que hace Docker que es guardar la información de cada una de las capas que genera por separado, y si cuando volvemos a compilar una imagen no ha habido ningún cambio en alguna de las capas intermedias, no la vuelve a generar, se ahorra ese tiempo. Veamos. Os he dicho que iba a funcionar. Así que vamos a probarlo a ver si es verdad. Compilamos. En efecto, hace un update primero, y después se encarga de descargar e instalar todo el "nginx". Ahora sí, ¿cómo vemos lo de la caché? Tenemos nuestra imagen "curso" "nginx" generada. que, como vemos, ya tiene un poquito de diferencia con la imagen que utilizamos de base que es Debian 9, pero se nos ha subido 80 MB. Ahí hay dos cosas. Hay lo que es la instalación de "nginx", y las cachés de "APT". Si nosotros generaramos de nuevo esta imagen, vemos que es instantáneo, ¿por qué? Porque la caché que tenemos de Docker sabe que no ha cambiado ninguna de estas capas y que no es necesario regenerarlo. El problema reside en que, claro, la capa de "apt-get update", Docker no puede saber si hay paquetes nuevos en el repositorio o no. Por defecto, si esa línea no cambia, no la va a ejecutar nunca de nuevo. La capa de "apt-get install nginx", Docker tampoco sabe si "nginx" se ha actualizado o no en los repositorios. Por lo tanto, si nosotros ahora instalamos un software adicional, digamos que vamos a instalar "nginx" y, no sé, "vim", por ejemplo. En principio, no vamos a tener problemas. Vamos a compilar. Nos va a utilizar la capa de "apt-get update" no ha vuelto a hacer el update, y después sí que vuelve a ejecutar la línea de instalar "nginx" y "vim" porque ve que hay cambios en esa línea. La ejecuta de nuevo. En principio, si lo hacemos en el mismo momento, el mismo día que hemos hecho la instalación anterior, no hay ningún problema. Pero si volvemos a reutilizar este Dockerfile y solo cambiamos la línea de "apt-get install", nos encontraremos que podría no poder instalarse un paquete. ¿Por qué? Porque si en el repositorio de Debian que estamos usando cambia la versión de "nginx" que estamos utilizando, cuando "apt-get install" vaya a instalar la versión que tenemos en la caché de "APT", se va a encontrar con que no existe. Así que siempre es importante que en nuestro Dockerfile concatenemos estos comandos en la misma línea, y así nos aseguramos que siempre que vayamos a instalar un software nuevo, o agreguemos paquete nuevo para instalar, se va a hacer de nuevo "apt-get update". Se puede poner, incluso, un poquito más bonito. Si insertamos esta barra invertida que sirve para romper la línea, podemos ver con más facilidad el listado de comandos que estamos ejecutando con un solo "RUN". Guardamos. Compilamos la imagen. Y tenemos un Debian con "nginx". Ahora, si entramos... ...vemos que tenemos el ejecutable en la versión 1.10.3 con OpenSSL 1.1.0e, etc. Por lo tanto, ya hemos aprendido a instalar paquetes adicionales, y sabemos las consideraciones que hay que tener en cuenta dentro de nuestra imagen Docker.

Docker esencial

Descubre lo que te ofrece Docker y aprende a empaquetar aplicaciones junto con todas sus dependencias en un contenedor virtual que podrás ejecutar desde cualquier servidor Linux.

2:18 horas (36 Videos)
Actualmente no hay comentarios.
 
Software:
Fecha de publicación:26/04/2017

Este curso video2brain está disponible como descarga y para ser visualizado online. ¡Pero no hace falta que decidas entre las dos opciones! Al comprar el curso, disfrutarás de ambas posibilidades.

La descarga te permite ver las lecciones sin estar conectado/a a internet y supone una navegación fácil y ágil entre capítulo y capítulo. Si vas a trabajar en diferentes ordenadores o si no quieres descargarte el curso completo, entra en la web con tus datos de acceso y disfruta directamente de tus vídeos online. Te deseamos que disfrutes de este curso y te resulte de mucha utilidad.

Estamos a tu disposición si tienes cualquier tipo de duda o pregunta.