Ir directamente al contenido

Ajustes de cookies

Elija por tipo qué cookies permite. Puede cambiar su elección en cualquier momento en Ajustes de cookies, al pie de cada página. Declaración de privacidad

Necesarias

Siempre activadas

Necesarias para iniciar sesión, conservar su carrito y recordar sus preferencias. Siempre están activadas.

¿Qué cookies?
  • weboke_sessie, weboke_klant, weboke_remember: su sesión y mantener la sesión iniciada
  • weboke_basket: su carrito
  • wkBtwIncl: mostrar los precios con o sin IVA
  • wok_cookies: su elección de cookies, 12 meses

Mide qué anuncio lleva a una visita o a un pedido, para no pagar por anuncios que no sirven de nada.

¿Qué cookies?
  • Google Ads a través de Google Tag Manager (_gcl_au, _gcl_aw), hasta 90 días
  • OpenAI Ads, anuncios en ChatGPT
  • wok_aff: a través de qué socio llegó a nosotros (programa de afiliados), 60 días

4,6

País e idioma

Cada país tiene su propio sitio, con los precios y el IVA de ese país.

Ver

Módulo 9 · 9.2

Instalar Docker y su primer contenedor

Módulo 9: Docker y docker compose · Tiempo de lectura: 11 minutos

Objetivo de aprendizaje: Después de esta lección sabrá instalar Docker Engine desde el repositorio oficial de paquetes; iniciar, consultar, inspeccionar por dentro y limpiar contenedores; y entenderá por qué el grupo docker equivale a root.

Conceptos clave: Docker Engine, Docker Desktop, repositorio apt oficial, docker.io de Debian, grupo docker, modo rootless, docker run, -d, -p, -v, --name, docker ps, docker logs, docker exec, docker stop, docker rm, docker image prune, docker system df

¿Qué Docker?

En un servidor se instala Docker Engine: el servicio en segundo plano (dockerd) más el comando docker. Docker Desktop es otra cosa: un programa con ventanas para Windows, macOS y escritorios Linux. No tiene cabida en un servidor.

Hay dos fuentes fiables para Docker Engine:

  1. El repositorio de paquetes de Docker (download.docker.com). Siempre la versión más reciente, incluido el plug-in docker compose que utilizará en la lección 9.3. Es lo que describe la documentación de Docker y lo que usa este curso.
  2. El paquete docker.io de Debian o Ubuntu. Más antiguo, pero la distribución lo mantiene al día mediante sus actualizaciones de seguridad habituales (lección 4.2). Es perfectamente válido si prefiere no tener nada de fuera de la distribución; en ese caso, compruebe que docker compose (con un espacio) esté disponible.

Elija una de las dos. Mezclarlas provoca conflictos; por eso la documentación de Docker indica que primero se eliminen paquetes no oficiales como docker.io, docker-compose y podman-docker.

Instalar desde el repositorio de Docker

Estos son los pasos de la documentación de Docker para Debian, con la clave por separado y un Signed-By propio (lección 4.1). Si lo desea, haga antes una instantánea (snapshot).

anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install ca-certificates curl
anna@web1:~$ sudo install -m 0755 -d /etc/apt/keyrings
anna@web1:~$ sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
anna@web1:~$ sudo chmod a+r /etc/apt/keyrings/docker.asc

A continuación, el archivo de repositorio /etc/apt/sources.list.d/docker.sources (formato deb822):

Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc

En Suites va el nombre en clave de su versión (cat /etc/os-release, lección 4.3) y en Architectures la salida de dpkg --print-architecture. En Ubuntu, la URL es https://download.docker.com/linux/ubuntu y la suite es, por ejemplo, noble.

Después, la instalación:

anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
anna@web1:~$ sudo docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.

En Debian y Ubuntu, Docker se inicia automáticamente tras la instalación y también después de cada reinicio (systemctl status docker, lección 6.1).

Atención: por defecto, unattended-upgrades (lección 4.2) no actualiza automáticamente los paquetes de este repositorio. Incluya sudo apt update && sudo apt upgrade para Docker en su rutina de mantenimiento (lección 10.4), o añada el repositorio de forma consciente a sus actualizaciones automáticas.

El grupo docker es root

En todo internet encontrará que debe añadirse al grupo docker para no tener que escribir sudo:

anna@web1:~$ sudo usermod -aG docker anna

Hágalo solo si entiende lo que implica. La documentación de Docker es clara: el grupo docker otorga privilegios de nivel root. Quien puede controlar el servicio Docker puede iniciar un contenedor con todo el disco del host montado dentro:

docker run -it -v /:/host debian chroot /host

y con ello es root en su servidor, sin contraseña y sin dejar rastro en el registro de sudo. La documentación de Docker lo expresa así: solo los usuarios de confianza deberían poder controlar el servicio Docker.

En un servidor que administra usted solo, es una elección: comodidad frente a una vía adicional hacia root. Lo más seguro es seguir escribiendo sudo docker ...; así cada comando queda en el registro de sudo (lección 3.2). En cualquier caso, no añada nunca al grupo a un usuario que no deba ser root, como el usuario de servicio de un sitio web.

Modo rootless

Docker también puede funcionar sin root: el servicio y los contenedores se ejecutan entonces con un usuario normal, con su propio user namespace. Se instala como ese usuario con dockerd-rootless-setuptool.sh install (del paquete docker-ce-rootless-extras; antes se necesita el paquete uidmap). Así, una brecha en un contenedor no da acceso root al host. Tiene limitaciones y es más complicado de configurar; en este curso usamos la instalación normal y mantenemos la seguridad con las reglas de este módulo.

Un primer contenedor de verdad

Iniciamos un servidor web nginx en un contenedor, accesible solo desde el propio servidor:

