¿Qué es Docker? Guía completa y actualizada 2026
🟢 Actualizado: septiembre de 2026
Esta guía ha sido revisada y ampliada para explicar qué es Docker, cómo funcionan los contenedores, imágenes, volúmenes y redes, qué diferencia existe entre Docker y una máquina virtual, cómo funciona Docker Compose y cuáles son las principales recomendaciones de seguridad y mantenimiento para utilizar Docker en Linux.
Docker se ha convertido en una de las tecnologías más utilizadas para desarrollar, probar, distribuir y ejecutar aplicaciones.
Pero si nunca has trabajado con contenedores, algunos conceptos pueden resultar confusos: Docker Engine, imágenes, contenedores, Dockerfile, Docker Compose, volúmenes, redes, registros…
En esta guía vamos a entender Docker desde cero y, además, veremos ejemplos prácticos para que puedas empezar a utilizarlo en un servidor Linux.
¿Qué es Docker?
Docker es una plataforma para desarrollar, distribuir y ejecutar aplicaciones utilizando contenedores.
Un contenedor permite empaquetar una aplicación junto con buena parte de los elementos que necesita para ejecutarse, como:
- código;
- bibliotecas;
- dependencias;
- configuración;
- herramientas necesarias para su ejecución.
La idea fundamental es conseguir que una aplicación pueda ejecutarse de una forma mucho más consistente entre diferentes entornos.
Por ejemplo, podemos desarrollar una aplicación en nuestro ordenador, empaquetarla en una imagen Docker y posteriormente ejecutarla en un servidor Linux.
Docker utiliza mecanismos de aislamiento proporcionados por el sistema operativo para ejecutar los procesos dentro de contenedores.
A diferencia de una máquina virtual tradicional, un contenedor no necesita ejecutar un sistema operativo completo independiente para cada aplicación.
Esto permite utilizar los recursos del servidor de una forma diferente a la virtualización tradicional.
¿Para qué sirve Docker?
Docker puede utilizarse durante prácticamente todo el ciclo de vida de una aplicación.
Algunos de sus usos más habituales son:
- crear entornos de desarrollo reproducibles;
- ejecutar aplicaciones sin instalarlas directamente en el sistema anfitrión;
- realizar pruebas;
- desplegar aplicaciones;
- ejecutar microservicios;
- crear entornos de integración continua;
- levantar bases de datos temporalmente;
- ejecutar servicios web;
- distribuir aplicaciones;
- separar diferentes servicios dentro de un mismo servidor.
Por ejemplo, podemos tener un servidor Linux ejecutando:
Nginx
MariaDB
Redis
WordPress
Nextcloud
Grafana
y algunos de esos servicios pueden ejecutarse dentro de contenedores independientes.
Esto permite separar componentes y administrar cada uno de ellos de forma independiente.
¿Cómo funciona Docker?
Docker utiliza una arquitectura basada en varios componentes.
Simplificando bastante, podemos imaginarla así:
Docker CLI
│
▼
Docker Engine
│
┌──────────────┼──────────────┐
▼ ▼ ▼
Container Container Container
│ │ │
▼ ▼ ▼
Image Image Image
│
├── Volumes
└── Networks
Cuando ejecutamos un comando como:
docker run nginx
Docker comprueba si dispone localmente de la imagen necesaria.
Si no existe, puede descargarla desde un registro como Docker Hub.
Después crea un contenedor a partir de esa imagen y ejecuta el proceso correspondiente.
La documentación oficial describe precisamente este funcionamiento: una imagen actúa como plantilla de solo lectura y un contenedor es una instancia ejecutable de esa imagen.
Docker Engine
Docker Engine es el componente encargado de ejecutar y administrar los contenedores.
Entre otras cosas, gestiona:
- contenedores;
- imágenes;
- redes;
- volúmenes;
- comunicación con el daemon de Docker.
El daemon se ejecuta como:
dockerd
y recibe las instrucciones enviadas mediante la API de Docker.
Cuando escribimos:
docker ps
o:
docker run nginx
el cliente Docker se comunica con el motor para realizar la operación solicitada.
La arquitectura oficial de Docker utiliza precisamente esta relación entre cliente y daemon.
Docker CLI
Docker CLI es la herramienta de línea de comandos que utilizamos habitualmente para administrar Docker.
Por ejemplo:
docker ps
muestra los contenedores en ejecución.
docker images
muestra las imágenes disponibles localmente.
docker pull nginx
descarga una imagen.
docker run nginx
crea y ejecuta un contenedor.
docker stop nginx
detiene un contenedor.
La CLI es, en la práctica, la puerta de entrada principal para administrar Docker desde Linux.
¿Qué es una imagen Docker?
Una imagen Docker es una plantilla inmutable utilizada para crear contenedores.
Podemos imaginarla como una especie de «molde» a partir del cual Docker crea instancias ejecutables.
Por ejemplo:
nginx:latest
es una referencia a una imagen de Nginx.
Podemos descargarla con:
docker pull nginx
Y después crear un contenedor:
docker run nginx
Una imagen puede estar formada por diferentes capas.
Esto permite reutilizar capas comunes entre diferentes imágenes y evitar reconstruir desde cero todos los componentes cuando realizamos pequeños cambios.
¿Qué es un contenedor Docker?
Un contenedor es una instancia ejecutable de una imagen.
Esta diferencia es fundamental:
Imagen
│
├── Contenedor 1
├── Contenedor 2
└── Contenedor 3
Podemos tener una única imagen y crear varios contenedores a partir de ella.
Por ejemplo:
docker run -d --name web1 nginx
docker run -d --name web2 nginx
Ahora tendremos dos contenedores independientes basados en la imagen de Nginx.
Podemos comprobarlos:
docker ps
Imagen vs contenedor
Una forma sencilla de entenderlo es:
| Concepto | Función |
|---|---|
| Imagen | Plantilla |
| Contenedor | Instancia ejecutable |
| Dockerfile | Instrucciones para construir una imagen |
| Volumen | Almacenamiento persistente |
| Red | Comunicación entre contenedores |
| Registry | Almacén de imágenes |
Esta distinción es una de las primeras cosas que debemos aprender cuando empezamos con Docker.
¿Qué es Docker Hub?
Docker Hub es un registro de imágenes Docker.
Podemos encontrar imágenes publicadas para numerosos proyectos y tecnologías.
Por ejemplo:
nginx
redis
mariadb
ubuntu
postgres
wordpress
Cuando ejecutamos:
docker pull nginx
Docker busca la imagen en el registro configurado.
Docker Hub es el registro público utilizado habitualmente por Docker, aunque también podemos utilizar registros privados o alojados por organizaciones.
¿Qué es un Dockerfile?
Un Dockerfile es un archivo de texto que contiene las instrucciones necesarias para construir una imagen Docker.
Ejemplo sencillo:
FROM ubuntu:24.04
RUN apt update && apt install -y nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Podemos construir la imagen con:
docker build -t mi-nginx .
Después podemos comprobarla:
docker images
Y ejecutarla:
docker run -d -p 8080:80 mi-nginx
Ahora el Nginx del contenedor estará disponible mediante el puerto 8080 del servidor.
¿Qué significa FROM en Dockerfile?
La instrucción:
FROM
define la imagen base.
Por ejemplo:
FROM ubuntu:24.04
indica que nuestra imagen comienza a partir de Ubuntu 24.04.
También podemos utilizar imágenes especializadas:
FROM nginx:alpine
o:
FROM python:3.13
La elección de la imagen base influye en el tamaño, compatibilidad, mantenimiento y superficie de ataque de nuestra imagen.
¿Qué significa RUN?
La instrucción:
RUN
permite ejecutar comandos durante la construcción de la imagen.
Ejemplo:
RUN apt update && apt install -y curl
El resultado queda incorporado en una capa de la imagen.
Por ello conviene mantener los Dockerfiles limpios y evitar instalar software innecesario.
¿Qué significa CMD?
CMD define el comando que se ejecutará por defecto cuando se inicie el contenedor.
Por ejemplo:
CMD ["nginx", "-g", "daemon off;"]
El proceso principal del contenedor debe mantenerse en ejecución para que el contenedor permanezca activo.
¿Qué significa EXPOSE?
Podemos utilizar:
EXPOSE 80
para documentar que la aplicación utiliza el puerto 80 dentro del contenedor.
Pero es importante comprender que EXPOSE no publica automáticamente el puerto en el servidor.
Para publicar un puerto utilizaremos, por ejemplo:
docker run -p 8080:80 nginx
Aquí:
8080 → puerto del host
80 → puerto del contenedor
Por tanto:
http://servidor:8080
llegará al puerto 80 del contenedor.
¿Qué son los volúmenes Docker?
Los contenedores no deberían utilizar su capa interna como único lugar para almacenar datos importantes.
Si eliminamos el contenedor, los datos que no estén almacenados de forma persistente pueden desaparecer.
Docker ofrece volúmenes para solucionar este problema.
Podemos crear uno:
docker volume create datos
Comprobarlo:
docker volume ls
Y utilizarlo:
docker run -d \
--name servidor \
--mount source=datos,target=/datos \
nginx
Los volúmenes permiten mantener datos independientemente del ciclo de vida del contenedor.
La documentación de Docker diferencia especialmente entre volúmenes y bind mounts, ambos utilizados para persistencia o intercambio de archivos.
¿Qué es un bind mount?
Un bind mount permite montar directamente un directorio del servidor dentro del contenedor.
Por ejemplo:
docker run -d \
--name nginx \
--mount type=bind,source=/var/www/html,target=/usr/share/nginx/html \
nginx
En este caso:
Servidor:
/var/www/html
│
▼
Contenedor:
/usr/share/nginx/html
Esto resulta especialmente útil cuando queremos trabajar directamente con archivos existentes en el host.
Volúmenes vs bind mounts
| Característica | Volumen | Bind mount |
|---|---|---|
| Gestionado por Docker | Sí | No |
| Ruta controlada por Docker | Sí | No |
| Comparte archivos del host | No directamente | Sí |
| Persistencia | Sí | Sí |
| Útil para bases de datos | Sí | Depende del caso |
| Útil para desarrollo | Sí | Sí |
La elección depende de la aplicación y de cómo queramos administrar los datos.
¿Qué son las redes Docker?
Los contenedores también pueden comunicarse mediante redes.
Podemos crear una:
docker network create mi-red
Después:
docker run -d \
--name web \
--network mi-red \
nginx
Y otro contenedor:
docker run -d \
--name redis \
--network mi-red \
redis
Los contenedores conectados a la misma red Docker pueden comunicarse utilizando sus nombres como nombres DNS.
Por ejemplo, una aplicación podría conectarse al servicio Redis utilizando:
redis
como hostname.
Esta capacidad es especialmente útil en arquitecturas formadas por varios servicios.
¿Qué es Docker Compose?
Cuando una aplicación está formada por varios contenedores, ejecutar cada uno manualmente puede convertirse rápidamente en un pequeño festival de terminal.
Para estos escenarios tenemos Docker Compose.
Compose permite definir una aplicación multicontenedor mediante un archivo YAML.
Ejemplo:
services:
web:
image: nginx:alpine
ports:
- "8080:80"
redis:
image: redis:alpine
Podemos guardar esto como:
compose.yaml
y ejecutar:
docker compose up -d
Comprobar:
docker compose ps
Y detener:
docker compose down
La documentación actual utiliza el comando:
docker compose
con el plugin de Compose, en lugar de depender del antiguo comando separado docker-compose.
Docker Compose frente a Docker Compose antiguo
En tutoriales antiguos podemos encontrar:
docker-compose up -d
Mientras que la sintaxis moderna es:
docker compose up -d
El segundo formato corresponde al plugin actual de Docker Compose.
Para comprobar la versión:
docker compose version
Docker recomienda instalar el plugin mediante su repositorio oficial cuando sea posible, ya que las instalaciones manuales requieren gestionar las actualizaciones por separado.
Ejemplo práctico con Nginx
Podemos crear un proyecto:
mkdir docker-nginx
cd docker-nginx
Creamos:
compose.yaml
con:
services:
nginx:
image: nginx:alpine
container_name: nginx-demo
ports:
- "8080:80"
restart: unless-stopped
Iniciamos:
docker compose up -d
Comprobamos:
docker compose ps
Ahora Nginx estará disponible en:
http://IP_DEL_SERVIDOR:8080
Para detenerlo:
docker compose down
¿Cómo instalar Docker en Ubuntu?
En 2026, Docker proporciona un repositorio oficial para Ubuntu.
Las versiones de Ubuntu soportadas por la documentación actual incluyen Ubuntu 24.04 LTS, además de otras versiones soportadas.
Primero:
sudo apt update
Instalamos dependencias:
sudo apt install ca-certificates curl -y
Creamos el directorio de claves:
sudo install -m 0755 -d /etc/apt/keyrings
Descargamos la clave oficial:
sudo curl -fsSL \
https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
Asignamos permisos:
sudo chmod a+r /etc/apt/keyrings/docker.asc
Creamos el repositorio:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
Actualizamos:
sudo apt update
Instalamos Docker Engine:
sudo apt install \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin \
-y
La documentación oficial recomienda actualmente este método mediante el repositorio de Docker para instalaciones normales. El script de conveniencia get.docker.com está orientado principalmente a pruebas y desarrollo, no como método recomendado para producción.
Comprobar Docker
Comprobamos el servicio:
sudo systemctl status docker
También podemos ejecutar:
docker version
Y:
docker info
Finalmente:
sudo docker run hello-world
Si todo funciona correctamente, Docker descargará la imagen de prueba y ejecutará el contenedor.
¿Cómo instalar Docker en Debian?
Docker también proporciona un repositorio oficial para Debian.
La documentación actual contempla Debian 13 (Trixie) como versión estable y Debian 12 (Bookworm) como oldstable.
El procedimiento es similar.
Primero:
sudo apt update
sudo apt install ca-certificates curl -y
Creamos el directorio:
sudo install -m 0755 -d /etc/apt/keyrings
Descargamos la clave:
sudo curl -fsSL \
https://download.docker.com/linux/debian/gpg \
-o /etc/apt/keyrings/docker.asc
Y:
sudo chmod a+r /etc/apt/keyrings/docker.asc
Creamos el repositorio:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
Actualizamos:
sudo apt update
Instalamos:
sudo apt install \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin \
-y
Después:
sudo docker run hello-world
¿Docker funciona en Windows y macOS?
Sí.
Docker Desktop proporciona un entorno para trabajar con Docker en:
- Windows;
- macOS;
- Linux.
En servidores Linux normalmente utilizaremos directamente Docker Engine.
Para un servidor de producción no necesitamos instalar Docker Desktop.
Docker vs máquinas virtuales
Una de las preguntas más frecuentes es:
¿Docker sustituye a las máquinas virtuales?
No exactamente.
Son tecnologías diferentes.
Una máquina virtual normalmente utiliza:
Servidor físico
│
▼
Hipervisor
│
┌────┴────┐
▼ ▼
VM 1 VM 2
│ │
SO SO
│ │
App App
Con contenedores:
Servidor físico
│
▼
Sistema operativo
│
▼
Docker Engine
┌──┼──┐
▼ ▼ ▼
C1 C2 C3
Los contenedores comparten el kernel del sistema anfitrión, mientras que las máquinas virtuales incluyen su propio sistema operativo invitado.
Esto puede hacer que los contenedores sean más ligeros para determinados escenarios.
Pero una VM puede proporcionar un aislamiento diferente y resulta apropiada para otros casos.
Por tanto, Docker y la virtualización no son enemigos.
De hecho, Docker puede ejecutarse perfectamente dentro de una máquina virtual.
Docker y microservicios
Docker encaja especialmente bien con arquitecturas de microservicios.
Podemos tener:
Aplicación
│
┌────────────┼────────────┐
▼ ▼ ▼
API Redis Base de datos
Container Container Container
Cada servicio puede tener:
- su propia imagen;
- sus propias dependencias;
- su configuración;
- su ciclo de vida.
Esto permite actualizar determinados componentes sin tener que empaquetar toda la aplicación como una única unidad.
Docker en desarrollo
Uno de los grandes beneficios de Docker aparece durante el desarrollo.
Imaginemos que un proyecto necesita:
PHP
MariaDB
Redis
Nginx
En lugar de instalar todos estos componentes directamente en nuestro ordenador podemos definirlos mediante Docker Compose.
El proyecto puede incluir:
proyecto/
├── compose.yaml
├── Dockerfile
├── src/
└── config/
Otro desarrollador puede clonar el proyecto y ejecutar:
docker compose up -d
y obtener una infraestructura muy similar.
Esto reduce muchos de los clásicos problemas de:
«En mi ordenador funciona.»
Docker para pruebas
También podemos utilizar contenedores para crear entornos temporales.
Por ejemplo:
docker run --rm nginx
Cuando termina el proceso, el contenedor puede eliminarse.
Esto resulta útil para:
- pruebas;
- experimentos;
- laboratorios;
- integración continua;
- comprobaciones rápidas.
No necesitamos contaminar permanentemente el sistema anfitrión con cada experimento.
Docker y CI/CD
Docker también se utiliza ampliamente en procesos de integración y entrega continua.
Un pipeline puede:
Código
│
▼
Build
│
▼
Imagen Docker
│
▼
Tests
│
▼
Registry
│
▼
Producción
Esto permite utilizar una misma imagen como unidad de distribución entre diferentes etapas.
¿Docker es seguro?
Docker proporciona aislamiento, pero un contenedor no debe considerarse una frontera de seguridad absoluta.
La seguridad depende de cómo configuremos:
- imágenes;
- permisos;
- capacidades Linux;
- redes;
- volúmenes;
- secretos;
- puertos;
- usuarios;
- daemon;
- sistema anfitrión.
Un contenedor mal configurado puede introducir riesgos en el servidor.
Por eso no debemos pensar:
«Está dentro de Docker, por lo tanto es imposible que afecte al servidor.»
Ese razonamiento es peligroso.
Docker y el usuario root
Uno de los aspectos importantes de Docker en Linux es el acceso al daemon.
El grupo docker permite ejecutar comandos Docker sin utilizar sudo, pero otorgar acceso al daemon Docker implica privilegios importantes.
Por ello no debemos añadir usuarios al grupo docker automáticamente sin comprender las implicaciones de seguridad.
En servidores compartidos o entornos sensibles debemos estudiar cuidadosamente quién tiene acceso al daemon.
Docker también proporciona alternativas como el modo rootless, que permite ejecutar Docker sin que el daemon necesite privilegios root tradicionales en determinados escenarios.
Docker y los firewalls
Este es uno de los puntos que más fácilmente se pasa por alto.
Supongamos que ejecutamos:
docker run -d -p 8080:80 nginx
Estamos publicando un puerto del contenedor en el host.
La documentación oficial de Docker advierte que los puertos publicados por Docker pueden interactuar de forma diferente con UFW y firewalld y que determinadas reglas de firewall pueden ser evitadas por el tráfico de Docker. Para configuraciones con filtrado, Docker documenta el uso de la cadena DOCKER-USER.
Por eso no debemos asumir que:
sudo ufw deny 8080
es suficiente para controlar todos los escenarios de tráfico generado o publicado por Docker.
Si el servidor está expuesto a Internet, debemos diseñar conscientemente:
- puertos publicados;
- reglas de firewall;
- redes Docker;
- proxy inverso;
- reglas
DOCKER-USER; - servicios accesibles desde Internet.
No publicar puertos innecesariamente
Si un servicio únicamente necesita ser accesible por otros contenedores, no siempre debemos publicarlo en el host.
Por ejemplo, en lugar de:
ports:
- "6379:6379"
podemos permitir que Redis sea accesible solamente desde una red Docker interna.
La diferencia es importante:
Internet
│
▼
Nginx
│
▼
Red Docker interna
├── Aplicación
├── Redis
└── MariaDB
En este escenario Redis y MariaDB no necesitan estar publicados directamente en Internet.
Buenas prácticas con imágenes Docker
Antes de utilizar una imagen conviene comprobar:
- quién la mantiene;
- cuándo se actualizó;
- qué versión contiene;
- qué dependencias instala;
- qué permisos requiere;
- qué puertos expone;
- qué volumen necesita;
- qué usuario utiliza;
- si existen vulnerabilidades conocidas.
No deberíamos descargar imágenes desconocidas y ejecutarlas como root simplemente porque tengan muchas descargas.
Utilizar versiones concretas
En lugar de depender siempre de:
latest
podemos utilizar versiones concretas cuando necesitamos reproducibilidad.
Por ejemplo:
services:
nginx:
image: nginx:1.29
Esto evita que un despliegue futuro cambie automáticamente de versión mayor simplemente porque se haya actualizado el tag latest.
Para entornos de producción podemos llegar incluso a fijar imágenes mediante digest cuando necesitemos máxima reproducibilidad.
Mantener las imágenes actualizadas
Las imágenes también necesitan mantenimiento.
Podemos comprobar las imágenes disponibles:
docker images
Y revisar los contenedores:
docker ps -a
Cuando actualicemos una aplicación debemos comprobar:
- compatibilidad;
- cambios de configuración;
- migraciones;
- backups;
- cambios en volúmenes;
- cambios en puertos;
- cambios en variables de entorno.
No debemos actualizar contenedores de producción a ciegas.
Eliminar recursos que ya no utilizamos
Docker puede acumular:
- imágenes antiguas;
- contenedores detenidos;
- redes;
- cachés de compilación;
- volúmenes.
Podemos revisar los recursos:
docker system df
Y, después de comprobar qué podemos eliminar:
docker system prune
Hay que tener cuidado con las opciones de limpieza más agresivas.
Nunca debemos borrar volúmenes importantes sin verificar antes qué datos contienen.
Logs de Docker
Podemos consultar los logs de un contenedor:
docker logs nombre-contenedor
Para seguirlos en tiempo real:
docker logs -f nombre-contenedor
Con Compose:
docker compose logs
O:
docker compose logs -f
Los logs son fundamentales para diagnosticar:
- errores de configuración;
- problemas de conexión;
- aplicaciones que se reinician;
- errores de permisos;
- fallos de red.
Reinicio automático de contenedores
Podemos configurar una política de reinicio:
restart: unless-stopped
Por ejemplo:
services:
web:
image: nginx:alpine
restart: unless-stopped
Esto permite que Docker vuelva a iniciar el contenedor después de determinados eventos, como un reinicio del servidor.
No obstante, una política de reinicio no sustituye a la monitorización.
Si una aplicación entra en un ciclo de fallos, podemos terminar con un contenedor que simplemente se reinicia una y otra vez.
¿Docker guarda los datos de forma permanente?
No debemos asumir que los datos internos de un contenedor son permanentes.
La capa de escritura del contenedor está vinculada a su ciclo de vida.
Para información importante debemos utilizar:
- volúmenes;
- bind mounts;
- sistemas externos de almacenamiento;
- bases de datos adecuadamente configuradas.
Por ejemplo:
Contenedor
│
▼
/var/lib/mysql
│
▼
Volumen Docker
│
▼
Datos persistentes
Los volúmenes son precisamente uno de los mecanismos de Docker para mantener datos independientemente de que un contenedor sea eliminado y recreado.
Docker no sustituye a los backups
Este punto merece estar grabado en piedra.
Tener:
volume
no significa:
backup
Un volumen protege frente a determinadas situaciones del ciclo de vida del contenedor, pero no necesariamente frente a:
- fallo del disco;
- ransomware;
- borrado accidental;
- corrupción;
- error humano;
- pérdida del servidor.
Por eso los datos importantes de Docker deben incluirse en una estrategia de copias de seguridad.
En un servidor de producción conviene tener al menos:
Servidor
│
├── Configuración
├── Volúmenes
├── Bases de datos
└── Secretos necesarios
│
▼
Backup
│
▼
Ubicación independiente
Docker y Kubernetes
Docker y Kubernetes suelen aparecer juntos, pero no son lo mismo.
Docker es una plataforma para construir y ejecutar contenedores.
Kubernetes es una plataforma de orquestación de contenedores.
Podemos simplificar:
Docker
│
└── Ejecuta contenedores
Kubernetes
│
├── Gestiona despliegues
├── Escala aplicaciones
├── Gestiona servicios
├── Supervisa pods
└── Orquesta cargas
Para un servidor doméstico o una aplicación pequeña, Docker Compose puede ser suficiente.
Para infraestructuras mucho más grandes, Kubernetes puede ser apropiado.
Docker frente a LXC
Docker no es el único sistema de contenedores.
También existen tecnologías como:
- LXC;
- LXD;
- Podman;
- containerd;
- Kubernetes.
LXC está más orientado al concepto de contenedores de sistema, mientras que Docker se ha popularizado especialmente alrededor del empaquetado y distribución de aplicaciones.
En tu propia infraestructura puedes encontrar ambas tecnologías, y no necesariamente tienes que elegir una sola para todos los casos.
Docker y Podman
Podman es otra alternativa para ejecutar contenedores.
Una diferencia importante es que Podman fue diseñado con un enfoque daemonless y puede utilizarse en escenarios rootless.
Docker, por su parte, cuenta con un ecosistema enorme y herramientas como Docker Compose, Docker Hub y Docker Desktop.
La elección depende del proyecto, infraestructura y requisitos de seguridad.
¿Cuándo merece la pena utilizar Docker?
Docker resulta especialmente interesante cuando:
- una aplicación tiene muchas dependencias;
- queremos entornos reproducibles;
- necesitamos desplegar varios servicios;
- queremos aislar aplicaciones;
- utilizamos CI/CD;
- trabajamos con microservicios;
- necesitamos levantar entornos de pruebas rápidamente;
- queremos distribuir una aplicación de forma consistente.
¿Cuándo Docker puede no ser necesario?
No todo necesita Docker.
Para una aplicación extremadamente sencilla, instalar directamente:
Nginx
PHP
MariaDB
puede ser perfectamente válido.
Añadir una capa de contenedores sin necesidad puede aumentar la complejidad operativa.
La pregunta correcta no debería ser:
«¿Puedo meter esto en Docker?»
sino:
«¿Docker aporta una ventaja real a esta aplicación?»
Comandos Docker imprescindibles
Si estás empezando, estos son algunos de los comandos que conviene aprender primero.
Ver versión
docker version
Información del sistema
docker info
Ver contenedores activos
docker ps
Ver todos los contenedores
docker ps -a
Descargar una imagen
docker pull nginx
Ejecutar un contenedor
docker run nginx
Ejecutar en segundo plano
docker run -d nginx
Ver imágenes
docker images
Detener un contenedor
docker stop nombre
Iniciar un contenedor
docker start nombre
Reiniciar un contenedor
docker restart nombre
Eliminar un contenedor
docker rm nombre
Ver logs
docker logs nombre
Entrar en un contenedor
docker exec -it nombre bash
Si la imagen no incluye Bash:
docker exec -it nombre sh
Comandos Docker Compose imprescindibles
Iniciar servicios
docker compose up -d
Detener servicios
docker compose down
Ver servicios
docker compose ps
Ver logs
docker compose logs
Seguir logs
docker compose logs -f
Reconstruir imágenes
docker compose build
Actualizar y recrear servicios
docker compose pull
docker compose up -d
Checklist de Docker para principiantes
Antes de poner un proyecto Docker en producción:
- Docker Engine actualizado.
- Docker Compose actualizado.
- Imágenes procedentes de fuentes confiables.
- Versiones de imagen controladas.
- No utilizar
latestsin conocer las consecuencias. - Contenedores ejecutados con el mínimo privilegio posible.
- Puertos publicados estrictamente necesarios.
- Redes Docker correctamente separadas.
- Datos importantes almacenados en volúmenes o almacenamiento externo.
- Backups configurados.
- Backups probados.
- Logs monitorizados.
- Recursos antiguos revisados periódicamente.
- Firewall revisado teniendo en cuenta el comportamiento de Docker.
- No exponer MariaDB, Redis u otros servicios internos innecesariamente.
- Secretos fuera del código fuente.
- Imágenes actualizadas regularmente.
- Cambios probados antes de aplicarlos a producción.
Preguntas frecuentes sobre Docker
¿Docker es una máquina virtual?
No. Docker utiliza contenedores y mecanismos de aislamiento del sistema operativo. Las máquinas virtuales ejecutan sistemas operativos invitados completos.
¿Docker es gratis?
Docker Engine es software disponible para distintos usos y plataformas, pero el ecosistema de Docker incluye diferentes productos y servicios con condiciones propias.
¿Qué es un contenedor?
Es una instancia ejecutable de una imagen Docker.
¿Qué es una imagen Docker?
Es una plantilla utilizada para crear contenedores.
¿Qué es Docker Compose?
Es una herramienta para definir y ejecutar aplicaciones compuestas por varios contenedores.
¿Qué es Docker Hub?
Es un registro de imágenes Docker donde se pueden publicar, distribuir y descargar imágenes.
¿Docker necesita Linux?
Docker Engine utiliza tecnologías del kernel Linux, aunque Docker también proporciona soluciones para trabajar con contenedores desde Windows y macOS mediante Docker Desktop.
¿Docker sirve para producción?
Sí. Docker puede utilizarse en producción, siempre que se configure correctamente la infraestructura, seguridad, almacenamiento, monitorización, actualizaciones y copias de seguridad.
¿Docker es seguro?
Docker proporciona mecanismos de aislamiento, pero la seguridad depende de la configuración del host, daemon, contenedores, imágenes, redes, permisos y almacenamiento.
¿Docker sustituye a Kubernetes?
No. Docker y Kubernetes resuelven problemas diferentes. Docker proporciona herramientas para crear y ejecutar contenedores, mientras Kubernetes se utiliza principalmente para orquestar cargas de contenedores a mayor escala.
Conclusión: ¿qué es Docker realmente?
Docker es una plataforma que permite empaquetar, distribuir y ejecutar aplicaciones mediante contenedores.
Su funcionamiento puede resumirse así:
Dockerfile
│
▼
Imagen
│
▼
Contenedor
│
┌──┴─────────┐
▼ ▼
Volumen Red
│ │
▼ ▼
Datos Servicios
La potencia de Docker no está únicamente en ejecutar un contenedor.
Está en poder convertir una aplicación y buena parte de su entorno en una unidad reproducible que puede pasar de desarrollo a pruebas y posteriormente a producción con una infraestructura mucho más consistente.
Para empezar no necesitas aprender cientos de comandos.
Domina primero estos conceptos:
Imagen
Contenedor
Dockerfile
Volumen
Red
Docker Compose
Registry
Después aprende a administrar:
logs
backups
actualizaciones
seguridad
redes
permisos
monitorización
Y entonces Docker deja de parecer una caja negra llena de comandos y empieza a convertirse en una herramienta bastante elegante para construir servidores y aplicaciones modernas.





