¿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í.
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.
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"