Mi primera pelea con Docker: cómo terminé entendiendo contenedores a la fuerza

Durante mucho tiempo me resistí a aprender Docker. Veía tutoriales, gente en Twitter diciendo que “sin Docker no eres nadie” y yo seguía con mis servidores a la vieja usanza: instalando Node.js, configurando MySQL, y rezando para que todo funcionara igual en producción. Hasta que un día, obviamente, no funcionó igual.

Ahí fue cuando no me quedó otra que enfrentarme a Docker.

El clásico “en mi máquina funciona”

Tenía una aplicación que corría perfecto en mi portátil. Pero cuando la subí a un servidor remoto, comenzaron los problemas: versiones distintas de Node, dependencias rotas, base de datos con configuración rara. La frase “en mi máquina funciona” me perseguía.
Un compañero me dijo: “usa Docker y deja de sufrir”. Yo pensé que exageraba, pero resultó que tenía razón.

Primer contacto con un Dockerfile

El concepto básico es que Docker te deja crear contenedores: pequeños entornos aislados donde tu app corre igual aquí y en cualquier parte. Para eso se usa un Dockerfile.

# Dockerfile
FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]

Cuando escribí mi primer Dockerfile me pareció raro: ¿de verdad con esto puedo garantizar que mi app siempre corra igual? Spoiler: sí.

Levantando servicios con Docker Compose

El siguiente paso fue orquestar no solo mi aplicación, sino también la base de datos. Ahí conocí docker-compose, que permite levantar varios servicios con un solo comando.

# docker-compose.yml
version: "3"
services:
  app:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: testdb

Con esto ya tenía Node.js + MySQL corriendo juntos sin necesidad de instalar nada en mi máquina. Fue el momento en que entendí la verdadera magia de Docker.

Lo bueno y lo malo que descubrí

Lo bueno:

  • Adiós al “en mi máquina funciona”.
  • Portabilidad total: si funciona en Docker, funciona en cualquier servidor.
  • Fácil de compartir: con un docker-compose up levantas todo en segundos.

Lo malo:

  • La curva de aprendizaje al inicio es dura.
  • Los errores de red y permisos en contenedores me sacaron canas.
  • Mal configurado, puede ser más problema que solución.

Lo que aprendí al final

Docker no es opcional en proyectos serios. Tarde o temprano, vas a necesitarlo. Lo mejor es empezar con cosas sencillas: un contenedor para Node.js, otro para MySQL, y entender cómo se comunican.
Hoy no me imagino desplegar sin usar Docker, aunque sigo pensando que los primeros días fueron una tortura innecesaria.

Conclusión

Mi pelea con Docker terminó en una especie de reconciliación: me hizo sufrir, pero ahora me ahorra horas de dolores de cabeza. Si te pasa como a mí y todavía lo evitas, créeme, es mejor enfrentarlo antes de que el próximo “en mi máquina funciona” te arruine el proyecto.