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:
- El repositorio de paquetes de Docker (
download.docker.com). Siempre la versión más reciente, incluido el plug-indocker composeque utilizará en la lección 9.3. Es lo que describe la documentación de Docker y lo que usa este curso. - El paquete
docker.iode 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 quedocker 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.ascA 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.ascEn 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 annaHá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 /hosty 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:
| Parte | Significado |
|---|---|
-d | Ejecutar en segundo plano (detached) |
--name proef | Un nombre, para no tener que trabajar con ID largos |
-p 127.0.0.1:8080:80 | El puerto 80 del contenedor pasa a ser el puerto 8080 del host, solo en loopback |
nginx:stable | La 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 eliminardocker 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 prunedocker 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) odocker.iode la distribución, no ambos. - El grupo docker equivale a root;
sudo dockerdeja 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:taginicia un contenedor accesible solo localmente; compruébelo conss.docker ps,logs,exec,stop,rmson 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
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.
Si procede del repositorio de Docker, unattended-upgrades no lo actualiza por defecto; docker.io de la distribución, sí. ss debe mostrar 127.0.0.1:8080, no 0.0.0.0:8080. El grupo docker otorga permisos de root; con sudo docker, cada comando queda en el registro de sudo.
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
- Documentación de Docker, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Documentación de Docker, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Documentación de Docker, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Documentación de Docker, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Documentación de Docker, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Documentación de Docker, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
