Docker

Comandos y configuración de docker.

📋Tabla de contenido

🌅Introducción

Docker Docker es una plataforma que te permite empaquetar una aplicación con todo lo que necesita (librerías, dependencias, configuraciones…) dentro de un contenedor, para que corra igual en cualquier entorno. En resumen: portabilidad sin dramas.

🌍Enlaces de interés

🛠️Instalación

Guía oficial de instalación

Instalación en Ubuntu

sudo apt update -y
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common -y
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update -y
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Comprobar la versión instalada:

docker version

Agregar al usuario actual al grupo de Docker (Para evitar tener que ejecutar los comandos con sudo):

sudo usermod -aG docker $USER 

🚀Get started

Docker Get started

📌Comandos

Ejecutar contenedores

# Ejecutar un contenedor
docker run $IMAGE:$TAG 
docker run nginx:latest

# Asignar un nombre al contenedor
docker run --name $CONTAINER_NAME $IMAGE:$TAG 
docker run --name webserver nginx:latest

# Mapear puertos
docker run -p $HOST_PORT:$CONTAINER_PORT $IMAGE:$TAG
docker run -p 8080:80 nginx:latest

# Mapear todos los puertos
docker run -P $IMAGE:$TAG
docker run -P nginx:latest

# Ejecutar el contenedor en segundo plano
docker run -d $IMAGE:$TAG
docker run -d nginx:latest

# Asignar un hostname
docker run --hostname $HOSTNAME $IMAGE:$TAG
docker run --hostname srv nginx:latest

# Asignar un volumen
# Tipo bind (un directorio del host enlazado a un directorio del contenedor)
docker run -v $HOST_DIR:$CONTAINER_DIR $IMAGE:$TAG
docker run -v ./src:/var/www/html nginx:latest
# Tipo volume (gestionado por docker, directorio dentro de la instalacion de docker)
docker run -v $CONTAINER_DIR $IMAGE:$TAG
docker run -v /var/www/html nginx:latest
docker run -v $VOLUMEN_NAME:$CONTAINER_DIR $IMAGE:$TAG
docker run -v web:/var/www/html nginx:latest
docker run -v $VOLUMEN_NAME:$CONTAINER_DIR:$MODE $IMAGE:$TAG
docker run -v web:/var/www/html:ro nginx:latest # ro -> read-only, para que desde ese contenedor no pueda editar el volumen
# Indicar que quieres compartir todos los volumenes configurados en otro contenedor
docker run --volumes-from $CONTAINER_FROM -d --name $CONTAINER_NAME $IMAGE:$TAG
# ELiminar los volumenes en desuso
docker volume prune

# Modificar el puntos de entrada
docker run -it --entrypoint $EXECUTABLE $IMAGE:$TAG
docker run -it --entrypoint bash nginx:latest

# Asignar una IP dentro de la red de Docker
docker run --ip $IP $IMAGE:$TAG
docker run --ip 172.18.0.6 nginx:latest

# Asignar una red de Docker a un contenedor
docker run --net $NET_NAME $IMAGE:$TAG
docker run --net custom_net nginx:latest

# Especificar la plataforma donde se ejecuta el contenedor
# aarch  --> linux/arm64
# x86_64 --> linux/amd64
docker run --platform $PLATFORM $IMAGE:$TAG
docker run --platform linux/arm64 nginx:latest

# Asignar permisos privilegiados (Acceso completo al host desde el contenedor)
# --> Puede comprometer la seguridad del host <--
docker run --privileged=true $IMAGE:$TAG
docker run --privileged=true nginx:latest

# Limitar el uso de cpu del host
docker run --cpus="0.5" $IMAGE:$TAG # Limita el uso de la cpu del host a medio core
docker run --cpus="0.5" nginx:latest

# Limitar el uso de memoria del host
docker run --m="2G" $IMAGE:$TAG # Limita el uso de la cpu del host a medio core
docker run --m="2G" nginx:latest

Administrar contenedores

# Listar contenedores
docker ps # Solo contenedores en ejecución
docker ps -a # Todos los contenedores
docker ps -f "name=web" # Listar contenedores que contienen "web"
docker ps --format "{{.ID}} => {{.Names}}" # Cambia el formato de salida (Ver opciones en la documentación de CLI)

# Eliminar un contenedor
docker rm $CONTAINER
docker rm webserver
docker rm -f webserver # Eliminar el contenedor incluso si está en ejecución
docker container prune # Eliminar contenedores que no estén en uso actual

# Parar un contenedor
docker stop $CONTAINER
docker stop webserver

# Arrancar un contenedor parado
docker start $CONTAINER
docker start webserver

