ESC

Start typing to search across invoices, services, domains, tickets, and more...

Search... Ctrl+K
Servidores Linux

Cómo instalar Docker y Docker Compose en Ubuntu, Debian y Rocky Linux

7 pasos 17 min de lectura 6 vistas 0
Contenido

Esta guía explica cómo instalar Docker y Docker Compose en un servidor Linux usando el repositorio oficial de Docker, con comandos separados para Debian/Ubuntu y Rocky Linux/AlmaLinux. También cubre la configuración posterior a la instalación, la ejecución de su primer contenedor, los mirrors del registro y el error clásico de que Docker publique puertos saltándose su firewall. Se aplica a los VPS y servidores dedicados de IMIDC con un sistema operativo de 64 bits y acceso root.

Paso 1: Elimine los paquetes antiguos de Docker antes de instalar

Los paquetes de la distribución, como docker.io o podman-docker, entran en conflicto con Docker CE. En un sistema recién instalado, los comandos simplemente indicarán que no hay nada instalado. Al eliminar estos paquetes no se borran las imágenes ni los volúmenes existentes en /var/lib/docker.

# Debian / Ubuntu: eliminar paquetes de la distribución que entran en conflicto con Docker CE
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt-get remove -y $pkg; done

# Rocky Linux / AlmaLinux
dnf remove -y docker docker-client docker-client-latest docker-common docker-latest \
  docker-latest-logrotate docker-logrotate docker-engine podman runc

Paso 2: Instale Docker en Debian/Ubuntu desde el repositorio oficial

El repositorio oficial ofrece versiones más recientes que los repositorios de la distribución e incluye el plugin docker compose (Compose V2). Los comandos leen /etc/os-release para detectar Debian o Ubuntu y el nombre en clave de la versión, así que puede pegarlos tal cual.

apt-get update
apt-get install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
. /etc/os-release          # sets $ID (debian/ubuntu) and $VERSION_CODENAME
curl -fsSL https://download.docker.com/linux/$ID/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/$ID $VERSION_CODENAME stable" \
  > /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Paso 3: Instale Docker CE en Rocky Linux/AlmaLinux

En sistemas compatibles con RHEL, use el repositorio rhel de Docker, que funciona en Rocky Linux y AlmaLinux 8 y 9. Durante la primera instalación, dnf le pedirá aceptar la clave GPG de Docker; verifique la huella digital y responda y.

dnf install -y dnf-plugins-core
dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Paso 4: Inicie Docker y complete la configuración posterior a la instalación

Habilite el servicio al arranque y verifíquelo con hello-world. Para que un usuario normal pueda ejecutar docker sin sudo, añádalo al grupo docker, pero recuerde que pertenecer a este grupo otorga privilegios equivalentes a root, así que hágalo solo con cuentas de confianza.

systemctl enable --now docker
docker version
docker compose version
docker run --rm hello-world

# Opcional: permitir que un usuario normal ejecute docker (equivale a acceso root)
usermod -aG docker deploy
# cierre la sesión, vuelva a iniciarla como "deploy" y pruebe:
docker ps

Paso 5: Ejecute su primer contenedor con Docker Compose

Compose V2 se invoca como docker compose (con un espacio) y el nombre de archivo recomendado es compose.yaml. El siguiente ejemplo inicia un contenedor de Nginx vinculado solo a 127.0.0.1; más adelante puede publicarlo mediante un proxy inverso Nginx en el host con HTTPS (consulte nuestro tutorial de proxy inverso con Nginx).

mkdir -p /opt/web && cd /opt/web
cat > compose.yaml <<'EOF'
services:
  web:
    image: nginx:stable
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    restart: unless-stopped
EOF
mkdir -p html && echo "Hello from Docker" > html/index.html
docker compose up -d
docker compose ps
curl http://127.0.0.1:8080
docker compose logs -f web      # Ctrl+C to stop following

Paso 6: Configure un mirror del registro de Docker y límites de logs

Los servidores de IMIDC en Hong Kong, Japón, Corea del Sur y otras regiones normalmente acceden a Docker Hub directamente, por lo que rara vez se necesita un mirror. Si las descargas son lentas, añada un mirror de confianza en daemon.json (registry-mirrors solo se aplica a Docker Hub). También es recomendable limitar el tamaño de los logs de los contenedores para que no llenen el disco. Las descargas anónimas tienen límite de frecuencia, así que ejecute docker login si descarga imágenes a menudo.

mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": ["https://mirror.example.com"],
  "log-driver": "json-file",
  "log-opts": { "max-size": "20m", "max-file": "3" }
}
EOF
systemctl restart docker
docker info | grep -A2 "Registry Mirrors"

# Evitar los límites de descarga anónima de Docker Hub
docker login
daemon.json debe ser un JSON válido; una sola coma final impide que Docker arranque. Revise journalctl -u docker -n 50 si el reinicio falla.

Paso 7: Docker y el firewall (iptables, ufw, firewalld)

Docker escribe sus propias reglas de iptables/nftables para publicar puertos, y esas reglas se evalúan antes que las de ufw. Como resultado, un puerto publicado con -p 8080:80 es accesible desde Internet aunque ufw nunca haya permitido el 8080. La práctica más segura es vincular a 127.0.0.1 y poner la aplicación detrás de Nginx; si un puerto debe ser público, filtre los orígenes en la cadena DOCKER-USER.

# 1) Recomendado: publicar solo en localhost y exponer la app a través de Nginx
#    compose.yaml ->  ports: - "127.0.0.1:8080:80"

# 2) Restringir un puerto publicado en la cadena DOCKER-USER
#    (solo 198.51.100.20 puede acceder al puerto 8080 del contenedor por eth0)
iptables -I DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 8080 --ctdir ORIGINAL \
  ! -s 198.51.100.20 -j DROP
iptables -L DOCKER-USER -n --line-numbers

# 3) firewalld (Rocky/AlmaLinux): Docker añade su propia zona "docker"
firewall-cmd --get-active-zones
firewall-cmd --zone=docker --list-all

# Tras recargar o reiniciar el firewall, reinicie Docker para que regenere sus reglas
systemctl restart docker
Nunca exponga a Internet contenedores de bases de datos (MySQL, Redis, MongoDB) con -p 3306:3306. Es una de las causas más comunes de intrusiones y ataques de rescate (ransomware).

Preguntas frecuentes

¿Error «permission denied while trying to connect to the Docker daemon socket»?

Su usuario no está en el grupo docker o no ha vuelto a iniciar sesión desde que lo añadió. Ejecute id para comprobarlo, vuelva a conectarse por SSH o simplemente use root o sudo.

¿Qué diferencia hay entre docker-compose y docker compose?

docker-compose (con guion) es la herramienta independiente V1, ya retirada. docker compose es el plugin V2 que se instala con docker-compose-plugin. La sintaxis es en gran medida compatible, así que use V2 en todos los proyectos nuevos.

¿Los contenedores perdieron la conexión de red tras recargar el firewall?

Recargar firewalld o vaciar iptables elimina las reglas NAT que creó Docker. Ejecute systemctl restart docker y Docker las volverá a crear.

¿Sigue con problemas después de seguir estos pasos? Abra un ticket de soporte y el equipo técnico de IMIDC, disponible 24/7, le ayudará. Incluya la IP del servidor, la versión del sistema operativo, los comandos que ejecutó y la salida completa del error para que podamos localizar el problema más rápido.

¿Fue útil la respuesta?

Tutoriales relacionados