Qué es Docker

¿Qué es Docker?

¿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:

ConceptoFunción
ImagenPlantilla
ContenedorInstancia ejecutable
DockerfileInstrucciones para construir una imagen
VolumenAlmacenamiento persistente
RedComunicación entre contenedores
RegistryAlmacé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ísticaVolumenBind mount
Gestionado por DockerSíNo
Ruta controlada por DockerSíNo
Comparte archivos del hostNo directamenteSí
PersistenciaSíSí
Útil para bases de datosSíDepende del caso
Útil para desarrolloSí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 latest sin 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.

Deja un comentario