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

# Crear una red
docker network create miRed

# Eliminar una red
docker network rm miRed

Crear un contenedor dentro de una red
Primero se crea un Dockerfile con la definición de la imagen:

Luego se construye la imagen desde ese directorio:
docker build -t nombreImagen:tag directorio
# Ejemplo
docker build -t myapp:v1 .

Para confirmar que la imagen se creó:

Y para crear los contenedores en la nueva 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.