Docker essentials
Docker es un PaaS (Platform as a Service) open source que permite desarrollar y ejecutar aplicaciones de una forma más eficiente en cuanto al consumo de recursos, pues todos los contenedores son ejecutados por un solo kernel y por tanto requiere menos infraestructura que las máquinas virtuales tradicionales.
Esta plataforma utiliza una virtualización a nivel de Sistema Operativo para ejecutar el software, para ello, las aplicaciones son empaquetadas en contenedores que se encuentran aislados unos de otros, y que albergan su propio software, librerías y ficheros de configuración. A pesar de estar aislados, los contenedores se pueden comunicarse entre sí.
Para empezar a trabajar con Docker, es necesario instalar Docker Desktop:
Una vez instalado Docker Desktop, en el terminal se puede empezar a desarrollar imágenes.
# Visualiza la versión instalada de Docker
docker version
Client: Docker Engine - Community
Version: 19.03.8
API version: 1.40
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:23:10 2020
OS/Arch: windows/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.8
API version: 1.40 (minimum version 1.12)
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:29:16 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
Conceptos
Docker daemon
También llamado dockerd
, es el responsable de escuchar las peticiones a la API de Docker y, por tanto, es el intermediario que podrá gestionar imágenes, contenedores, networks y volúmenes. Un daemon puede comunicarse con otros para así poder gestionar los servicios.
Containers
Un contenedor es un proceso que se ejecuta en Linux y que comparte el kernel de la máquina donde está alojado y con otros contenedores. Se comporta y consume memoria igual que puede hacer cualquier otro proceso de la máquina. Los contenedores se encuentran aislados del host, y también de otros contenedores. Este aislamiento permite al contenedor tener e interactuar con su propio sistema de ficheros, el cual es provisto por su imagen.
Images
Por su parte, la imagen es una plantilla de sólo lectura con las instrucciones necesarias para crear un contenedor. Esta plantilla es un fichero llamado Dockerfile
que contiene una serie de pasos que definen las capas necesarias para construir la imagen y que pueda ejecutarse en un contenedor. Cuando este fichero es modificado y se vuelve a construir la imagen, únicamente se reconstruyen las capas que han cambiado.
Services
Los servicios son la forma en la que escalan los contenedores a través de múltiples Docker daemons, los cuales se comunican mediante la API de Docker, y pueden trabajar juntos formando un swarm dónde se distribuyen como managers o como workers. Por defecto, el servicio es balanceado por de todos los workers, siendo transparente para el cliente que consume la aplicación.
Contenedores vs Máquinas Virtuales
En una infraestructura virtualizada tradicional, la infraestructura es gobernada por el Hypervisor que gestiona n máquinas virtuales con sus correspondientes Sistemas Operativos y aplicaciones.
En cambio, en una virtualización basada en Contenedores, Docker gestiona n contenedores con aplicaciones que utilizan el kernel del Sistema Operativo del servidor dónde se está ejecutando Docker.
Dockerfile
Para construir una imagen, es necesario crear un fichero Dockerfile
que contenga las instrucciones precisas para levantar un contenedor y ejecutar la aplicación.
Este fichero es construido como si se tratara de una receta, explicando paso a paso las acciones necesarias para crear una imagen.
Por ejemplo, en una solución .NET Core, en el directorio del proyecto, se puede definir un fichero Dockerfile
como el siguiente para que despliegue una web app en un contenedor.
# Imagen oficial del sdk de .NET Core
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 as builder
WORKDIR /app
# Copia el csproj y restaura dependencias
COPY *.csproj ./
RUN dotnet restore
# Copia todos los ficheros a la imagen
COPY . ./
# Publish para producción
RUN dotnet publish -c Release -o out
# Puerto por el que se va a escuchar en tiempo de ejecución
EXPOSE 8080
# Imagen oficial del runtime de .NET Core
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY /app/out .
ENTRYPOINT ["dotnet", "DockerEssentials.dll"]
Al construir y ejecutar esta imagen, en el puerto 8080 estará corriendo una versión de la aplicación .NET Core que hemos publicado.
docker build -t dockeressentials .
docker run -d -p 8080:80 dockeressentials
Nota: Los ficheros dockerfile son sensibles a las mayúsculas, por lo que se debe tener cuidado a la hora de programarlos. También es conveniente acompañar los ficheros dockerfile de los ficheros
.dockerignore
para evitar copiar en las imágenes archivos o carpetas superfluas.
Conclusiones
El modelo de virtualización de Docker, además de ser open source, tiene una gestión a nivel de infraestructura bastante más eficiente que la virtualización tradicional, por lo que nos permite obtener un mejor rendimiento de ésta.
Además de las ventajas económicas, la publicación y despliegue de aplicaciones contenerizadas, nos permite no atarnos a un determinado tipo de infraestructura on prem u on cloud, y tampoco genera una dependencia con un proveedor cloud determinado.