anna@web1:~$ sudo docker run -d --name proef -p 127.0.0.1:8080:80 nginx:stable
Unable to find image 'nginx:stable' locally
stable: Pulling from library/nginx
...
3f1c9e0d7a2b...

Las partes:

ParteSignificado
-dEjecutar en segundo plano (detached)
--name proefUn nombre, para no tener que trabajar con ID largos
-p 127.0.0.1:8080:80El puerto 80 del contenedor pasa a ser el puerto 8080 del host, solo en loopback
nginx:stableLa imagen oficial de nginx, etiqueta stable

Comprobar:

anna@web1:~$ sudo docker ps
CONTAINER ID   IMAGE          COMMAND                  STATUS         PORTS                    NAMES
3f1c9e0d7a2b   nginx:stable   "/docker-entrypoint.…"   Up 5 seconds   127.0.0.1:8080->80/tcp   proef
anna@web1:~$ curl -I http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.28.0
anna@web1:~$ sudo ss -tlnp | grep 8080
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("docker-proxy",pid=2211,fd=7))

ss (lección 5.1) lo confirma: solo en 127.0.0.1. Si hubiera escrito -p 8080:80, aparecería 0.0.0.0:8080 y [::]:8080, y su contenedor sería accesible desde internet, aunque ufw no permita el puerto 8080 (lección 9.3). La versión en la cabecera Server puede ser distinta en su caso.

Echar un vistazo e intervenir

anna@web1:~$ sudo docker logs proef            # lo que escribió el programa (stdout y stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef   # las últimas 20 líneas y seguir mostrando
anna@web1:~$ sudo docker exec -it proef sh     # una shell en el contenedor en ejecución
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef           # detener y eliminar

docker logs es el primer sitio donde mirar cuando un contenedor no hace lo que espera, igual que journalctl para los servicios normales (lección 6.2). Con docker exec puede mirar dentro, pero es mejor no cambiar nada allí: los cambios dentro del contenedor desaparecen con la siguiente actualización (lección 9.1).

Limpiar

Las imágenes y los contenedores detenidos permanecen hasta que los elimina. En un VPS con un disco pequeño, eso va creciendo sin que se dé cuenta.

anna@web1:~$ sudo docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          7         3         1.9GB     1.2GB (63%)
Containers      3         3         12MB      0B (0%)
Local Volumes   2         2         180MB     0B (0%)
Build Cache     0         0         0B        0B
anna@web1:~$ sudo docker image prune

docker image prune elimina las imágenes sin nombre que ya no pertenecen a nada; con -a, también todas las imágenes que no usa ningún contenedor. Tenga cuidado con docker system prune --volumes: también elimina los volúmenes anónimos (sin nombre) que en ese momento no pertenecen a ningún contenedor, y docker volume prune -a incluso los volúmenes con nombre. Ahí pueden estar sus datos. Por eso, dé siempre un nombre a los volúmenes o use un bind mount (lección 9.1), y compruebe primero con docker volume ls.

Los registros de los contenedores también pueden crecer. Por defecto, Docker los guarda en archivos JSON sin límite de tamaño. El límite se establece en /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

Después, sudo systemctl restart docker; el ajuste solo se aplica a los contenedores creados a partir de entonces; los contenedores existentes debe volver a crearlos.

En la práctica

Docker funciona igual en un VPS de WebOké que con cualquier otro proveedor: es software dentro de su propio servidor, que usted instala y actualiza. En un VPS pequeño, revise con regularidad el espacio en disco con docker system df y df -h (lección 1.4).

Resumen

  • Instale Docker Engine desde el repositorio de Docker (con clave propia y Signed-By) o docker.io de la distribución, no ambos.
  • El grupo docker equivale a root; sudo docker deja rastro en el registro de sudo. El modo rootless es una alternativa más segura pero más limitada.
  • docker run -d --name ... -p 127.0.0.1:host:container image:tag inicia un contenedor accesible solo localmente; compruébelo con ss.
  • docker ps, logs, exec, stop, rm son sus herramientas del día a día.
  • Limpie las imágenes con docker image prune, limite los registros de los contenedores (por defecto, ilimitados) y sea prudente con --volumes.

Cuestionario

1. ¿Por qué pertenecer al grupo docker da, en la práctica, privilegios de root?



2. Después de docker run -d -p 8080:80 nginx, ss -tlnp muestra la línea 0.0.0.0:8080. ¿Qué debería haber escrito para publicar el puerto solo localmente?



3. Un contenedor se inicia, pero el sitio web que contiene no funciona. ¿Qué revisa primero?



4. ¿Por qué se elige una sola fuente para Docker y no se mezclan docker.io y docker-ce?



5. ¿Qué hace docker system prune --volumes que conviene tener muy claro?



Ejercicio

Ejercicio O9.2: Su primer contenedor. Instale Docker Engine en su servidor siguiendo la lección (o en una máquina de pruebas). Inicie un contenedor nginx que escuche solo en 127.0.0.1:8080, compruébelo con docker ps, curl -I y ss -tlnp, consulte los registros y, después, elimínelo. Responda a las preguntas: ¿desde qué fuente instaló Docker?, ¿qué mostró ss para el puerto 8080? y ¿se añadió al grupo docker (por qué sí o por qué no)?

Ejercicio O9.2: Su primer contenedor

Este ejercicio lo hace usted mismo; nadie lo revisa. Marque lo que haya hecho y señale el ejercicio como realizado.




Sus marcas y notas se quedan solo en este navegador; no las enviamos a ningún sitio. Si ha iniciado sesión, en Mis cursos solo guardamos que ha realizado el ejercicio.

Para saber más

Un momento…

Configure sus dominios

Configure para cada dominio los servidores de nombres, la vinculación a su hosting y quién será el titular.

Cargando sus dominios…