# Copiar ficheros entre el contenedor y el host
docker cp $CONTAINER:$SOURCE $TARGET
docker cp webserver:/var/www/html/index.html index.html # De contenedor a host
docker cp index.html webserver:/var/www/html/index.html # De host a contenedor

# Iniciar una shell dentro de un contenedor en ejecución
docker exec -it $CONTAINER $EXECUTABLE
docker exec -it webserver bash

# Renombrar un contenedor
docker rename $CURRENT_NAME $NEW_NAME
docker rename webserver web

# Crear una imagen a partir de un contenedor
docker commit $CONTAINER $IMAGE:$TAG
docker commit webserver custom_image:my_version

Administrar imágenes

# Listar imagenes
docker images 

# Descargar una imagen
docker pull $IMAGE:$TAG
docker pull nginx:latest

# Cargar una imagen en un repositorio
docker push $IMAGE:$TAG
docker push myimage:1.0

# Eliminar una imagen
docker rmi $IMAGE:$TAG
docker rmi myimage:1.0
docker image prune -a # Elimina las imágenes en desuso

# Etiquetar una imagen
docker tag $IMAGE $IMAGE:$TAG
docker tag ubuntu ubuntu:18.04

# Construir una imagen a partir de un Dockerfile
docker build $DIRECTORY
docker build .
docker build -t myimage:2.0 . # Agregando un tag personalizado

# Guardar una imagen en un archivo comprimido (tar)
docker save $IMAGE:$TAG > $FILE
docker save myimage:2.0 > myimage.tar

# Cargar una imagen desde un archivo comprimido
docker load -i $TARFILE
docker load -i myimage.tar

Redes

# Mostar las redes de Docker
docker network ls

# Inspeccionar una red, por defecto la red de docker es "bridge"
docker inspect $NET_NAME
docker inspect bridge

Info & Stats

# Muestra propiedades de la instalación de docker (contenedores, imagenes, arquitectura...)
docker info

# Mostrar logs de un contenedor
docker logs $CONTAINER
docker logs webserver
docker logs -f webserver # Ver logs en directo

# Mostrar estadísticas (Uso de CPU, memoria, red, I/O...) de contenedores en ejecución
docker stats # Salida interactiva (en tiempo real)
docker stats --no-stream # Salida no interactiva

# Mostrar procesos de un contenedor
docker top $CONTAINER
docker top webserver

# Inspeccionar un contenedor (Imagen base, estado actual, configuración de red...)
docker inspect $CONTAINER
docker inspect webserver

# Mostrar los ficheros modificados de un contenedor
docker diff $CONTAINER
docker diff webserver

# Mostrar los puertos mapeados de un contenedor
docker port $CONTAINER
docker port webserver

# Muestra las capas que han generado una imagen (en orden inverso, comenzando desde la última)
docker history $IMAGE:$TAG
docker history traefik:v2.10

🐋Dockerfile

Para generar imagenes personalizadas usaremos los Dockerfile, a continuación la estructura básica del archivo, algunas recomendaciones y como generar la imagen.

# Imagen base
FROM debian:latest

# Ejecución de comandos
# Cada RUN genera una capa en la imagen, es mejor concatenar comandos en una sola directiva RUN, en lugar de poner varias
RUN apt-get update && apt-get install -y apache2

# Establecer el directorio de trabajo
WORKDIR /var/www/html

# Copiar ficheros del directorio actual al contenedor
# Como hemos establecido el WORKDIR, para copiar los ficheros a esa ruta basta con indicar "."
COPY index.html .

# Agregar variables de entorno
ENV MY_VAR="value" \
    ANOTHER_VAR="Hello world"
# Con esta linea veremos que cuando ejecutamos el contenedor nos muestra el valor
RUN echo 'echo $ANOTHER_VAR, MY_VAR = $MY_VAR' >> /root/.bashrc

# Agrega argumentos, para tener en cuenta a la hora de crear la imagen (docker build)
ARG PACKAGE \
    MY_TXT
RUN apt-get update && apt-get install -y $PACKAGE
ENV MY_ENV_VAR=$MY_TXT
# A la hora de crear la imagen, lo haremos de la siguiente manera
# docker build -t my-custom-image:latest --build-arg PACKAGE=nano --build-arg MY_TXT="Hello world" .

# Comando que ejecuta el contenedor a arrancar (Solo ejecuta el último CMD)
CMD ["bash"]
# Otro ejemplo
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Para generar la imagen, ejecutaremos el siguiente comando desde el directorio del Dockerfile

docker build -t $IMAGE:$TAG .
docker build -t my-custom-image:latest .