Desarrollo

Guía Completa: Tutorial de Docker

10 minutes

Guía Completa: Tutorial de Docker

Introducción a Docker

Han pasado más de 10 años desde la aparición de Docker en el ámbito del desarrollo de software y hoy en día casi nadie concibe un proyecto de software sin utilizar Docker en alguna de sus etapas. La aparición de docker ha sido un cambio y una mejora a la hora de desarrollar, desplegar y ejecutar nuestras aplicaciones.

En este post explicaremos desde que es docker, sus ventajas y cómo iniciarse hasta mostrar ejemplos prácticos para que puedas sacarle todo el provecho a esta gran tecnología.

¿Qué es Docker?

Docker es una tecnología de código abierto que facilita el despliegue de aplicaciones en diferentes entornos mediante contenedores. Las principales características de estos  contenedores es que son ligeros, portátiles y autosuficientes. Con ello se consigue que los desarrolladores puedan enfocarse en el código y no en la multitud de configuraciones necesarias para replicar sus aplicaciones en los diferentes entornos.

Beneficios del uso de Docker en desarrollo y producción

La utilización de docker en cualquier entorno nos brinda multitud de beneficios, algunos de estos son:

  • Consistencia: Garantiza que el software funcione de manera consistente en cualquier entorno.
  • Portabilidad: Facilita que los contenedores puedan ejecutarse en cualquier máquina que tenga Docker instalado. 
  • Aislamiento: Promueve la separación de las aplicaciones asegurando que cada contenedor posea recursos propios y aislados de otros contenedores.
  • Facilidad de Gestión: Simplifica el despliegue de aplicaciones complejas y con gran número de dependencias mediante herramientas como Docker Compose.

Primeros Pasos con Docker

Instalación de Docker

Dependiendo del sistema operativo que usemos el proceso de instalación puede ser algo diferente. A continuación describimos la instalación para los sistemas más habituales.

Cómo instalar Docker en diferentes sistemas operativos

  • Windows / macOS: para ambos sistemas el método más sencillo es instalar Docker Desktop que lo podemos obtener en la página oficial.
  • Linux: para linux tenemos la opción de instalar únicamente Docker engine (solo CLI) o utilizar Docker Desktop. Si es la primera vez que utilizas Docker te recomendamos que utilices la segunda opción ya que la interfaz te facilitará la gestión de imágenes y contenedores. Al igual que en Windows y macOS lo puedes obtener de la página oficial.

Requisitos del sistema y configuración inicial

  • Windows y MacOS: Se requiere una versión de 64 bits del sistema operativo y habilitar la virtualización en BIOS.
  • Linux: Es recomendable tener una distribución basada en Debian o Red Hat con el kernel actualizado. Es importante a tener en cuenta es que tu usuario debe pertenecer  al grupo docker así evitamos la necesidad y el peligro de tener que lanzar los comandos con sudo. Aquí se describe el proceso.

Primeros pasos una vez instalado Docker

Podemos verificar la instalación ejecutando:

docker --version

Para probar docker podemos ejecutar una imagen de prueba:

docker run hello-world

Conceptos Básicos de Docker

Contenedores vs. Máquinas Virtuales

Aunque los contenedores y las máquinas virtuales (VM) permiten ejecutar aplicaciones en entornos aislados, existe una diferencia clave entre ellos: Los contenedores comparten el sistema operativo (kernel) del host, lo que los hace más eficientes y ligeros. En cambio, las VM incluyen su propio sistema operativo completo lo que las hace menos eficientes y más pesadas.

Imágenes y contenedores Docker

  • Imagen: Es la plantilla para crear contenedores y en ella se define cómo debe de construirse y ejecutar una contenedor. Es estática y no cambia, similar a un plano que define cómo debe ser una construcción pero no es la construcción en sí misma. Se realiza en un archivo llamado Dockerfile.
  • Contenedor: cuando se ejecuta una imagen, se crea un contenedor que es una instancia en funcionamiento de esa imagen. Es dinámico, lo que significa que puede iniciar, detenerse, reiniciarse y eliminarse según sea necesario.

