# 3.- Administración básica de contenedores Docker.

# Caso práctico

Jonny Goldstein (CC BY)

Intrigados por las posibilidades que ofrece Docker, Juan y Eva deciden investigar y documentarse sobre los pasos necesarios para utilizar esta herramienta en sus proyectos. Descubren que Docker les permitirá agilizar sus entornos de desarrollo, asegurando que todos los miembros del equipo trabajen en un entorno uniforme y replicable, evitando así los problemas típicos de "funciona en mi máquina".

Aprovisionados con la información necesaria, Juan y Eva se embarcan en la tarea de probar los comandos principales de Docker en su servidor de pruebas.

Con cada paso que dan en la configuración y personalización de sus pruebas, Juan y Eva se sienten cada vez más seguros y entusiasmadoas con el uso de esta tecnología. Pronto se dan cuenta de que esta herramienta no solo les proporciona un entorno de desarrollo uniforme y fácil de compartir con otros miembros del equipo, sino que también les permite experimentar con diferentes tecnologías y configuraciones sin afectar sus máquinas locales.

Tras haber efectuado la instalación del cliente de Docker en nuestro sistema, veamos ahora la administración básica de contenedores Docker, incluyendo sus principales comandos y algunos ejemplos sencillos de uso:

## docker pull

Para descargar una imagen desde Docker Hub, usaremos el comando docker pull seguido del nombre de la imagen y, opcionalmente, la etiqueta (versión). Si no se especifica la etiqueta, Docker descargará la versión más reciente (etiqueta "latest"). Ejemplo, vamos a realizar la descarga de la imagen de Ubuntu 22.04

    docker pull ubuntu:22.04

Manuel J. Rodríguez. Docker pull (Dominio público)

## docker images

Para listar todas las imágenes descargadas en nuestro sistema, usamos el comando docker images aunque también se consigue lo mismo con docker image ls.

    docker images

    o

    docker image ls

Manuel J. Rodríguez (Elaboración propia). Docker images (Dominio público)

## docker run

Para ejecutar un contenedor a partir de una imagen, usamos el comando docker run. Si la imagen no está en nuestro sistema, Docker intentará descargarla automáticamente desde Docker Hub. Veamos como ejecutar un contenedor de la imagen de Ubuntu que acabamos de descargar e iniciaremos una sesión de shell interactiva (flags -it).

- El parámetro -i nos permite interaccionar con el contenedor a través de la entrada estándar STDIN.
- El parámetro -t nos asigna un terminal dentro del contenedor.
- Los dos parámetros -it nos permiten usar un contenedor como si fuese una máquina virtual tradicional.

    docker run -it ubuntu:22.04 bash

    # también podemos referirnos mediante el id de la imagen

    docker run -it 3b418d7b466a bash

    # incluso indicando los 2 primeros caracteres del Id de la imagen

    docker run -it 3b bash

Manuel J. Rodríguez. docker run (Dominio público)

## docker ps

Para listar todos los contenedores en ejecución, usamos el comando docker ps. Para listar todos los contenedores, incluyendo los detenidos, agregamos la opción -a.

    docker ps -a

Manuel J. Rodríguez. Listar contenedores (Dominio público)

## docker exec

Nos permite ejecutar un comando en un contenedor que está en ejecución indicando su nombre o su ID. docker exec ejecuta el comando en un proceso nuevo, asignándonos un nuevo terminal.

Esto significa que si salimos del contenedor con exit, el contenedor no detendrá su ejecución.

Cuando queramos conectarnos a un contenedor que está en ejecución podemos abrir un nuevo terminal con docker exec.

Veamos el ejemplo con un contenedor de Ubuntu, vamos a ejecutar en el contenedor el comando /usr/bin/top en modo batch (-b) para que siga ejecutándose en segundo plano. Si no utilizásemos el modo batch el contenedor se detendría una vez que finaliza la ejecución del comando.

    # En primer lugar arrancamos nuestro contenedor

    docker run -dit --name ubuntu_top ubuntu /usr/bin/top -b

    # Comprobamos que el contenedor se está ejecutando en segundo plano

    docker ps

    # Ahora si ejecutamos exec abriendo una nueva terminal sobre el contenedor

    docker exec -it ubuntu_top /bin/sh

