Programación

¿Qué es Docker, para qué utilizarlo y cómo usarlo?

Por Antonio Richaud, Publicado el 13 de Marzo de 2024

Introducción

Si te dedicas al desarrollo de software o estás involucrado en el despliegue de aplicaciones, seguramente has escuchado hablar de Docker. Pero, ¿qué es exactamente y por qué tantas personas están tan emocionadas por usarlo? Docker es una herramienta que ha cambiado la forma en que se desarrollan, se despliegan y se ejecutan aplicaciones. Con Docker, puedes empacar todo lo que tu aplicación necesita para funcionar en una especie de "contenedor" que garantiza que todo se ejecute igual, sin importar dónde lo pongas.

En este artículo, te voy a explicar de manera sencilla qué es Docker, por qué deberías considerarlo en tu flujo de trabajo y, lo más importante, cómo puedes empezar a usarlo. Además, voy a incluir ejemplos prácticos para que puedas seguirlos y aplicarlos directamente en tus proyectos.


1. ¿Qué es Docker?

Docker es una plataforma que te permite crear, desplegar y ejecutar aplicaciones en contenedores. ¿Qué es un contenedor? Imagínate que tienes una caja en la que puedes meter tu aplicación, junto con todo lo que necesita para funcionar: código, librerías, dependencias, variables de entorno, etc. Esa caja, o contenedor, se puede mover a cualquier lugar, ya sea tu computadora, un servidor en la nube o incluso la máquina de un compañero, y siempre va a funcionar igual.

Contenedores vs máquinas virtuales

Puede que estés familiarizado con las máquinas virtuales (VMs), que también se usan para ejecutar aplicaciones de forma aislada. Pero, ¿qué diferencia a Docker de una VM? Básicamente, las VMs necesitan cargar un sistema operativo completo, lo que las hace más pesadas y lentas. En cambio, los contenedores de Docker comparten el núcleo del sistema operativo con la máquina anfitriona, lo que los hace mucho más ligeros y rápidos de iniciar.

Aquí te dejo una comparación rápida:

  • Máquinas virtuales: Tienen su propio sistema operativo completo, lo que implica más uso de recursos.
  • Contenedores: Comparten el núcleo del sistema operativo, por lo que son más ligeros y rápidos.

Con Docker, en lugar de tener varias VMs corriendo en tu máquina, podrías tener varios contenedores, cada uno con su propia aplicación, pero todos compartiendo el mismo sistema operativo. Esto ahorra recursos y hace que todo funcione de manera más fluida.

¿Qué ventajas tiene Docker?

Docker es más que una moda pasajera, y aquí te dejo algunas de las razones por las que tantas personas lo están usando:

  • Consistencia: Olvídate de "pero en mi máquina funciona". Con Docker, tu aplicación se comporta igual en cualquier lugar.
  • Rapidez: Los contenedores se inician en segundos, a diferencia de las VMs que pueden tardar varios minutos.
  • Ligereza: Los contenedores ocupan mucho menos espacio porque comparten el mismo sistema operativo.
  • Portabilidad: Puedes mover tus contenedores a cualquier entorno que tenga Docker instalado, sin complicaciones.

2. ¿Para qué utilizar Docker?

Ahora que ya sabes qué es Docker y por qué es tan útil, probablemente te estés preguntando: "¿En qué situaciones debería usarlo?" Bueno, Docker es una herramienta súper versátil que se adapta a muchas situaciones en el desarrollo y despliegue de aplicaciones. A continuación, te explico algunos de los escenarios más comunes donde Docker puede hacer tu vida mucho más fácil.

Desarrollo de aplicaciones

Cuando estás desarrollando una aplicación, especialmente si trabajas en equipo, es común que cada desarrollador tenga un entorno diferente. Esto puede llevar a que el código funcione en una máquina, pero no en otra. Docker resuelve este problema creando un entorno de desarrollo consistente que todos pueden compartir.

Por ejemplo, imagina que estás desarrollando una aplicación en Node.js. Con Docker, puedes crear un contenedor que incluya la versión exacta de Node.js que necesitas, junto con todas las dependencias. Luego, todo el equipo puede usar ese mismo contenedor para desarrollar, asegurándose de que todos están en la misma página.

Facilitación del trabajo en equipo y la portabilidad

