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.
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.
La utilización de docker en cualquier entorno nos brinda multitud de beneficios, algunos de estos son:
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.
Podemos verificar la instalación ejecutando:
docker --version
Para probar docker podemos ejecutar una imagen de prueba:
docker run hello-world
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.
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.
En este enlace podemos encontrar una lista con todos los comandos disponibles.
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.
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"]
La creación de un Dockerfile es sencilla y sigue una serie de instrucciones, podemos a explicar las más habituales
Podemos explorar todas las instrucciones en la documentación oficial de Docker.
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.
Utilizando la instrucción “VOLUME”
FROM python:3.9-slim
WORKDIR /app
COPY . /app
VOLUME /app/data
CMD ["python", "app.py"]
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}"
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
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.
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.
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
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:
Una vez definido el entorno de desarrollo en Docker Compose, podemos usar varios comandos para construir, desplegar y administrar los 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.
Docker Compose ofrece una serie de comandos útiles para administrar y monitorear el entorno de desarrollo:
Estos comandos facilitan el control y supervisión del entorno de desarrollo de manera eficiente.
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.