Docker: conceptos principales y tutorial paso a paso

por:

Virtualización con Docker primeros pasos

Hoy queremos hablaros de Docker un proyecto que cada día es más usado, porque permite desplegar programas en contenedores de software.

¿Qué es y cómo funciona Docker?

Como hemos comentado, Docker es un proyecto Open Source creado y liderado por Solomon Hykes que afronta el problema de la virtualización de servicios y programas. Este tema es muy importante, ya que se busca aprovechar al máximo el recurso disponible (un servidor) para ejecutar los servicios que necesitemos.

El funcionamiento de Docker es distinto a los métodos más comunes que se han utilizado anteriormente, ya que no necesita un sistema operativo invitado para ejecutar sobre él los servicios, sino que lo hace sin este intermediario. Esta tecnología se denomina de contenedores, siendo un contenedor un programa, servicio o sistema que queremos desplegar. Esta arquitectura se puede ver en la siguiente ilustración:

Contenedores de Docker

Al no utilizar máquinas virtuales es capaz de conseguir un mayor rendimiento, ya que el consumo de recursos es menor. Sin embargo, gracias al uso del kernel de Linux es capaz de aislar cada contenedor. Esta decisión también aporta otras características como una mayor seguridad (gracias a estar aislados) o un despliegue más rápido de los recursos.

Conceptos básicos de Docker

Bajo el siguiente epígrafe se van a describir algunos de los conceptos básicos para empezar a trabajar con Docker, sin perderse en los tecnicismos.

¿Qué es una imágen?

Una imagen representa una plantilla, donde se definen el sistema operativo origen (Alpine, Ubuntu…) y el conjunto de programas, librerías, otros softwares, configuraciones, etc. que tendrán que estar disponibles.

¿Qué es un contenedor?

Un contenedor es una instancia de una imagen. Las imágenes al ser plantillas no se pueden arrancar, parar, reiniciar, etc; los contenedores sí. Los contenedores al estar arrancados pueden modificar su estado, mientras que una misma imagen siempre es igual en varios ordenadores, un contenedor puede que no.

¿Qué es Docker compose?

Docker compose es una utilidad que nos permite gestionar varios contenedores, formando un grupo de recursos. Lo que permite que compartan otros recursos, puertos, archivos, etc. Una explicación más detallada, se encuentra en la guía que hicimos de docker-compose

¿Qué es un orquestador de contenedores?

Un orquestador de contenedores, es un software que permite gestionar un conjunto de contenedores de manera sencilla, permitiendo en la mayoría de los casos:

  • La gestión de contenedores en entornos distribuidos
  • El balanceo de carga entre los contenedores
  • Levantar un número variable de réplicas, así como escalado automático
  • Comprobación del estado de los contenedores

¿Qué es Docker Swarm? ¿Qué es Kubernetes?

Ambos son orquestadores, el primero es la propuesta de Docker y el segundo la de Google. Kubernetes se ha convertido en el estándar de facto, quedando docker swarm relegado a cuestiones más educativas, que relacionadas con entornos productivos.

Docker Community Edition (CE) vs Enterprise Edition (EE)

Al instalar Docker, seguramente habréis visto que hay distintas ediciones. La versión CE es la versión gratuita en la que se basa este artículo y que contiene todo lo necesario para trabajar con contenedores. Sin embargo, Docker inc., la empresa creadora de esta tecnología, ha creado una versión de pago EE. Esta proporciona mayor seguridad y algunas utilidades para gestionar imágenes y desplegar mediante orquestadores.

¿Cómo funciona docker para Windows?

Al ser una herramienta creada y pensada puramente para entornos Linux, en Windows se requiere usar Hyper-V. Debido a que el comportamiento se basa en crear una máquina virtual Linux, que ejecutará el servicio de Docker y al que se conectará la versión para Windows. Por lo que no es nativo, como en Linux. Con la nueva versión de Windows, esto ha cambiado un poco, para la información más actualizada, visita ¿Cómo usar Docker en Windows?

¿Qué es Docker Hub?

Docker Hub es un repositorio de imágenes para Docker, en él podemos encontrar gran cantidad de imágenes con el software más popular listo para ser ejecutado. Sería similar a un conjunto de máquinas virtuales ya listas, que nosotros en virtual box bajaríamos e importaríamos. Pero en este caso, como ya se ha comentado, no es necesario que a todo software le acompañe un sistema operativo, sino que podemos tener imágenes con un programa como nginx o MySQL. Haciendo un símil, Docker Hub es a las imágenes lo que GitHub al código fuente.

Docker hub el repositorio de imágenes de docker

Uso de Docker

En este apartado podrás ver cómo se usa, quién lo utiliza y para qué, llegando a tener un conocimiento global sobre esta herramienta.

