¿QUÉ ES DOCKER Y PARA QUÉ SIRVE? GUÍA COMPLETA PARA PRINCIPIANTES

Docker es una plataforma de código abierto que permite a los desarrolladores crear, desplegar y ejecutar aplicaciones dentro de contenedores de software. Se ha convertido en una herramienta imprescindible en el desarrollo web y en sistemas, para garantizar que un programa funcione exactamente igual en el ordenador de un programador que en el servidor de producción.

¿Qué es un contenedor de Docker?

Para entender Docker, imagínate un barco de mercancías. En lugar de llevar los productos sueltos, se meten en contenedores estandarizados. Da igual lo que haya dentro, ropa, comida o electrónica, el barco los transporta y los maneja de la misma forma.
En el software ocurre lo mismo. Un contenedor de Docker es una unidad ligera y aislada que empaqueta todo lo necesario para que una aplicación se ejecute: el código fuente, las librerías, las dependencias y los archivos de configuración. Al estar aislado del sistema operativo anfitrión, te aseguras de que no haya conflictos con otras aplicaciones.

Conceptos clave

El ecosistema de Docker se basa en varios pilares fundamentales:
  • Docker Engine: Es el corazón de la plataforma. Se trata del motor que se instala en la máquina y que se encarga de crear, iniciar o detener los contenedores.
  • Imágenes: Son las plantillas de "solo lectura" que contienen las instrucciones para crear un contenedor. Puedes verlas como la receta de cocina, mientras que el contenedor es el plato terminado.
  • Docker Hub: Es un registro público en la nube (similar a un GitHub de contenedores) donde la comunidad comparte miles de imágenes preconfiguradas, como bases de datos de bases como PostgreSQL, servidores web como Nginx, etc..
  • Dockerfile: Un archivo de texto donde el desarrollador escribe paso a paso las instrucciones necesarias para construir una imagen personalizada.

Principales ventajas de utilizar Docker

  • Portabilidad absoluta: Lo que funciona en tu portátil funcionará igual en la nube de Microsoft Azure, Amazon Web Services (AWS) o Google Cloud.
  • Eficiencia de recursos: Al no necesitar virtualizar un sistema operativo por cada app, puedes exprimir al máximo el hardware de tus servidores.
  • Aislamiento y seguridad: Si un contenedor falla o es hackeado, el problema se queda dentro de ese contenedor, sin poner en riesgo al resto del sistema.
  • Facilidad para Microservicios: Es la herramienta perfecta para dividir una aplicación gigante en pequeños servicios independientes (base de datos, pasarela de pago, frontend) que se comunican entre sí.
Docker ha transformado por completo las reglas del juego en la informática moderna.

Que es una Imagen en Docker

Una imagen de Docker es una plantilla de solo lectura que contiene todas las instrucciones, el código, las librerías y las configuraciones necesarias para que una aplicación funcione. Se puede comparar con los planos de un arquitecto o la receta de un pastel. El plano no es una casa pero describe exactamente cómo construirla. Dicha plantilla se crea en el fichero "Dockerfile", sin extensión.
Ejemplo para una app de NodeJS

# 1. Define la imagen base sobre la que vamos a trabajar
FROM node:20-alpine

# 2. Crea y define el directorio de trabajo dentro del contenedor
WORKDIR /app

# 3. Copia los archivos de dependencias del proyecto
COPY package*.json ./

# 4. Ejecuta el comando para instalar las librerías dentro de la imagen
RUN npm install

# 5. Copia el resto del código fuente de tu ordenador al contenedor
COPY . .

# 6. Informa a Docker de que el contenedor escuchará en el puerto 3000
EXPOSE 3000

# 7. Define el comando que se ejecutará por defecto al arrancar el contenedor
CMD ["npm", "start"]

En la práctica

Una imagen es estática, no cambia y no consume apenas recursos del sistema mientras no se use. Se pueden descargar imágenes ya hechas, como NodeJS, Python, MySQL, etc, desde el repositorio oficial, Docker Hub.

Que es un contenedor en Docker

Un contenedor de Docker es la instancia viva y en ejecución de una imagen. Es la aplicación real funcionando de forma completamente aislada del resto de tu ordenador. El contenedor es la casa ya construida siguiendo los planos, o el pastel ya horneado a partir de la receta.

En la práctica

