Docker empaqueta una aplicación junto con todo lo que necesita para correr (librerías, dependencias, configuración) en un contenedor aislado y reproducible, para no depender de lo que esté instalado en tu máquina o en el servidor. Esta es una guía de referencia con los comandos que más uso en el día a día: gestión de imágenes, contenedores, redes, Docker Compose, backups y acceso por terminal — pensada para copiar y pegar directamente. Si necesitas repasar la sintaxis de los archivos .yml de Docker Compose, hay una guía rápida de YAML que la complementa.

Imágenes

# Listar las imágenes descargadas
docker images

# Descargar una imagen
docker pull mongo
docker pull mongo:18

# Eliminar una imagen
docker image rm mongo
docker image rm mongo:15

Crear y arrancar un contenedor

Para crear un contenedor primero necesitas una imagen. Hay dos formas de crear el contenedor a partir de ella.

1. Sin darle un nombre (Docker le asigna un ID):

docker create mongo
docker pull node:18
docker container create mongo

# Con el ID que te entrega, arrancas el contenedor
docker start 52164780c7623291954b18fb5073e05676c9ea344d253730995f50279d4b6ee4

2. Dándole un nombre (más cómodo para referenciarlo después):

docker create --name nombre_contenedor nombre_imagen

# Ejemplo
docker create --name mongoWork mongo
docker start mongoWork

Detener y eliminar un contenedor

docker stop id_contenedor
docker stop nombre_contenedor
docker rm nombre_contenedor

Listar contenedores

docker ps       # solo los que están corriendo
docker ps -a    # todos, incluidos los detenidos

Ver los logs

docker logs nombre_contenedor
docker logs --follow nombre_contenedor

Mapeo de puertos

docker create -p puerto_local:puerto_contenedor --name nombre_contenedor nombre_imagen

# Ejemplo
docker create -p 27017:27018 --name nombre_contenedor nombre_imagen

docker run (crea y arranca en un solo paso)

docker run -d mongo
docker run --name mongito -p 27017:27018 -d mongo

Redes de Docker

# Listar las redes configuradas
docker network ls

Listado de redes Docker

# Crear una red
docker network create miRed

Crear una red Docker

# Eliminar una red
docker network rm miRed

Eliminar una red Docker

Crear un contenedor dentro de una red

Primero se crea un Dockerfile con la definición de la imagen:

Dockerfile de ejemplo

Luego se construye la imagen desde ese directorio:

docker build -t nombreImagen:tag directorio

# Ejemplo
docker build -t myapp:v1 .

Build de la imagen

Para confirmar que la imagen se creó:

Listado de imágenes construidas

Y para crear los contenedores en la nueva red:

Crear contenedores en la red

Contenedores corriendo en la red

Docker Compose

docker-compose up
docker-compose up -d
docker-compose down
docker-compose start
docker-compose stop

# Con un archivo específico
docker compose -f docker-compose-dev.yml up
docker compose -f docker-compose-dev.yml down

Ejemplo: Node.js + MongoDB

version: "3"
# cada "service" es un contenedor
services:
  node-app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - PORT=3000
  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: tu_password
    volumes:
      - mongo-db:/data/db

Ejemplo alternativo: MongoDB + Mongo Express

version: '3.8'
services:
  mongodb:
    image: mongo
    container_name: mongodb
    restart: always
    ports:
      - 27018:27017
    volumes:
      - ./data:/data/db
    environment:
      - MONGO_INITDB_ROOT_USERNAME=user
      - MONGO_INITDB_ROOT_PASSWORD=tu_password
    expose:
      - 27018
    command: --quiet

  mongo-express:
    image: mongo-express
    container_name: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=user
      - ME_CONFIG_MONGODB_ADMINPASSWORD=tu_password
      - ME_CONFIG_MONGODB_SERVER=mongodb

networks:
  default:
    name: mongodb_network

Paso a paso para levantarlo y conectarte:

docker-compose up -d
docker exec -it nombre_contenedor bash
mongosh "mongodb://127.0.0.1:27017" --username user --authenticationDatabase admin
# dentro de mongosh:
show dbs

Acceder a un contenedor por terminal (exec)

docker exec -it id_contenedor bash
docker exec -it nombre_contenedor sh
docker exec -it nombre_contenedor bash

# Ejecutar un comando puntual sin entrar de forma interactiva
docker exec nombre_contenedor tail /var/log/date.log
docker exec --workdir /tmp nombre_contenedor pwd
docker exec --user guest nombre_contenedor whoami

# Pasando variables de entorno
docker exec -e TEST=valor nombre_contenedor env
docker exec -e TEST=valor -e ENTORNO=prod nombre_contenedor env
docker exec --env-file .env nombre_contenedor env

Crear contenedores comunes desde terminal

PostgreSQL:

docker run --name postgres12 -d --restart unless-stopped -p 5532:5432 \
  -e POSTGRES_PASSWORD=tu_password \
  -v $(pwd)/data:/var/lib/postgresql/data postgres:12.5

MySQL:

docker pull mysql/mysql-server:5.7.33

docker run --name mysqlServer -e MYSQL_ROOT_HOST=% \
  -v $(pwd)/volumen:/var/lib/mysql \
  -p 5533:3306 -e MYSQL_ROOT_PASSWORD=tu_password \
  mysql/mysql-server:5.7.33

Python (para pruebas rápidas):

docker run -d -i --name pythondev python bash
docker run -v $(pwd)/python3:/data -d -i --name pythondev python bash

Backup y restore de imágenes

# Guardar una imagen en un archivo .tar
docker save -o mysql.tar mysql-56
docker save busybox > busybox.tar
docker save --output busybox.tar busybox

# Restaurarla
docker load -i mysql.tar

Exportar e importar contenedores

# Exportar el filesystem de un contenedor
docker export wordpress > blog.tar
docker export --output="blog.tar" wordpress

# Importarlo como una nueva imagen
docker import http://ejemplo.com/imagenejemplo.tgz
docker import /ruta/hacia/imagenejemplo.tgz
cat imagenejemplo.tgz | docker import - imagenlocal:nueva
cat imagenejemplo.tgz | docker import --message "Imagen importada desde tarball" - imagenlocal:nueva
sudo tar -c . | docker import --change "ENV DEBUG true" - imagendesdedirectorio

docker inspect

docker inspect [OPCIONES] NOMBRE|ID [NOMBRE|ID...]

# Algunos formatos útiles
docker inspect --format='{{json .Config}}' $ID_CONTENEDOR
docker inspect --format='{{(index (index .NetworkSettings.Ports "8787/tcp") 0).HostPort}}' $ID_CONTENEDOR
docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $ID_CONTENEDOR
docker inspect --format='{{.Config.Image}}' $ID_CONTENEDOR
docker inspect --format='{{.LogPath}}' $ID_CONTENEDOR
docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $ID_CONTENEDOR
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $ID_CONTENEDOR
docker inspect --size micontenedor
docker inspect --type=volume mivolumen

docker cp

Copiar archivos entre tu máquina y un contenedor:

docker cp [OPCIONES] CONTENEDOR:RUTA_ORIGEN RUTA_DESTINO
docker cp RUTA_ORIGEN CONTENEDOR:RUTA_DESTINO

# Ejemplos
docker cp CONTENEDOR:/var/logs/ /tmp/app_logs
docker cp CONTENEDOR:/var/logs/app.log - | tar x -O | grep "ERROR"

Con esta guía a mano cubres el 90% de lo que necesitas en el trabajo diario con Docker: imágenes, contenedores, redes, Compose y backups.