¿Quién usa Docker?

Muchos se preguntarán, bueno esto parece todo muy bonito, pero realmente se usa o es algo complejo y que no compensa utilizarlo. La respuesta es bastante clara, lo usan los principales proveedores de computación en la nube: Amazon Web Services, Google Cloud Platform, IBM Bluemix, Microsoft Azure y cada vez más compañías y desarrolladores, al ser una herramienta transversal. Si quieres ser como ellos, sigue leyendo este tutorial como Docker, te cambiará la vida.

¿Por qué usar Docker?

Docker aporta muchas cosas positivas para distintos roles:

  • Para los desarrolladores, facilita la instalación del entorno de desarrollo y herramientas requeridas.
  • Para QA asegura que lo que ellos prueban, es lo que irá a producción.
  • Para sistemas garantiza que siempre estarán las dependencias disponibles.
  • Para DevOps mejora y agiliza los procesos de despliegue continuo.

Si quieres conocer más información de por qué usarlo, te invito a visitar el siguiente artículo sobre qué opinan los desarrolladores sobre Docker. Además, aprender Docker es una manera de mejorar tu perfil profesional.

¿Cómo instalar Docker?

Docker está disponible para los principales sistemas operativos, en mi caso he usado Ubuntu y os dejo los pasos que debéis seguir, para otros sistemas visitad su manual de instalación.

 

sudo apt-get install apt-transport-https ca-certificates
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
sudo echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" >> /etc/apt/sources.list
sudo apt-get update
sudo apt-get purge lxc-docker
sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
sudo apt-get install docker-engine
sudo service docker start
sudo docker run hello-world

Estos comandos lo que van a hacer es añadir el repositorio de Docker, instalarlo, arrancarlo y probar que todo funciona correctamente. El resultado de la ejecución será el siguiente:

Docker instalado correctamente y ejecutando nuestro primer contenedor

Como se puede ver en la explicación, Docker ha contactado con su sistemas de virtualización, ha bajado la imagen “hello-word” del Docker Hub, ha creado un nuevo contenedor, ha iniciado la imagen y ha mostrado el resultado de la ejecución mediante la terminal.

¿Cómo empezar? Primeros pasos con Docker

Bajo la siguiente sección te presento algunos ejemplos de uso muy fáciles para comenzar a aprender Docker de manera práctica.

Ejecutando Debian en un contenedor

Para el ejemplo práctico, vamos a instalar Debian (una de las distribuciones Linux más ligeras) en un contenedor de Docker. Para ello lo primero es buscar las imágenes disponibles de Debian:

Buscar imágenes de Debian en Docker

Como podemos ver hay muchas, en nuestro caso vamos a utilizar la imagen oficial:

Instalar Debian en Docker

Con ese comando ya hemos bajado una imagen de Debian destinada a ser ejecutada en un contenedor.

Ahora vamos a proceder a ejecutar una serie de comandos en nuestro Debian, para ello iniciamos su contenedor y le pasamos como argumento lo que queremos que ejecute:
Docker ejecutando Debian

En la imagen superior podemos ver cómo nuestro Debian es la versión 8. Este es el primer ejemplo de uso de Docker, al final del artículo os dejamos un tutorial completo de Docker.

Ejecuntado Nginx en un contenedor

Si en lugar de querer ejecutar un Debian completo, sólo necesitamos un servidor web como Nginx podemos ejecutarlo de la siguiente manera:

Docker ejecutando Nginx en un contenedor y sirviendo una página

Lo primero que hago es crear un fichero (index.html) de prueba con el texto “Hola Binarios”, luego mando a Docker que me ejecute un contenedor de Nginx:

  • Con -d indico que la ejecución va a ser autónoma, es decir que no pare de ejecutarse.
  • Con -p le digo que quiero reenviar la información que Nginx va a servir por el puerto 80 al 8888, ya que en mi ordenador el puerto 80 ya está ocupado.
  • Con -v le señalo la carpeta donde están los archivos que quiero que sean servidos y los permisos que tienen.

Finalmente descargo con curl el contenido de la página que se está sirviendo Nginx y muestra el contenido. Esto funciona ya que por defecto si hay múltiples archivos en una carpeta, Nginx sirve el que se llame index.html.

Ahora vamos a modificar el archivo index.html y veremos como el contenido que sirve Nginx es el actualizado:

El contenedor de Nginx el cual sirve contenido actualizado

¿Cómo usar Docker fácilmente?

Si has llegado hasta aquí, seguramente tendrás ya varios contenedores ejecutándose. En este punto, empezarás a ver como la cli se queda un poco corta y necesitas otra manera que te permita gestionar el conjunto de contenedores y no ir uno por uno. A continuación te presento dos modos muy sencillos de gestionarlo, tanto con interfaz gráfica como vía terminal.