Docker también facilita la colaboración. Supongamos que estás trabajando en un proyecto y quieres compartir tu entorno de desarrollo con alguien más. En lugar de pasarle una lista de instrucciones para configurar todo (lo que podría tomarle horas), solo le pasas el archivo `Dockerfile` o la imagen Docker. Con un solo comando, tu compañero puede levantar un entorno idéntico al tuyo.

                        
# Crear una imagen Docker desde un Dockerfile
docker build -t mi-aplicacion .
                
# Compartir la imagen Docker
docker save mi-aplicacion | gzip > mi-aplicacion.tar.gz
                        
                    

Con estos comandos, puedes construir una imagen Docker y compartirla con otros. Ellos solo tienen que cargar la imagen en su Docker y estarán listos para trabajar.

Despliegue de aplicaciones en producción

Otro gran uso de Docker es en el despliegue de aplicaciones en producción. Gracias a los contenedores, puedes asegurarte de que tu aplicación se desplegará y funcionará exactamente como lo hizo en tu entorno de desarrollo. Esto reduce el riesgo de que algo salga mal cuando pases tu aplicación de desarrollo a producción.

Aquí tienes un ejemplo de cómo podrías desplegar una aplicación web usando Docker:

                        
# Ejecutar un contenedor desde una imagen Docker en producción
docker run -d -p 80:80 --name mi-app webserver:latest
                        
                    

Este comando despliega tu aplicación en un contenedor, mapeando el puerto 80 de tu servidor al puerto 80 del contenedor, lo que hace que tu aplicación esté disponible públicamente.

Ejemplos de casos de uso comunes

Docker tiene muchos otros usos prácticos. Aquí te dejo algunos ejemplos:

  • Microservicios: Cada microservicio puede correr en su propio contenedor, lo que facilita el manejo y escalabilidad de las aplicaciones.
  • Testing y CI/CD: Docker se integra bien con pipelines de integración y entrega continua (CI/CD), permitiendo ejecutar tests en contenedores aislados que simulan el entorno de producción.
  • Entornos de desarrollo desechables: Puedes crear contenedores de desarrollo que puedes eliminar y recrear fácilmente, manteniendo tu sistema limpio.

Como ves, Docker no es solo para desarrolladores o equipos grandes; también es útil para proyectos pequeños, ya que te ayuda a mantener todo organizado y bajo control.


3. ¿Cómo usar Docker?

Ahora que ya sabes qué es Docker y por qué deberías usarlo, es hora de ensuciarnos un poco las manos y aprender cómo utilizarlo. No te preocupes, empezar con Docker es más sencillo de lo que parece, y te prometo que en poco tiempo estarás corriendo tus propios contenedores.

Instalación de Docker

Lo primero que necesitas hacer es instalar Docker en tu máquina. Docker está disponible para varios sistemas operativos, incluyendo Linux, macOS y Windows. Aquí te dejo los pasos básicos para instalar Docker en cada uno:

  • En Linux: Puedes instalar Docker usando tu gestor de paquetes. Por ejemplo, en Ubuntu, usarías:
                        
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
                        
                    
  • En macOS: Descarga Docker Desktop desde el sitio oficial y sigue las instrucciones para instalarlo.
  • En Windows: También puedes descargar Docker Desktop desde el sitio oficial. Asegúrate de que la virtualización esté habilitada en tu BIOS.

Una vez que Docker esté instalado, puedes verificar que todo esté funcionando correctamente ejecutando el siguiente comando:

                        
docker --version
                        
                    

Si ves la versión de Docker, ¡felicidades! Ya tienes Docker instalado y listo para usarse.

Comandos básicos de Docker

Ahora que tienes Docker instalado, vamos a ver algunos comandos básicos que te permitirán empezar a trabajar con contenedores. Aquí te dejo los más importantes:

  • `docker run`: Este comando te permite crear y ejecutar un contenedor a partir de una imagen Docker. Por ejemplo, para correr un contenedor de Nginx, usarías:
                        
docker run -d -p 80:80 nginx
                        
                    
  • `docker ps`: Muestra una lista de los contenedores que están corriendo en tu máquina.
                        
docker ps
                        
                    
  • `docker stop`: Detiene un contenedor en ejecución. Necesitarás el ID o el nombre del contenedor, que puedes obtener con `docker ps`.
                        