Resumiendo: la imagen define lo que se necesita y cómo debe ejecutarse, mientras que el contenedor es la manifestación práctica y ejecutable de esa definición.

Comandos básicos de Docker

  • docker run: Ejecuta un contenedor.
  • docker pull: Descarga una imagen desde Docker Hub.
  • docker build: Construye una imagen desde un Dockerfile.
  • docker ps: Lista los contenedores en ejecución.

En este enlace podemos encontrar una lista con todos los comandos disponibles.

Trabajando con Dockerfiles

¿Qué es un Dockerfile?

Es un archivo de texto que contiene las instrucciones necesarias para crear una imagen Docker. Define cómo construir la imagen, incluyendo la base, dependencias, archivos y configuración.

Estructura básica de un Dockerfile

Este es un ejemplo básico de la estructura habitual de un archivo Dockerfile

FROM ubuntu:latest

RUN apt-get update && apt-get install -y python3

COPY . /app

WORKDIR /app

CMD ["python3", "app.py"]

Cómo Crear un Dockerfile

La creación de un Dockerfile es sencilla y sigue una serie de instrucciones, podemos a explicar las más habituales

Paso a paso para crear un Dockerfile

  1. Define la Imagen Base: Usa el comando FROM.
  2. Instala Dependencias: Usa RUN para ejecutar comandos como la instalación de paquetes.
  3. Copia Archivos: Usa COPY o ADD para copiar archivos del host al contenedor.
  4. Define el Directorio de Trabajo: Usa WORKDIR para establecer el directorio de trabajo.
  5. Comando de Inicio: Usa CMD para definir el comando que se ejecutará al iniciar el contenedor.

Podemos explorar todas las instrucciones en la documentación oficial de Docker.

Capas del archivo Dockerfile

Cada instrucción en un Dockerfile crea una nueva capa que se almacena en caché para acelerar las reconstrucciones. Si se modifica una instrucción, todas las capas anteriores permanecen en caché, pero la instrucción modificada y las posteriores se deben volver a crear, lo que aumenta el tiempo de construcción.

Mejores prácticas y consejos

  • Utiliza como base imágenes ligeras. Por ejemplo, es mejor usar alpine que ubuntu.
  • Para reducir el número de capas agrupa los comandos. Por ejemplo, los comandos de instalación
  • Si necesitas excluir algunas archivos en el contenedor utiliza el archivo .dockerignore
  • Al crear y probar un Dockerfile, pon al final las instrucciones más propensas a cambios. Así, al reconstruir, solo se actualizan las últimas capas y ahorras tiempo.

Ejemplos de Dockerfiles

Uso de volúmenes

Utilizando la instrucción “VOLUME”

FROM python:3.9-slim

WORKDIR /app

COPY . /app

VOLUME /app/data

CMD ["python", "app.py"]

Variables de entorno

Definir variables de entorno en el Dockerfile

Una vez definidas, puedes usar estas variables en otras instrucciones del Dockerfile:

FROM ubuntu:20.04

ENV APP_ENV=production
ENV APP_PORT=8080

RUN echo "Running in ${APP_ENV} mode on port ${APP_PORT}"

Pasar variables de entorno durante la construcción o en tiempo de ejecución

Primero debes declarar el argumento con ARG en el Dockerfile:

FROM ubuntu:20.04

ARG APP_ENV
ARG APP_PORT

ENV APP_ENV=${APP_ENV}
ENV APP_PORT=${APP_PORT}

RUN echo "Running in ${APP_ENV} mode on port ${APP_PORT}"

En la construcción: Utilizando “–build-arg”:

docker build --build-arg APP_ENV=production --build-arg APP_PORT=8080 -t myapp .