¿Cómo gestionar Docker con interfaz gráfica?

Muchos se preguntarán si la única manera de realizar la gestión de Docker es mediante la terminal, la respuesta es que también se puede utilizar una interfaz gráfica, la cuál puede también ser desplegada como otro contenedor de Docker. El panel de control gráfico de referencia, es el ofrecido por portainer. Para iniciar el contenedor tienes que ejecutar el siguiente comando:

docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

Ahora solo tienes que entrar con tu navegador a http://localhost:9000 y verás una pantalla principal donde con un simple vistazo, podrás conocer el estado de toda tu infraestructura Docker

Interfaz gráfica principal para conocer todos los datos de tu infraestructura Docker

Gestionando múltiples contenedores desde la línea de comandos

Si prefieres utilizar la consola para gestionar tus contenedores, seguramente te sea muy útil aprovechar Ctop, un gestor en consola que simplifica mucho el trabajo con contenedores. En el enlaza anterior, puedes ver un artículo más detallado de su uso y las características que ofrece.

Tutorial de Docker paso a paso

Finalmente, si quieres aprender los conceptos principales, empezando desde 0, te dejo los recursos del taller que impartí.

El código se encuentra en mi repositorio del taller, en él veras ejemplos con las cuestiones básicas, los comandos a ejecutar y lo que quieren transmitir cada caso. Además hay dos ejercicios, el 7 y 9 cuyas soluciones están en las ramas day1solution y day2solution, respectivamente, para poner a prueba tus conocimientos.

A continuación, os dejo la presentación. Si podéis, abrirla en Power Point online, para poder ver las notas de cada diapositiva, ya que hay enlaces muy útiles.

Para practicar lo aprendido, puedes usar Katacoda, una plataforma que se enfoca en enseñar tecnología con ejemplos reales e interactivos, ya que ofrece multitud de cursos sobre contenedores y Docker. Para realizarlos, no necesitas instalar nada, ya que todo se realiza desde el navegador. Así que, no tienes excusas para no empezar con alguno de estos cursos:

cursos de docker disponibles en katacoda

¿Cómo escribir buenos Dockerfile?

Los ficheros de configuración, como el código fuente, admiten multitud de variaciones que consiguen resultados muy similares. Sin embargo, hay un conjunto de buenas prácticas que te permitirán conseguir imágenes seguras y con una configuración modular, entendible y óptima.

Mejorando la seguridad de un contenedor

Uno de los principales problemas a la hora de utilizar Docker en producción, es cómo gestionar la seguridad. Para ello de serie ya contamos con algunas herramientas y utilidades como Docker secrets, para evitar gestionar datos críticos como contraseñas en texto plano. Sin embargo, esto no es suficiente ya que pueden existir problemas de seguridad en los paquetes y bibliotecas que se utilicen dentro del contenedor.

Para evitar lo anterior, se necesitaría contar con un software que permitiera analizar la propia imagen desde dentro, conocimiento las versiones de los paquetes, bibliotecas y utilidades que lo contienen, así como las distintas imágenes en las que se basa nuesta imagen analizada. Justamente eso es lo que nos permite hacer Trivy, por lo que os recomiendo encarecidamente que lo añadáis como una etapa más a vuestro flujo de trabajo de generación de imágenes docker.

Validador de Dockerfile

Como hemos comentado, hay varias maneras de escribir un fichero Dockerfile, pero no todas son iguales de correctas. Algunas implican pérdida de rendimiento, otras problemas de seguridad, etc. Por ello, lo mejor es contar con una herramienta como Hadolint que analice nuestro fichero de configuración y vea si cumplimos con un conjunto de reglas, las denominadas buenas prácticas.

Un ejemplo de buena práctica es utilizar variables de entorno, en lugar de valores hardcodeados en el Dockefile, otra buena práctica es incluir esta validación en los flujos de integración (pipelines).

Otros recursos útiles

Actualmente hay gran cantidad de repositorios en GitHub con recursos útiles para usar con Docker. Algunos son puramente formativos y otros lo complementan muy bien, estos son algunos de los que considero útiles:

 

Un saludo y gracias a @hectorgoan por proporcionarme parte del material con el que se inició este artículo en 2016.

2 comentarios en “Docker: conceptos principales y tutorial paso a paso”

  1. Raul martinez perera

    Estupendo muy bien explicado, un 10

    Responder
    • Jorge

      Muchas gracias por su comentario, poco a poco voy completando este artículo con todo lo que voy aprendiendo.

      Responder

Deja una Respuesta