en Podcast

Antes de decir lo que es Docker es casi mejor decir qué hace, que al final es lo que nos interesa.

Docker maneja contenedores aislados que contienen un código determinado. Ese código se independiza de tal forma que hasta permite que el contenedor que lo contiene sea compartido entre diferentes máquinas.

Ahora vamos a lo que no es.

Los contenedores de docker no son máquinas virtuales ya que lo que contiene son piezas de software y no máquinas completas.

Un contenedor de docker es una unidad de software que está autocontenida en el contenedor que contiene todo lo necesario para ejecutar ese código incluyendo código, configuración, procesos, dependencias o red e incluso puede contener la parte del sistema operativo necesaria para ejecutar la aplicación concreta.

Lo primero que necesitamos es instalar docker en nuestro sistema operativo, si es windows o mac tenemos que bajarnos el programa de docker.com y si es linux o bien seguimos las intrucciones de la web de docker o instalamos de los repositorios, de todos modos es bastante sencilla su instalación y no requiere nada en especial.

Una imagen es cualquier fichero que tiene lo suficiente del sistema operativo para hacer lo que necesitamos. Pensad que en una máquina virtual completa instalaríamos todo el sistema operativo, aquí no es necesario con lo que la imagen resultante será más pequeña que una máquina virtual completa.

Para ver las imagenes que tenemos en nuestro sistema, si es que tenemos alguna sería con el comando

Este comando nos va a dar entre otros valores el repositorio, la etiqueta y el ID de la imagen.

El repositorio es de donde viene la imagen, la etiqueta nos indica la versión, es muy probable que veáis como versión latest, y el ID de imagen es el identificativo interno de Docker.

Para referirnos a una imagen podemos hacerlo con el nombre y la etiqueta, o en caso de no tener tendríamos que hacerlo a través del ID de imagen.

Para ejecutar un contenedor usaremos el comando

Donde -ti significa terminal interactive

Y si en otra pantalla en paralelo ponéis

Podréis ver los contenedores que estáis ejecutando. Es importante cuando lo ejecutéis que os deis cuanta que el ID del contenedor no es el mismo ID que el de la imagen, son números diferentes que no se pisan. Una cosa es la imagen y otra el contenedor.

Ahora bien, si ejecutamos un contenedor y luego lo cerramos todos los cambios que hayamos hechos se perderán, así que tenemos que hacer una copia del contenedor en imagen.

Para convertir un contenedor en imagen mientras el contenedor está activo haremos un

Al hacer el commit nos creará una imagen con una etiqueta larguísima, así que habrá que renombrarla por algo más fácil de recordar.

Para borrar una imagen

En este punto ya sabemos arrancar una instancia, pero necesitamos saber como ejecutar algo en un contendor, que al final esa es la razón para la que utilizar contenedor .

El contendor va a parar cuando termine lo que estamos ejecutando, para ello

Poniendo un ejemplo añadiendo comandos al bash como parámetro

También podemos dejar los contenedores corriendo en background, lo que en docker se llama dettach container, en este caso el conenedor correrá hasta que se mate o se salga de él (control +q).

Con control + q el contenedor se quedará corriendo en background, para volver a el tendremos que hacer un

Aquí me gustaría que tuieráis una cosa en cuenta cuando leyerais mucha de la documentación porque lleva a confusión, para hacer un dettach del contenedor en mucha documentación pone que es con control + p , pero realmente es control + q, al menos en Ubuntu que es donde yo siempre lo he usado para hacer pruebas.

Otra cosa es que cuando vais a hacer un docker attach hay que poner el Container_ID que es el número largo, el primero que os da con un docker ps y no el nombre del contenedor, es una tontería pero os podéis tirar un rato ahí intentando ver por qué no os funciona si no sabéis esto.

Ahora vamos a intentar hacer más de una cosa a la vez en el contenedor. Para ello iniciamos con docker run -ti imagen comado y luego añadiremos la segunda consola con docker exec NAMES comando.

Esto desglosado es de la siguiente manera

En este caso hemos utilizado exec para añadir una consola al docker run del principio, para añadir comandos, en este caso hemos añadido también bash.

Si creáis un fichero en una consola lo veréis en la otra obviamente.

Pero claro, cuando ejecutamos algo en docker lo normal no es ejecutar un bash sino algún comando concreto, así que vamos a ejecutar

Esto nos va a dar error porque el comando ouch no existe, así que lo que haremos será

Y nos dirá que el comando no existe:

Ojo que le hemos puesto –name para indicar un nombre al contenedor y no hemos dejado que lo bautice directamente docker.

Para borrar un contenedor poder hacer