Manuel J. Rodríguez. Docker exec (Dominio público)

Si ejecutamos ps aux para ver los procesos que están en ejecución dentro del contenedor veremos lo siguiente:

Manuel J. Rodríguez. docker exec ps aux (Dominio público)

Vemos como el proceso con PID 1 es el que está ejecutando el comando /usr/bin/top -b y el proceso con PID 7 es el del comando /bin/sh que es el que hemos ejecutado con docker exec.

## docker stop

Para detener un contenedor en ejecución, usa el comando docker stop seguido del ID o nombre del contenedor. Vamos a usar ahora un contenedor de una imagen oficial de httpd esta vez en modo detach (-d), que consiste en la ejecución de un contenedor en segundo plano mientras que éste ejecuta una aplicación en primer plano. Además añadir la opción --name para asignarle un nombre a nuestro contenedor

    docker run -d  --name httpd-contenedor httpd

Manuel J. Rodríguez. Docker stop ejemplo 1 (Dominio público)

Ahora procedemos a parar nuestro contenedor:

    #Usando el id completo

    docker stop a963673465b7

    #Usando el nombre del contenedor

    docker stop httpd-contenedor

    #Usando los dos primeros caracteres del Id del contenedor

    docker stop a9

Manuel J. Rodríguez. Docker stop (Dominio público)

## docker start

Para iniciar un contenedor detenido, usamos el comando docker start seguido del ID o nombre del contenedor. Volvamos a levantar el contenedor que acabamos de parar.

    docker start httpd-contenedor

Manuel J. Rodríguez. docker start (Dominio público)

## docker logs

Para ver los registros de salida de un contenedor, usamos el comando docker logs seguido del ID o nombre del contenedor.

Por ejemplo podemos ver los logs del contenedor que acabamos de arrancar en el paso anterior:

Manuel J. Rodríguez. Docker logs (Dominio público)

## docker cp

Nos permite copiar archivos entre un contenedor y el sistema host, por ejemplo vamos a crear un fichero llamado file.txt y lo vamos a copiar dentro de la ruta home/ de nuestro contenedor. El formato de la instrucción es este: docker cp fichero nombre_contenedor:/path/in/container

    docker cp file.txt httpd-contenedor:/home

Manuel J. Rodríguez. Docker cp (Dominio público)

## docker rm

Con este comando podremos eliminar un contenedor, pero, primero asegúrate de que esté detenido. Luego, usa el comando docker rm seguido del ID o nombre del contenedor.

Veamos como eliminar nuestro httpd-contenedor.

    # Primero comprobamos su estado

    docker ps (si está corriendo lo paramos)

    # Paramos el contenedor

    docker stop httpd-contenedor

    # Eliminamos el contenedor

    docker rm httpd-contenedor

Manuel J. Rodríguez. Docker rm (Dominio público)

## docker rmi

Con este comando podemos eliminar una imagen descargada. Usaremos docker rmi seguido del nombre de la imagen y la etiqueta. Por ejemplo, para eliminar la imagen de Ubuntu 22.04 procederemos de la siguiente manera:

    docker rmi ubuntu:22.04

Manuel J. Rodríguez. docker rmi (Dominio público)

IMPORTANTE: Si tenemos algún contenedor creado (aunque este se encuentre parado), deberemos previamente eliminar los contenedores para poder eliminar la imagen, de lo contrario obtendremos errores del tipo:

    user@mrodara538:~$ docker rmi ubuntu:22.04
    Error response from daemon: conflict: unable to remove repository reference "ubuntu:22.04" (must force) - container 932f97041928 is using its referenced image 3b418d7b466a

# Debes conocer