Se pueden crear decenas de contenedores idénticos a partir de una sola imagen. Si se detiene o borra un contenedor, todo lo que haya pasado dentro de él, los archivos temporales que haya creado, por ejemplo, desaparece por completo.

Que es un volumen en Docker

Un volumen de Docker es el mecanismo que utiliza Docker para guardar datos de forma permanente. Por defecto, los contenedores son "efímeros", si se borran, sus datos desaparecen con ellos. Los volúmenes solucionan esto conectando una carpeta del contenedor con una carpeta real del ordenador o servidor. Es como un disco duro externo o una caja fuerte conectada a la casa. Aunque se derribe la casa, el contenedor, para construir una nueva, los objetos guardados en la caja fuerte, los datos se quedan intactos.

En la práctica

Se usa obligatoriamente para bases de datos o carpetas de archivos subidos por usuarios. Así, se puede actualizar la aplicación, borrar el contenedor viejo y levantar uno nuevo con la última versión, sin perder ni un solo dato de tus clientes.

Qué es un fichero docker-compose.yml

El fichero "docker-compose.yml", o "compose.yaml", es el archivo donde se describe toda la aplicación completa: qué contenedores necesita, cómo se conectan entre sí, qué puertos abren, qué volúmenes usan y en qué orden deben arrancar. Si el fichero "Dockerfile" es la receta de un solo plato. El "docker-compose.yml" es el menú completo del restaurante: dice qué platos se cocinan, en qué orden, con qué ingredientes compartidos y cómo se sirven juntos en la mesa.

En la práctica

Con un solo comando, "docker compose up", levanta todos los servicios a la vez. Cuando se termina, con el comando "docker compose down" se apagan todos juntos. Es mucho más cómodo que ir ejecutando varios "docker run" a mano.
Ejemplo sencillo de una aplicación NodeJS con base de datos PostgreSQL:

services:
  # Servicio de la aplicación
  app:
    build: .                    # Construye la imagen usando el Dockerfile de la carpeta actual
    ports:
      - "3000:3000"             # Puerto del ordenador : puerto del contenedor
    volumes:
      - .:/app                  # Monta el código local para desarrollo
    depends_on:
      - db                      # Espera a que la base de datos esté lista
    environment:
      DATABASE_URL: postgres://usuario:password@db:5432/miapp

  # Servicio de la base de datos
  db:
    image: postgres:16-alpine   # Usa la imagen oficial de PostgreSQL
    volumes:
      - postgres_data:/var/lib/postgresql/data   # Guarda los datos de forma permanente
    environment:
      POSTGRES_USER: usuario
      POSTGRES_PASSWORD: password
      POSTGRES_DB: miapp
volumes:
  postgres_data:                # Define el volumen nombrado
  • services: define cada contenedor, app y db.
  • build o image: indica de dónde sale la imagen.
  • ports: abre puertos hacia el exterior.
  • volumes: guarda datos o monta carpetas.
  • depends_on: controla el orden de arranque.
  • environment: pasa variables de configuración.
Docker Compose se encarga de crear la red interna para que los contenedores se comuniquen entre sí, la app se conecta a la base de datos usando el nombre "db" como si fuera un servidor. En la seccion "image: postgres:16-alpine" se usa "postgres:16-alpine", en este caso PostgreSQL si se quiere usar MySQL, u otra tecnología, hay que buscarla en la url Docker Hub escribir lo que se busca ,por ejemplo, python, nginx, mysql en la barra de búsqueda superior. Una vez se muestran los resultados, filtrar por "Docker Official Images" o "Verified Publisher" del menú de la izquierda.

Como empezar

Una vez creado los ficheros "dockerfile" y el fichero "docker-compose.yaml" ejecutar el comando "docker compose -f compose-docker.yml up -d --build", con este comando se constuye e instala todo. Cuando se termina de instalar todo, hay que ejecutar el comando "docker compose -f compose-docker.yml up -d" y empezar a trabajar con la tenología instalda y cuando se termina ejecutarr el comando "docker compose -f compose-docker.yml down".
Para volver a trabajar con todo volver a ejecutar el comando "docker compose -f compose-docker.yml up -d".
Para acceder a la máquina virtual ejecutar: "docker exec -it container_name bash ", "container_name" está definido en el fichero "focker-compose.yml"