En tiempo de ejecución: Usando la opción “-e” con “docker run”:

docker run -e APP_ENV=production -e APP_PORT=8080 myapp

Introducción a Docker Compose

¿Qué es Docker Compose?

Es una herramienta diseñada para definir y gestionar aplicaciones que utilizan múltiples contenedores. A través de un archivo YAML es posible configurar todos los servicios que conforman tu aplicación.

¿Cuándo usarlo?

Es especialmente útil para aplicaciones que dependen de varios servicios, como bases de datos y sistemas de caché. Esta herramienta simplifica la gestión y orquestación de estos servicios, permitiendo que trabajen juntos de manera coordinada en contenedores.

Ventajas de usar Docker Compose

  • Simplificación: Toda tu aplicación puede ser definida en un único archivo docker-compose.yml.
  • Reproducibilidad: Facilita la replicación del entorno de desarrollo en el entorno de producción.
  • Escalabilidad: Permite escalar los servicios de tu aplicación de forma sencilla.

Como instalar Docker Compose

Docker Desktop instala por defecto Docker Compose así que no es necesario realizar ninguna instalación adicional.

Podemos verificar la instalación con:

docker-compose --version

Estructura básica de un archivo docker-compose.yml

version: '3'

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./app:/var/www/html
  db:
    image: mariadb:10
    ports:
      - "6033:3306"
    environment:
      MYSQL_ROOT_PASSWORD: example

Pasamos a explicar cada una de las secciones:

  • version: Especifica la versión del formato del archivo de Docker Compose. La versión '3' es una de las más comunes y compatibles con muchas funciones modernas de Docker Compose.
  • services:Define los diferentes contenedores que formarán parte de la aplicación.
  • web / db: Nombre del servicio, se recomienda utilizar un nombre significativo para identificar fácilmente el servicio.
  • image: Indica la imagen de Docker que se utilizará para crear el contenedor.
  • ports: Mapea los puertos del host con los del contenedorsome text
    • “{puerto_host}:{puerto_contenedor}”
  • volumes: Mapea directorios del host a directorios del contenedor:some text
    • “{directorio_host}:{directorio_contenedor}”
  • environment: Define variables de entorno para el contenedor. como en este caso, MYSQL_ROOT_PASSWORD

Despliegue y Gestión del Entorno con Docker Compose

Una vez definido el entorno de desarrollo en Docker Compose, podemos usar varios comandos para construir, desplegar y administrar los contenedores.

Construcción y Despliegue de Contenedores

Para construir y desplegar los contenedores especificados en el archivo `docker-compose.yml`, usamos el comando:

docker-compose up

Este comando crea y ejecuta los contenedores según las configuraciones, mostrando la salida en la terminal para monitorear su estado y detectar posibles errores.

Comandos Básicos para Administración y Monitoreo

Docker Compose ofrece una serie de comandos útiles para administrar y monitorear el entorno de desarrollo:

  • docker-compose start: Inicia los contenedores existentes.
  • docker-compose stop: Detiene los contenedores existentes.
  • docker-compose restart: Reinicia los contenedores existentes.
  • docker-compose ps: Muestra el estado de los contenedores.
  • docker-compose logs: Muestra los registros de los contenedores.

Estos comandos facilitan el control y supervisión del entorno de desarrollo de manera eficiente.

Conclusiones acerca de docker

Docker ha transformado el desarrollo de software al permitir empaquetar aplicaciones y sus dependencias en contenedores portátiles y ligeros, mejorando la eficiencia y consistencia en diversos entornos.

Docker Compose facilita la gestión y orquestación de aplicaciones multicontenedor, ofreciendo ventajas significativas como portabilidad, aislamiento y escalabilidad. 

Adoptar Docker y seguir las mejores prácticas recomendadas optimiza tanto el desarrollo como el despliegue de aplicaciones complejas.

Post relacionados

Continúa leyendo