Puedes obtener ayuda sobre el uso de los comandos de Docker, para ello puedes usar el flag --help con el comando de Docker en la terminal.

Para obtener una descripción general de todos los comandos disponibles en Docker, puedes escribir docker --help en tu terminal. Esto mostrará una lista de todos los comandos de Docker, junto con una breve descripción de lo que hace cada comando.

Si necesitas ayuda con un comando específico de Docker, puedes agregar --help después de ese comando. Por ejemplo, si quieres saber cómo utilizar el comando docker run, puedes escribir docker run --help en la terminal. Esto mostrará las opciones, el uso y los argumentos del comando docker run.

El flag --help es una gran herramienta para aprender y recordar cómo usar los comandos de Docker. Si alguna vez te encuentras atascado o no estás seguro de cómo usar un comando, prueba a agregar --help al final del comando para obtener una guía rápida y útil.

#### Todos los comandos de Docker CLI

    user@mrodara538:~$ docker --help

    Usage:  docker [OPTIONS] COMMAND

    A self-sufficient runtime for containers

    Common Commands:
      run         Create and run a new container from an image
      exec        Execute a command in a running container
      ps          List containers
      build       Build an image from a Dockerfile
      pull        Download an image from a registry
      push        Upload an image to a registry
      images      List images
      login       Log in to a registry
      logout      Log out from a registry
      search      Search Docker Hub for images
      version     Show the Docker version information
      info        Display system-wide information

    Management Commands:
      builder     Manage builds
      buildx*     Docker Buildx (Docker Inc., v0.10.2)
      compose*    Docker Compose (Docker Inc., v2.16.0)
      container   Manage containers
      context     Manage contexts
      image       Manage images
      manifest    Manage Docker image manifests and manifest lists
      network     Manage networks
      plugin      Manage plugins
      scan*       Docker Scan (Docker Inc., v0.23.0)
      system      Manage Docker
      trust       Manage trust on Docker images
      volume      Manage volumes

    Swarm Commands:
      swarm       Manage Swarm

    Commands:
      attach      Attach local standard input, output, and error streams to a running container
      commit      Create a new image from a container's changes
      cp          Copy files/folders between a container and the local filesystem
      create      Create a new container
      diff        Inspect changes to files or directories on a container's filesystem
      events      Get real time events from the server
      export      Export a container's filesystem as a tar archive
      history     Show the history of an image
      import      Import the contents from a tarball to create a filesystem image
      inspect     Return low-level information on Docker objects
      kill        Kill one or more running containers
      load        Load an image from a tar archive or STDIN
      logs        Fetch the logs of a container
      pause       Pause all processes within one or more containers
      port        List port mappings or a specific mapping for the container
      rename      Rename a container
      restart     Restart one or more containers
      rm          Remove one or more containers
      rmi         Remove one or more images
      save        Save one or more images to a tar archive (streamed to STDOUT by default)
      start       Start one or more stopped containers
      stats       Display a live stream of container(s) resource usage statistics
      stop        Stop one or more running containers
      tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
      top         Display the running processes of a container
      unpause     Unpause all processes within one or more containers
      update      Update configuration of one or more containers
      wait        Block until one or more containers stop, then print their exit codes

    Global Options:
          --config string      Location of client config files (default "/home/user/.docker")
      -c, --context string     Name of the context to use to connect to the daemon (overrides
                               DOCKER_HOST env var and default context set with "docker context use")
      -D, --debug              Enable debug mode
      -H, --host list          Daemon socket(s) to connect to
      -l, --log-level string   Set the logging level ("debug", "info", "warn", "error", "fatal")
                               (default "info")
          --tls                Use TLS; implied by --tlsverify
          --tlscacert string   Trust certs signed only by this CA (default "/home/user/.docker/ca.pem")
          --tlscert string     Path to TLS certificate file (default "/home/user/.docker/cert.pem")
          --tlskey string      Path to TLS key file (default "/home/user/.docker/key.pem")
          --tlsverify          Use TLS and verify the remote
      -v, --version            Print version information and quit

    Run 'docker COMMAND --help' for more information on a command.

    For more help on how to use Docker, head to https://docs.docker.com/go/guides/

