Tabla de contenidos
Conceptos básicos
Docker es es una plataforma de software libre de virtualización, para desarrolladores y sisadmins, que permite crear, ejecutar y compartir aplicaciones usando contenedores.
Docker aisla, estandariza y proporciona portabilidad de entornos, evitando así conflictos entre lenguaje y versiones y permitiendo crear código con mayor rapidez.
Docker empaqueta software en unidades llamadas contenedores que incluyen todo lo necesario para que el software se ejecute, incluidas bibliotecas, herramientas y demás. Esto nos proporciona la certeza de que el código se comportará siempre de igual forma. Funcionará igual en nuestro equipo que en el de nuestro cliente.
Docker es, por consiguiente, un sistema operativo para contenedores. Los contenedores son un mecanismo de empaquetado lógico donde las aplicaciones tienen todo lo que necesitan para ejecutarse.
La razón de ser de Docker no es solo el aislamiento de una app, sino sobre todo la abstraccción en relación al hardware. Con Docker podemos crear una aplicación que necesita de un determinado sistema operativo y bibliotecas para correr, empaquetarla, y llevarla a donde queramos, siempre que sea un equipo que tenga Docker instalado.
Los contenedores creados con Docker virtualizan el sistema operativo de un servidor, de manera similar a cómo una máquina virtual virtualiza su hardware. Incluso pueden ejecutarse contenedores Docker dentro de máquinas virtuales.
El software Docker se instala en cada servidor en el que queramos ejecutar contenedores y proporciona un conjunto de comandos para manipular estos.
Otra posibilidad interesantísima: podemos ejecutar nuestros contenedores en servicios cloud como Amazon Web Services o Google Cloud.
Algunas características clave de Docker y/o en general, del desarrollo de software basado en contenedores:
- Gran ecosistema de herramientas y aplicaciones para utilizar con Docker.
- Aislamiento. Los contenedores encapsulan las aplicaciones, lo que permite reemplazar/actualizar una sin tocar el resto.
- Portabilidad: Desarrolla en equipos locales o entornos de prueba, impleméntalo en la nube o en servidores remotos, y ejecútalo en cualquier parte.
- Ligero. Los contenedores comparten el núcleo del host, por lo que no necesitan un hipervisor como las máquinas virtuales, lo que hace que estas últimas consuman muchos más recursos.
- Escalable. Posibilidad de aumentar y distribuir réplicas de contenedores.
- Restauración. Cada imagen Docker está formada por capas. cada vez que un usuario hace un cambio, se crea una nueva capa. Así, es fácil volver a una versión anterior de la imagen.
Existen dos modelos de licencia de Docker: Docker Community Edition (CE) software libre y gratuito, y Docker Enterprise Edition (EE) basado en suscripción, con características adicionales.
Docker fue inicialmente diseñado para el uso en Linux, por lo que por su naturaleza sigue siendo más afín a entornos Linux.
Contenedores, contenedores Linux (LXC), máquinas virtuales y entornos virtuales Python
Todos estos tipos de soluciones parecen cumplir objetivos muy similares: aislar y/o simular/virtualizar un entorno concreto (una aplicación, un SO), para los propósitos descritos. Ello hace dudar sobre que solución es más correcta implementar en cada ocasión, sobre si se complementan o son excluyentes …
A diferencia de las máquinas virtuales, los contenedores de Docker no instalan un sistema operativo completo, sino que se ejecutan sobre el propio sistema operativo anfitrión, lo que los hace mucho más ligeros.
Cada aplicación en Docker va en su propio contenedor totalmente aislado. En contrapartida, debido al gran tamaño y consumo de recursos de las máquinas virtuales, en estas es habitual tener varias o muchas aplicaciones en la misma máquina.
Queda por tanto de manifiesto que para el desarrollo y despliegue de software el uso de contenedores es una solución mucho más adecuada que las pesadas máquinas virtuales. Estas últimas tienen su propio y completo sistema operativo con el que simular un entorno diferente.
Los entornos virtuales Python se limitan a permitir la separación de conjuntos de paquetes Python de terceros, como por ejemplo los instalables de pip como Tensorflow, Keras, … Un entorno virtual puede usar Tensorflow 1.13 y Keras 2.1.1, mientras otro ejecuta Tensorflow 2.0 y Keras 2.3.1. Sin embargo Docker proporciona todas las dependencias necesarias para construir e implementar.
LXC es una tecnología de virtualización en el nivel de sistema operativo para Linux. Un contenedor Linux (LXC) es un conjunto de uno o más procesos separados del resto del sistema. LXC ha sido útil como virtualización ligera. Docker se desarrolló en un principio partiendo de la tecnología LXC, sin embargo la tecnología Docker aporta mucho más. Además de ejecutar contenedores, también facilita el proceso de creación y diseño de estos. Algunas ventajas de Docker sobre LXC:
- Envío de imágenes.
- Control de versiones de imágenes y capas: funcionalidades estilo git para la inspeccionar las versiones de un contenedor, diferencias, retroceder, etc. Cada archivo de imagen de Docker se compone de una serie de capas. En cada cambio Docker crea una nueva capa así que de hecho, el control de versiones es algo implícito en el sistema de capas.
- Reusabilidad y portabilidad. Rápida replicación y despliegue de un único objeto que contiene todas las aplicaciones empaquetadas, entre máquinas que ejecuten Docker.
- Bibliotecas compartidas. Hay un registro público en donde miles de usuarios comparten los contenedores que han creado.
La arquitectura cliente-servidor de Docker
Docker Engine es una aplicación cliente-servidor, principalmente compuesta de:
- Un servidor, que es una aplicación de tipo daemon (comando dockerd).
- Una API REST sobre sockets UNIX, que especifica las interfaces para comunicarse con el daemon.
- Un cliente de interfaz de linea de comandos (CLI). Es el comando docker.
El cliente utiliza la REST API de Docker, o bien una interfaz de red, para interactuar con el daemon/servidor, usando scripts o simples comandos del CLI.
Cliente/CLI Docker y servidor/daemon Docker pueden funcionar en el mismo sistema, o puede conectarse un cliente a un daemon remoto.
Referencias
- [stephen-odaibo.medium.com] Docker Containers, Python Virtual Environments, & Virtual Machines
- [redhat.com] ¿Qué es DOCKER? ¿La tecnología Docker es la misma que la de los contenedores de Linux tradicionales?
- [upguard.com] LXC vs Docker: Por qué Docker es mejor
Recursos y enlaces de interés
- [docs.docker.com] Documentación oficial de Docker
- [docs.docker.com] Ejecutar los contenedores Docker en la nube, en Amazon EC2 Container Service (ECS).
- [docs.docker.com] Compose y Django. Guía rápida sobre como usar Docker Compose para configurar y ejecutar una aplicación Django/PostgreSQL simple. Antes de comenzar, instale Compose.
- [platzi.com] Cómo crear tu contenedor de Docker para tu aplicación en Django
Instalación y primeros pasos con Docker
Instalar el motor Docker siguiendo los pasos de página para la instalación del sitio Docker, usando el repositorio (recomendado) o descargando un paquete propio de la distribución (.deb para distribuciones Debian). Los usuarios de Linux Mint deben observar que pueden necesitar consultar esta página, para averiguar el código de la distribución Ubuntu padre.
Deberemos siempre preceder todos los comandos de Docker con la palabra sudo para obtener todos los privilegios del usuario root. No obstante este requerimiento puede cambiarse, como se explica en Pasos de post-instalación para Linux.
Docker Engine viene incluido con Docker Desktop para Linux. Esta es la forma más fácil y rápida para empezar.
Verificar la instalación correcta de Docker: sudo docker run hello-world . Esto descarga la imagen hello-world, que pasa a formar parte de la lista de imágenes en el equipo.
Actualizar el motor Docker: ejecutar sudo apt-get update y seguir las instrucciones de instalación, eligiendo la nueva versión que queremos instalar.
Desinstalar el motor Docker. Ejecutar:
sudo apt-get purge docker-ce docker-ce-cli containerd.io
Posteriormente eliminar todas las imágenes, contenedores y volúmenes:
sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd
Cualquier archivo de configuración editado deberemos eliminarlo manualmente.
Pasos de post-instalación para Linux: esta página contiene procedimientos opcionales para configurar Linux de forma que funcionen mejor con Docker. Entre estos: crear el grupo docker, que tendrá todos los privilegios de root, para que no sea necesario preceder los comandos Docker con sudo; configurar Docker para ejecutarse al arrancar; habilitar IPv6 en el daemon Docker; … y otros.
Imágenes y contenedores
[docs.docker.com] Los contenedores proporcionan el aislamiento. Cada contenedor interactúa con su propio sistema de archivos privado. Este sistema de archivos es proporcionado por la imagen Docker. La imagen contiene todo lo necesario para ejecutar: el código binario, dependencias,…
Docker (o el desarrollo basado en contenedores, en general) y los microservicios
Los microservicios son un modo de desarrollo en auge que están en contraposición a las antiguas aplicaciones monolíticas, engorrosas y difícilmente escalables.
Los microservicios proporcionan modularidad y reusabilidad al desarrollo.
Los microservicios son a menudo aislados y empaquetados en contenedores Docker los cuales pueden después ejecutarse en un cloud.
Referencias
Docker y Docker Compose
Docker Compose es una herramienta que permite simplificar el uso de Docker. Definir y ejecutar aplicaciones multicontenedor. Esta herramienta utiliza un archivo YAML (docker-compose.yml) para configurar los servicios de nuestra aplicación. Después, con un solo comando, creamos y arrancamos todos los servicios.
docker-compose.yml suele estar ubicado en la raíz del proyecto.
Crear un entorno de desarrollo local con Docker
Es usual, y buena idea, disponer de un entorno de desarrollo basado en Docker, en nuestro equipo local. Esto mismo podría hacerse con otras plataformas, com Vagrant o XAMPP.
Crear y construir una imagen
[docs.docker.com] Los pasos a grandes rasgos son:
- Crear y probar cada contenedor para cada componente de la aplicación, creando imágenes Docker.
- Ensamblar los contenedores e infraestructura en una aplicación completa.
- Probar, compartir y desplegar la aplicación completa «contenerizada».
Crearemos la imagen sobre la cual se basarán los contenedores. Para ello descargamos la aplicación de ejemplo node-bulletin-board propuesta en la documentación, escrita en Node.js.
/* Utiliza el comando curl para descargar el fichero Zip al equipo. */ curl -LO https://github.com/dockersamples/node-bulletin-board/archive/master.zip /* Desempaqueta/descomprime el Zip */ unzip master.zip /* Con cd nos desplazamos al directorio descomprimido, en el cual se encuentra la app */ cd node-bulletin-board-master/bulletin-board-app
Una vez descargada observemos el archivo llamado Dockerfile. Este se encargará de describir como ensamblar un sistema de archivos privado para un contenedor.
Nos aseguramos de que estamos en la carpeta del proyecto descargado, y si es necesario nos desplazamos hasta esta con l comando cd. Introducimos para crear la imagen de la aplicación:
docker build –tag bulletinboard:1.0 .
Ejecutamos la imagen como un contenedor:
docker run –publish 8000:8080 –detach –name bb bulletinboard:1.0
donde:
–publish . Redirige el puerto 8000 del host al 8080 del contenedor. Estos tienen su propio conjunto privado de puertos.
–detach . hace el contenedor se ejecute en segundo plano.
–name especifica un nombre con el que podremos hacer referencia (nombrar) al contenedor en adelante (bb en este caso).
Entramos la dirección localhost:8000 en un navegador. Deberíamos ver la interfaz de la aplicación.
Podemos borrar el contenedor: docker rm –force bb
–force detiene primero el contenedor en ejecución, en el caso en que lo esté.
Guía rápida de comandos Docker
Es muy posible, dependiendo de la configuración de nuestro Docker, que tengamos que anteponer el comando de superusuario sudo, antes de cada instrucción.
Para ver por pantalla una lista con todos los comandos disponibles, ejecutar docker sin parámetros, o bien:
docker-help
Para visualizar la ayuda de cualquier comando, exscribir –help detrás de este. Por ejemplo: docker –help
docker start
Inicia uno o más contenedores detenidos. Sintaxis:
docker start [OPCIONES] CONTAINER [CONTAINER…]
docker –version
Verificar la versión de Docker
docker image ls
Muestra la lista de imágenes en el equipo
docker-compose CLI
docker-compose start
Arranca contenedores detenidos.
docker-compose exec
Ejecuta un comando en un contenedor en ejecución
docker-compose create
Crea contenedores para un servicio. Sintaxis:
docker compose create [SERVICIO…]
docker-compose down
Detiene y elimina contenedores, y redes.
Deja una respuesta