y luego

El primero matará el contenedor y el segundo borrará logs y demás, porque si queremos usar el mismo nombre nos dirá que ese contenedor ya existe, aunque no sea así y eso es porque no hemos hecho el rm del mismo.

Por defecto los contenedores pueden usar toda la memoria que tenga el sistema disponible, sin limitación, y claro, no es lo más óptimo, o al menos no es lo ideal.

Podemos limitar la cantidad de memoria asignada a un contenedor de forma similar a como lo haríamos en otro tipo de paravirtualiación como por ejemplo LXC.

Para limitar la memoria usaremos el comando:

En este caso hemos limitado a 200 megas la imagen nginx:latest

Para ver que realmente hemos limitado en otra consola pondremos

Por supuesto también podemos limitar la CPU, y aquí docker nos ofrece dos posibilidades:

  1. Limitar de forma relativa
  2. Limitar de forma absoluta

Limitar de forma relativa significa limitar de forma relativa a otros contenedores y absoluta es en función de la CPU del sistema.

Si usamos la forma relativa

En este caso le hemos dado 1024 acciones (shares) y si tenemos otra máquina con otros 1024 tendrá el 50% de la capacidad, si hubiera 10 todas iguales un 10%, pero si estuvuera con otra que tuviera 2048 entonces tendría un 33%, es decir, depende del total en el sistema, esto es útil para un laboratorio o cosas así.

Para calcular la CPU que se puede utilizar de forma absoluta lo hacemos teniendo en cuenta ciclos de reloj, indicando la quota y el periodo por core, si indicamos que el periodo es 50.000 entonces 25.000 es medio core y hablaríamos del 50% de la CPU, si hubiera 4 cores sería el 12,5% de la CPU, pero el comando el mismo, es decir, es dependiente del hardware.

Vamos a pasar a hablar de la red en docker. Lo primero que tenemos que saber es que Docker tiene su propia red privada dentro del host, realmente se puede dividir esa red en varias de forma no demasiado complicada.

Obviamente podemos asignar contenedores a las redes que queramos dentro del host.

Una de sus funcionalidades, quizás de las más usadas es conectar un puerto externo a uno de docker

Y este chorizo significa ejecuta docker, luego borralo, muy recomendable hacer eso siempre para que no se quede porquería, con terminal interactiva y me mapear el puerto 8080 externo al del contendor 8080, igual con el 8081, llamas al contenedor ubuntu y lo haces a partir de la versión latest de la imagen ubuntu y ejecutas el proceso bash.

Llegados a este punto ya podemos instalar alguna imagen de docker, vamos a empezar con una que seguro que a Ángel de uGeek le hace mucha ilusión, un nextcloud, lo comento porque Ángel es un gran experto en nextcloud y un gran admirador de esta plataforma.

Lo primero será buscar un contenedor de nextcloud, vosotros pensar que casi cualquier cosa que se os ocurra ya existe, lo haremos con el comando docker search

Vamos a instalar nextcloud directamente, no es la que tiene más votos, pero vamos a probar esa misma.

Procedemos a instalar con docker pull

Y ahora arrancamos el contenedor en el puerto 80 y el 443

Y en este caso al abrir la web entráis como admin/admin

De todos modos todos y cada uno de estos contenedores tienen la documentación en hub.docker.com, así que entráis ahí y podréis verlo.

Escribir un comentario

Comentario

  1. Hola Eduardo, me ha gustado el podcast de Docker y este de We Developers hablan tambien de lo mismo con otro enfoque diferente.

    http://www.ivoox.com/we-developers-046-docker-audios-mp3_rf_13727346_1.html

    Por cierto, si yo quiero montar un componente con su imagen iso de cosas que tengo en Windows funcionando. ( mySql, eclipse… etc) lo puedo poner
    en el docker del Linux ? o tiene que ser con el docker instalado en maquina windows? O sea , se pueden cruzar los host con la imagen virtualizada entre sistemas?
    creo que no pero no lo tengo claro.
    gracias

    • Hola,

      El audio es fantástico, me lo escuché esta mañana, mil gracias.

      En cuanto a lo que comentas, a ver, Docker al final es Linux, ¿puedes montar mysql o eclipse? sí, en el audio que me pasas hablan de una chica que incluso dockeriza skype.

      Pero la versión de linux. En Windows sólo puedes correr docker en la versión 2016 server, yo nunca probé en windows, pero es lo que comentan en el audio que me has pasado.

      De todos modos con esto hay que seguir jugando, a ver si publico otro audio al respecto.

      Y mil gracias por el enlace y por comentar claro está 😉