# Recomendación

Docker Playground es una excelente opción para aquellas personas que desean aprender Docker pero tienen cierta preocupación por "romper" algo en su sistema local. Se trata de una plataforma en línea gratuita que proporciona un entorno Docker preconfigurado donde puedes practicar comandos y experimentar con la tecnología Docker sin la necesidad de instalar nada en tu propia máquina.

Desde el punto de vista didáctico, Docker Playground ofrece una serie de ventajas:

- Entorno Seguro: Puedes experimentar y cometer errores sin preocuparte por afectar tu sistema operativo local o tu propia instalación de Docker. Esto puede ser especialmente útil si estás empezando y no estás seguro de cómo los comandos de Docker pueden afectar a tu sistema.
- Acceso Instantáneo: No necesitas instalar Docker en tu máquina, lo que puede ser un proceso complicado si eres un principiante. Simplemente ve al sitio web de Docker Playground y empieza a practicar.
- Aprendizaje Práctico: La mejor manera de aprender cualquier tecnología es practicando. Docker Playground te permite practicar comandos de Docker en tiempo real, ayudándote a familiarizarte con la sintaxis y el comportamiento de Docker.
- Recursos de Aprendizaje Integrados: Docker Playground a menudo incluye tutoriales y guías integrados que puedes seguir para aprender los conceptos básicos de Docker.

En resumen, Docker Playground es una herramienta de aprendizaje muy recomendable para los principiantes de Docker. Te proporciona un entorno seguro y práctico donde puedes aprender y experimentar con Docker sin miedo a cometer errores.

# Ejercicio Resuelto

Como administrador de sistemas, se te ha solicitado crear un contenedor de Docker que ejecute un servidor web Nginx. Sin embargo, no se quiere usar la página de inicio por defecto de Nginx, sino que se desea mostrar una página personalizada que contenga un mensaje de "¡Hola, mundo Docker!".

# Retroalimentación

Aquí están los pasos para resolver este ejercicio:

Primero, crea una nueva carpeta en tu sistema local y navega a ella usando la terminal. En este directorio, crearemos nuestro archivo index.html personalizado:

    mkdir nginx-docker && cd nginx-docker

Crea un archivo index.html con el contenido "¡Hola, mundo Docker!". Puedes hacer esto con cualquier editor de texto. Aquí lo haremos directamente desde la terminal:

    echo "<h1>¡Hola, mundo Docker!</h1>" > index.html

Ahora, ejecuta un contenedor Docker con la imagen de Nginx:

    docker run -d -p 8080:80 --name nginx-hola-mundo nginx:latest

Aquí, -d le dice a Docker que ejecute el contenedor en segundo plano, -p 8080:80 asigna el puerto 8080 de tu máquina al puerto 80 del contenedor (el puerto en el que se ejecuta Nginx), y --name nginx-hola-mundo asigna el nombre nginx-hola-mundo a tu contenedor.

Una vez que el contenedor esté en ejecución, puedes copiar el archivo index.html al contenedor utilizando el comando docker cp:

    docker cp index.html nginx-hola-mundo:/usr/share/nginx/html/index.html

Ahora, si abres un navegador web y visitas http://localhost:8080, deberías ver tu página de inicio personalizada con el mensaje "¡Hola, mundo Docker!".

NOTA IMPORTANTE: Copiar el archivo directamente al contenedor Docker usando el comando docker cp después de que el contenedor esté en ejecución no es la práctica habitual, este método tiene una desventaja: cada vez que inicies un nuevo contenedor a partir de la imagen de Nginx, tendrás que copiar el archivo index.html de nuevo. En su lugar lo que se realiza es la creación de imágenes personalizadas a partir de imágenes oficiales ya existentes que se contruyen con el fichero Dockerfile.

Creado con eXeLearning (Ventana nueva)