docker stop [ID_DEL_CONTENEDOR]
                        
                    
  • `docker rm`: Elimina un contenedor que has detenido. Nuevamente, necesitas el ID o nombre del contenedor.
                        
docker rm [ID_DEL_CONTENEDOR]
                        
                    

Creación de un contenedor desde una imagen existente

Vamos a poner todo esto en práctica. Imagina que quieres crear un contenedor que corra una aplicación simple usando Node.js. Primero, vas a descargar la imagen de Node.js desde Docker Hub y luego crearás un contenedor a partir de ella:

                        
# Descargar la imagen de Node.js desde Docker Hub
docker pull node
                
# Crear y correr un contenedor basado en la imagen de Node.js
docker run -d -p 3000:3000 --name mi-app node
                        
                    

Este comando crea un contenedor llamado `mi-app` que corre en segundo plano (`-d`) y mapea el puerto 3000 del contenedor al puerto 3000 de tu máquina. Ahora, puedes acceder a tu aplicación en `http://localhost:3000`.

Ejemplo práctico: Configuración y ejecución de un contenedor

Supongamos que quieres correr una aplicación web simple escrita en Node.js. Vamos a crear un archivo `Dockerfile`, que define todo lo que tu contenedor necesita, y luego a construir la imagen y correr el contenedor.

                        
# Contenido del Dockerfile
FROM node:14
                
WORKDIR /app
                
COPY package*.json ./
                
RUN npm install
                
COPY . .
                
EXPOSE 3000
                
CMD ["node", "app.js"]
                        
                    

Una vez que tengas tu `Dockerfile` listo, construyes la imagen y corres el contenedor:

                        
# Construir la imagen
docker build -t mi-app .
                
# Ejecutar el contenedor
docker run -d -p 3000:3000 mi-app
                        
                    

¡Y listo! Ahora tu aplicación Node.js está corriendo en un contenedor Docker, accesible en `http://localhost:3000`.

Introducción a Docker Compose

Docker Compose es una herramienta que te permite definir y manejar múltiples contenedores como un solo servicio. Esto es súper útil si tu aplicación depende de varios servicios, como una base de datos y un servidor web.

Aquí tienes un ejemplo de un archivo `docker-compose.yml` que levanta una aplicación web y una base de datos MySQL:

                        
version: '3'
services:
    web:
        image: node:14
        ports:
            - "3000:3000"
        volumes:
            - .:/app
        working_dir: /app
        command: npm start
                
        db:
            image: mysql:5.7
            environment:
            MYSQL_ROOT_PASSWORD: ejemplo123
            MYSQL_DATABASE: mi_base_de_datos
            ports:
                - "3306:3306"
                        
                    

Con este archivo, puedes levantar ambos servicios con un solo comando:

                        
docker-compose up
                        
                    

Docker Compose se encarga de construir y levantar ambos contenedores, y puedes gestionarlos fácilmente con otros comandos como `docker-compose down` para detenerlos.


Conclusión

Docker ha cambiado la manera en que desarrollamos, desplegamos y gestionamos aplicaciones, ofreciendo una solución elegante y eficiente para lidiar con las inconsistencias entre entornos. Ya sea que estés trabajando en un pequeño proyecto personal o en una aplicación de nivel empresarial, Docker te permite empaquetar tu aplicación con todo lo que necesita para funcionar, asegurando que siempre se ejecutará de la misma manera, sin importar dónde se despliegue.

En este artículo, hemos explorado qué es Docker, por qué es tan útil y cómo puedes empezar a usarlo. Desde la creación de contenedores básicos hasta la gestión de múltiples servicios con Docker Compose, ahora tienes las herramientas necesarias para integrar Docker en tu flujo de trabajo y aprovechar al máximo sus ventajas.

Si bien Docker puede parecer un poco intimidante al principio, con un poco de práctica verás lo poderoso y flexible que puede ser. Así que no dudes en experimentar, probar nuevas configuraciones y descubrir cómo Docker puede mejorar tu proceso de desarrollo.


Recursos adicionales

Antonio Richaud

Soy un Data Scientist con experiencia en machine learning, deep learning y análisis financiero. Transformo grandes volúmenes de datos en insights y desarrollo soluciones que integran análisis avanzado con programación.