Docker: guía completa para principiantes (2025)
Conceptos, comandos esenciales, Dockerfile y Docker Compose en un solo lugar.

Docker permite empaquetar aplicaciones y dependencias en contenedores que funcionan igual en cualquier entorno. Esta guía reúne lo esencial para empezar bien.

1. ¿Qué es Docker?

Docker es una plataforma de contenedores. Los contenedores comparten el kernel del sistema, por eso son más ligeros que las máquinas virtuales.

  • Portabilidad: mismo comportamiento en cualquier entorno.
  • Consistencia: dev, QA y producción alineados.
  • Aislamiento: apps independientes.
  • Eficiencia: menos recursos que VMs.

2. Conceptos clave

  • Imagen: plantilla de solo lectura con la app.
  • Contenedor: instancia en ejecución de una imagen.
  • Dockerfile: receta para construir imágenes.

3. Instalar Docker

Windows y macOS: instala Docker Desktop desde el sitio oficial.

Linux (Ubuntu/Debian):

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce
docker --version

4. Comandos esenciales

Imágenes:

docker pull nginx
docker images
docker rmi nginx

Contenedores:

docker run -d -p 8080:80 nginx
docker ps
docker ps -a
docker stop <container_id>
docker rm <container_id>
docker exec -it <container_id> sh

5. Tu primer proyecto con Docker (Node.js)

Carpeta:

mkdir mi-primer-docker
cd mi-primer-docker

package.json:

{
  "name": "mi-primer-docker",
  "version": "1.0.0",
  "scripts": { "start": "node server.js" },
  "dependencies": { "express": "^4.18.0" }
}

server.js:

const express = require("express");
const app = express();
const PORT = process.env.PORT || 3000;

app.get("/", (req, res) => {
  res.send("<h1>Mi primera aplicación Docker!</h1>");
});

app.listen(PORT, () => console.log("Corriendo en el puerto " + PORT));

Dockerfile:

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

Build y run:

docker build -t mi-app .
docker run -d -p 3000:3000 --name mi-contenedor mi-app
curl http://localhost:3000

.dockerignore:

node_modules
npm-debug.log
.git
.DS_Store

6. Docker Compose

Para múltiples servicios, usa docker-compose.yml:

version: "3.8"
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    depends_on:
      - db
  db:
    image: postgres:13
    environment:
      POSTGRES_DB: miapp
      POSTGRES_USER: usuario
      POSTGRES_PASSWORD: clave
    volumes:
      - postgres_data:/var/lib/postgresql/data
volumes:
  postgres_data:

Ejecutar:

docker compose up -d
docker compose down

7. Buenas prácticas

  • Usa imágenes oficiales.
  • Aplica .dockerignore para reducir tamaño.
  • Combina capas cuando sea posible.
  • Usa multi-stage builds para proyectos grandes.
  • Evita ejecutar como root.
  • Agrega health checks.

Próximos pasos

Explora optimización de imágenes, CI/CD con Docker y orquestación con Docker Swarm o Kubernetes.