SetValue.NETSetValue.NET

Docker essentials

July 04, 2020

Generic badge

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.

Infraestructure
Virtual Machine A
Virtual Machine B
Virtual Machine C
Hypervisor
Bin / Libraries
Guest Host
Application
Bin / Libraries
Guest Host
Application
Bin / Libraries
Guest Host
Application

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.

Infraestructure
Container A
Container B
Container C
Docker
OS Host
Bin / Libraries
Application
Bin / Libraries
Application
Bin / Libraries
Application

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 --from=builder /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

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.

Buy Me A Coffee