Docker es una plataforma de software que permite a los desarrolladores empaquetar, distribuir y ejecutar aplicaciones de manera independiente de la infraestructura subyacente, utilizando contenedores virtuales para simplificar el despliegue y la gestión de aplicaciones.
IMÁGENES: Una imagen es un paquete ligero y autónomo que incluye todo lo necesario para ejecutar una pieza de software, incluyendo el código, las bibliotecas, las dependencias y configuraciones.
CONTENEDORES: Un contenedor es una instancia en ejecución de una imagen. Es una entidad aislada que ejecuta una aplicación junto con su entorno y dependencias. Puedo incluso tener varios contenedores distintos corriendo la misma imagen (por ejemplo, varios SQL's corriendo a la vez en el mismo host). ES LO QUE SE ESTÁ EJECUTANDO CUANDO TIENES UN DOCKER EN MARCHA
VOLÚMENES: Un volumen en Docker es un mecanismo para persistir y compartir datos entre contenedores y el sistema host. Yo los pongo en la carpeta del usuario, dentro del directorio dockers y luego dentro del directorio del docker en cuestión. Permite almacenar datos fuera del ciclo de vida del contenedor.
Se hace con éste comando
sudo docker image ls
Esto me da el ID de las imágenes.
Para eliminarla ejecuto:
sudo docker image prune
Si quiero eliminar una imagen, debo saber su nombre y ejecutar
sudo docker image rm <nombre_de_la_imagen>
Puedo forzar la eliminación con el parámetro -f (significa force)
Para ver los que están corriendo, ejecuto ésto:
sudo docker ps
El “ps” significa “process status”.
Esto me da el id del contenedor, que es lo que suelo necesitar.
El comando es el siguiente:
sudo docker ps --all
También se puede escribir así.
sudo docker ps -a
Las dos formas hacen lo mismo
docker container port <nombre_o_id_contenedor>
Muestra sólo los puertos de un contenedor en concreto.
docker container exec -it <nombre_o_id_contenedor> <comando>
docker container stats
Para pararlo, uso este comando.
sudo docker stop <id del contenedor>
OJO: Previamente tuvo que haber sido detenido. Lo hago con este comando.
sudo docker rm <id del contenedor>
Si no está detenido tendré que usar el parámetro -f
sudo docker volume ls
docker volume rm <nombredelvolumen>
OJO: Sólo te lista los volúmenes que no estás usando.
sudo docker volume ls -f dangling=true
De nuevo sólo te va a eliminar los que no estás usando. Se hace con este comando.
sudo docker volume prune
docker logs --timestamps <nombre_del_contenedor> | tail
Si quito la sentencia "--timestamps" voy a ver el final del log sin las fechas y horas de cada evento
docker logs --timestamps --tail 100 <nombre_del_contenedor>
Este comando sigue en tiempo real los logs del contenedor, es decir, muestra los nuevos registros a medida que se generan. Es útil para monitorear activamente los eventos que ocurren dentro del contenedor.
docker logs -f <nombre_del_contenedor>
Con esta opción, puedes ver solo los logs generados después de un día y hora determinado.
docker logs --since "2024-02-01T00:00:00" <nombre_del_contenedor>
Si usas Docker Compose para orquestar tus contenedores, puedes usar este comando desde la carpeta dónde está el archivo docker-compose.yml para mostrar los logs de todos los servicios definidos por ese archivo.
docker-compose logs
Si necesito ejecutar un comando dentro del contenedor hago esto:
sudo docker exec --user <usuario del contenedor> <nombre del contenedor> <comando>
Por ejemplo:
sudo docker exec --user www-data nextcloud_nextcloud_1 php /var/www/html/cron.php
sudo docker exec -it nextcloud_nextcloud_1 /bin/bash
sudo docker network ls
sudo docker network create nombre_de_la_red
Puedo ver información de una red (como saber qué contenedores la utilizan) con este comando.
sudo docker network inspect nginx-proxy-network
Asigno un contenedor a una red con este comando.
sudo docker network connect ID_de_la_red ID_del_Contenedor
Después de hacerlo debo ejecutar también estos dos comandos, porque si no no funcionará.
sudo docker-compose down
sudo docker-compose up -d
docker network disconnect ID_de_la_red ID_del_Contenedor
Si todo falla, intentar ejecutar por orden esto.
sudo docker-compose down
sudo docker-compose rm -f
sudo docker system prune -a --volumes
sudo docker-compose up -d
CLI significa "command line interface"
Se utiliza para lanzar contenedores de forma individual. Ejecuta contenedores individuales.
Se ejecuta con una única línea de comando, como por ejemplo.
sudo docker run -d --name bitwarden -v /vw-data/:/data/ -e DOMAIN=https://vaultwarden.tuputodominio.com -e ADMIN_TOKEN=tuputotoken -e ROCKET_PORT=8181 -e WEBSOCKET_ENABLED=true -p 127.0.0.1:8181:8181 -p 127.0.0.1:3012:3012 --restart always vaultwarden/server:latest
Este ejemplo lanza un docker de VaultWarden
Docker Run sólo puede ejecutar un conenedor a la vez.
En lugar de ejecutarse a través de una línea de comando larga, se pone todo lo que se quiere ejecutar en un archivo con extensión .yml
que resulta sencillo de leer.
Además Docker Compose puede ejecutar múltiples contenedores al mismo tiempo. Se utiliza para orquestar múltiples contenedores como parte de una aplicación (como por ejemplo, una instancia de Vikunja y una base de datos). Es especialmente útil para simplificar el despliegue y la gestión de aplicaciones complejas con varios servicios interconectados.
Docker Compose puede ejecutar varios contenedores a la vez y es visualmente más intuitivo.
Siempre que sea posible, haced las instalaciones con Docker Compose.
Revisar primero esta página: https://docs.docker.com/engine/install/debian/
Primero instalamos los paquetes necesarios para usar un nuevo repositorio a través de https.
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
Lo hago con este comando (todo eso hay que ponerlo a la vez, no línea por línea):
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Ahora actualizo los paquetes.
sudo apt-get update
Y actualizo el listado de repositorios con este otro comando.
sudo apt update
Lo instalo con éste comando.
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
No te líes. En una raspberry haz la instalación con el "convenience script".
Primero descargo el script
curl -fsSL https://get.docker.com -o get-docker.sh
Luego lo instalo
sudo sh get-docker.sh
Y por último instalo el docker compose.
sudo apt-get install docker-compose
Para actualizar una instalación de docker, me sitúo en el directorio dónde está el docker-compose.yml y ejecuto estos tres comandos:
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
El primer comando descarga la última imagen del repositorio.
La segunda línea inicia el docker en segundo plano (-d) y elimina los contenedores huérfanos que no están definidos en el docker-compose.yml
El tercer comando limpia imágenes no utilizadas en el sistema.
Primero debo crear un script para actualizar todo de golpe con el comando
sudo nano actualizar.sh
Luego debo poner dentro este código.
sudo apt-get update -y
sudo apt-get dist-upgrade -y
sudo apt-get autoremove -y
sudo apt-get autoclean -y
cd /home/usuario/docker/wikijs
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
Debo cambiar la línea
cd /home/usuario/docker/wikijs
por la carpeta en la que tengo el archivo.yml
.
Si hay más contenedores corriendo en la máquina, repito de nuevo las líneas de la 5 a la 8, pero cambiando en la línea 5 la carpeta a la que se apunta, de esta forma:
sudo apt-get update -y
sudo apt-get dist-upgrade -y
sudo apt-get autoremove -y
sudo apt-get autoclean -y
cd /home/usuario/docker/wikijs
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/usuario/docker/vikunja
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
En el crontab de la máquina
(sudo crontab -e)
debo añadir una línea para que se ejecute este script con la periodicidad deseada.
También puedo hacer un script que recorra, uno por uno, todas las carpetas del directoro "docker" que vaya actualizando cada contenedor, de esta forma.
#!/bin/bash
# Actualizo el sistema operativo
sudo apt-get update -y
sudo apt-get dist-upgrade -y
sudo apt-get autoremove -y
sudo apt-get autoclean -y
# Definimos el directorio base
BASE_DIR="/home/<tu_usuario>/docker"
# Recorro todas las subcarpetas dentro del directorio base
for dir in $BASE_DIR/*; do
if [ -d "$dir" ]; then
echo "Procesando $dir ..."
cd "$dir"
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
fi
done
# Ya he actualizado todo. Ahora reinicio el sistema.
sudo shutdown -r now
Mucho ojo: Este último script levantará cualquier contenedor que haya dentro de la carpeta docker. Si hay alguno parado se va a levantar. Asegúrate que todos los dockers de la carpeta docker tengan que estar levantados.
Es más complicado gestionar una actualización en docker Run porque hay que meter de nuevo el despliegue con una línea de comando larga.
Para actualizar, creo un script con este comando:
sudo nano actualizar.sh
Luego debo poner dentro este código.
apt-get update
apt-get dist-upgrade -y
docker pull vaultwarden/server:latest
docker stop bitwarden
docker rm bitwarden
docker run -d --name bitwarden -v /vw-data/:/data/ -e ROCKET_PORT=8181 -e WEBSOCKET_ENABLED=true -p 127.0.0.1:8181:8181 -p 127.0.0.1:3012:3012 --restart always vaultwarden/server:latest
apt-get autoremove -y
apt-get autoclean -y
Evidentemente, hay que personalizar cada una de las líneas por el comando correcto para parar el docker, actualizarlo y desplegarlo de nuevo.
De nuevo, en el crontab de la máquina
(sudo crontab -e)
debo añadir una línea para que se ejecute este script con la periodicidad deseada.