Cómo instalar y utilizar Docker en Ubuntu 18.04

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Instalación de Docker
  • Paso 2: Ejecutar el comando Docker sin sudo (opcional)
  • Paso 3: Uso del comando Docker
  • Paso 4: Trabajar con imágenes Docker
  • Paso 5: Ejecución de un contenedor Docker
  • Paso 6: Gestión de contenedores Docker
  • Paso 7: Confirmación de cambios en un contenedor en una imagen de Docker
  • Paso 8: enviar imágenes de Docker a un repositorio de Docker
  • Conclusión
  • Una versión anterior de este tutorial fue escrita por finid .

    Introducción

    Docker es una aplicación que simplifica el proceso de gestión de procesos de aplicaciones en contenedores . Los contenedores permiten ejecutar aplicaciones en procesos aislados de recursos. Son similares a las máquinas virtuales, pero los contenedores son más portátiles, consumen más recursos y dependen más del sistema operativo host.

    Para obtener una introducción detallada a los diferentes componentes de un contenedor Docker, consulte El ecosistema Docker: una introducción a los componentes comunes .

    En este tutorial, instalarás y usarás Docker Community Edition (CE) en Ubuntu 18.04. Instalarás Docker, trabajarás con contenedores e imágenes y enviarás una imagen a un repositorio de Docker.

    Prerrequisitos

    Para seguir este tutorial, necesitarás lo siguiente:

    • Un servidor Ubuntu 18.04 configurado siguiendo la guía de configuración inicial del servidor Ubuntu 18.04 , incluido un usuario sudo no root y un firewall.
    • Una cuenta en Docker Hub si desea crear sus propias imágenes y enviarlas a Docker Hub, como se muestra en los pasos 7 y 8.

    Paso 1: Instalación de Docker

    Es posible que el paquete de instalación de Docker disponible en el repositorio oficial de Ubuntu no sea la última versión. Para asegurarnos de obtener la última versión, instalaremos Docker desde el repositorio oficial de Docker. Para ello, agregaremos una nueva fuente de paquete, agregaremos la clave GPG de Docker para asegurarnos de que las descargas sean válidas y luego instalaremos el paquete.

    Primero, actualice su lista existente de paquetes:

    1. sudo apt update

    A continuación, instale algunos paquetes de requisitos previos que permitan aptutilizar paquetes a través de HTTPS:

    1. sudo apt install apt-transport-https ca-certificates curl software-properties-common

    Luego agregue la clave GPG para el repositorio oficial de Docker a su sistema:

    1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

    Agregue el repositorio Docker a las fuentes de APT:

    1. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

    A continuación, actualice la base de datos de paquetes con los paquetes Docker del repositorio recién agregado:

    1. sudo apt update

    Asegúrate de que estás a punto de instalar desde el repositorio de Docker en lugar del repositorio predeterminado de Ubuntu:

    1. apt-cache policy docker-ce

    Verá un resultado como este, aunque el número de versión de Docker puede ser diferente:

    Salida de la política apt-cache docker-ce

    docker-ce:  Installed: (none)  Candidate: 18.03.1~ce~3-0~ubuntu  Version table:     18.03.1~ce~3-0~ubuntu 500        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages

    Tenga en cuenta que docker-ceno está instalado, pero el candidato para la instalación es del repositorio Docker para Ubuntu 18.04 ( bionic).

    Por último, instala Docker:

    1. sudo apt install docker-ce

    Ahora debería estar instalado Docker, el demonio iniciado y el proceso habilitado para iniciarse en el arranque. Verifique que esté en ejecución:

    1. sudo systemctl status docker

    La salida debería ser similar a la siguiente, mostrando que el servicio está activo y en ejecución:

    Output● docker.service - Docker Application Container Engine   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)   Active: active (running) since Mon 2021-08-09 19:42:32 UTC; 33s ago     Docs: https://docs.docker.com Main PID: 5231 (dockerd)    Tasks: 7   CGroup: /system.slice/docker.service           └─5231 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

    Al instalar Docker ahora, no solo obtendrá el servicio Docker (daemon), sino también la utilidad de línea de comandos o el cliente Docker. Más adelante en este tutorial, dockerexploraremos cómo usar el comando.docker

    Paso 2: Ejecutar el comando Docker sin sudo (opcional)

    De forma predeterminada, el dockercomando solo puede ejecutarlo el usuario root o un usuario del grupo de Docker , que se crea automáticamente durante el proceso de instalación de Docker. Si intenta ejecutar el dockercomando sin anteponerle sudoo sin estar en el grupo de Docker , obtendrá un resultado como este:

    Outputdocker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.See 'docker run --help'.

    Si desea evitar escribir sudocada vez que ejecuta el dockercomando, agregue su nombre de usuario al dockergrupo:

    1. sudo usermod -aG docker ${USER}

    Para aplicar la nueva membresía del grupo, cierre la sesión del servidor y vuelva a iniciarla, o escriba lo siguiente:

    1. su - ${USER}

    Se le pedirá que ingrese su contraseña de usuario para continuar.

    Confirme que su usuario ahora está agregado al grupo de Docker escribiendo:

    1. id -nG
    Outputsammy sudo docker

    Si necesita agregar un usuario al dockergrupo con el que no ha iniciado sesión, declare ese nombre de usuario explícitamente mediante:

    1. sudo usermod -aG docker username

    El resto de este artículo asume que estás ejecutando el dockercomando como usuario del grupo Docker . Si eliges no hacerlo, antepone los comandos con sudo.

    Exploremos el dockercomando a continuación.

    Paso 3: Uso del comando Docker

    El uso dockerconsiste en pasarle una cadena de opciones y comandos seguidos de argumentos. La sintaxis tiene la siguiente forma:

    1. docker [option] [command] [arguments]

    Para ver todos los subcomandos disponibles, escriba:

    1. docker

    A partir de Docker 20, la lista completa de subcomandos disponibles incluye:

    Output  attach      Attach local standard input, output, and error streams to a running container  build       Build an image from a Dockerfile  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  exec        Run a command in a running container  export      Export a container's filesystem as a tar archive  history     Show the history of an image  images      List images  import      Import the contents from a tarball to create a filesystem image  info        Display system-wide information  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  login       Log in to a Docker registry  logout      Log out from a Docker registry  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  ps          List containers  pull        Pull an image or a repository from a registry  push        Push an image or a repository to a registry  rename      Rename a container  restart     Restart one or more containers  rm          Remove one or more containers  rmi         Remove one or more images  run         Run a command in a new container  save        Save one or more images to a tar archive (streamed to STDOUT by default)  search      Search the Docker Hub for images  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  version     Show the Docker version information  wait        Block until one or more containers stop, then print their exit codes

    Para ver las opciones disponibles para un comando específico, escriba:

    1. docker docker-subcommand --help

    Para ver información de todo el sistema sobre Docker, utilice:

    1. docker info

    Exploremos algunos de estos comandos. Comenzaremos trabajando con imágenes.

    Paso 4: Trabajar con imágenes Docker

    Los contenedores Docker se crean a partir de imágenes Docker. De forma predeterminada, Docker obtiene estas imágenes de Docker Hub , un registro de Docker administrado por Docker, la empresa detrás del proyecto Docker. Cualquiera puede alojar sus imágenes Docker en Docker Hub, por lo que la mayoría de las aplicaciones y distribuciones de Linux que necesitará tendrán imágenes alojadas allí.

    Para comprobar si puede acceder y descargar imágenes desde Docker Hub, escriba:

    1. docker run hello-world

    La salida indicará que Docker funciona correctamente:

    OutputUnable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-worldb8dfde127a29: Pull completeDigest: sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9eStatus: Downloaded newer image for hello-world:latestHello from Docker!This message shows that your installation appears to be working correctly.. . .

    Al principio, Docker no pudo encontrar la hello-worldimagen localmente, por lo que la descargó desde Docker Hub, que es el repositorio predeterminado. Una vez que se descargó la imagen, Docker creó un contenedor a partir de la imagen y la aplicación dentro del contenedor se ejecutó, mostrando el mensaje.

    Puede buscar imágenes disponibles en Docker Hub mediante el dockercomando con el searchsubcomando. Por ejemplo, para buscar la imagen de Ubuntu, escriba:

    1. docker search ubuntu

    El script rastreará Docker Hub y devolverá una lista de todas las imágenes cuyo nombre coincida con la cadena de búsqueda. En este caso, el resultado será similar a este:

    OutputNAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATEDubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   7917                [OK]dorowu/ubuntu-desktop-lxde-vnc                            Ubuntu with openssh-server and NoVNC            193                                     [OK]rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi…   156                                     [OK]ansible/ubuntu14.04-ansible                               Ubuntu 14.04 LTS with ansible                   93                                      [OK]ubuntu-upstart                                            Upstart is an event-based replacement for th…   87                  [OK]neurodebian                                               NeuroDebian provides neuroscience research s…   50                  [OK]ubuntu-debootstrap                                        debootstrap --variant=minbase --components=m…   38                  [OK]1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5      ubuntu-16-nginx-php-phpmyadmin-mysql-5          36                                      [OK]nuagebec/ubuntu                                           Simple always updated Ubuntu docker images w…   23                                      [OK]tutum/ubuntu                                              Simple Ubuntu docker images with SSH access     18i386/ubuntu                                               Ubuntu is a Debian-based Linux operating sys…   13ppc64le/ubuntu                                            Ubuntu is a Debian-based Linux operating sys…   121and1internet/ubuntu-16-apache-php-7.0                    ubuntu-16-apache-php-7.0                        10                                      [OK]1and1internet/ubuntu-16-nginx-php-phpmyadmin-mariadb-10   ubuntu-16-nginx-php-phpmyadmin-mariadb-10       6                                       [OK]eclipse/ubuntu_jdk8                                       Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   6                                       [OK]codenvy/ubuntu_jdk8                                       Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   4                                       [OK]darksheer/ubuntu                                          Base Ubuntu Image -- Updated hourly             4                                       [OK]1and1internet/ubuntu-16-apache                            ubuntu-16-apache                                3                                       [OK]1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4         ubuntu-16-nginx-php-5.6-wordpress-4             3                                       [OK]1and1internet/ubuntu-16-sshd                              ubuntu-16-sshd                                  1                                       [OK]pivotaldata/ubuntu                                        A quick freshening-up of the base Ubuntu doc…   11and1internet/ubuntu-16-healthcheck                       ubuntu-16-healthcheck                           0                                       [OK]pivotaldata/ubuntu-gpdb-dev                               Ubuntu images for GPDB development              0smartentry/ubuntu                                         ubuntu with smartentry                          0                                       [OK]ossobv/ubuntu...

    En la columna OFICIAL , OK indica una imagen creada y respaldada por la empresa detrás del proyecto. Una vez que hayas identificado la imagen que deseas utilizar, puedes descargarla a tu computadora mediante el pullsubcomando.

    Ejecute el siguiente comando para descargar la ubuntuimagen oficial a su computadora:

    1. docker pull ubuntu

    Verás el siguiente resultado:

    OutputUsing default tag: latestlatest: Pulling from library/ubuntu16ec32c2132b: Pull completeDigest: sha256:82becede498899ec668628e7cb0ad87b6e1c371cb8a1e597d83a47fac21d6af3Status: Downloaded newer image for ubuntu:latestdocker.io/library/ubuntu:latest

    Una vez que se ha descargado una imagen, puede ejecutar un contenedor utilizando la imagen descargada con el runsubcomando. Como vio en el hello-worldejemplo, si no se ha descargado una imagen cuando dockerse ejecuta con el runsubcomando, el cliente Docker primero descargará la imagen y luego ejecutará un contenedor con ella.

    Para ver las imágenes que se han descargado en tu ordenador, escribe:

    1. docker images

    El resultado debería ser similar al siguiente:

    OutputREPOSITORY    TAG       IMAGE ID       CREATED        SIZEubuntu        latest    1318b700e415   13 days ago    72.8MBhello-world   latest    d1165f221234   5 months ago   13.3kB

    Como verá más adelante en este tutorial, las imágenes que utiliza para ejecutar contenedores se pueden modificar y usar para generar nuevas imágenes, que luego se pueden cargar ( el término técnico es “enviar” ) a Docker Hub u otros registros de Docker.

    Veamos cómo ejecutar contenedores con más detalle.

    Paso 5: Ejecución de un contenedor Docker

    El hello-worldcontenedor que ejecutaste en el paso anterior es un ejemplo de un contenedor que se ejecuta y sale después de emitir un mensaje de prueba. Los contenedores pueden ser mucho más útiles que eso y pueden ser interactivos. Después de todo, son similares a las máquinas virtuales, solo que consumen menos recursos.

    A modo de ejemplo, ejecutemos un contenedor con la última imagen de Ubuntu. La combinación de los parámetros -i y -t le brinda acceso interactivo al contenedor a través del shell:

    1. docker run -it ubuntu

    El símbolo del sistema debería cambiar para reflejar el hecho de que ahora está trabajando dentro del contenedor y debería adoptar esta forma:

    Outputroot@d9b100f2f636:/#

    Tenga en cuenta el ID del contenedor en el símbolo del sistema. En este ejemplo, es d9b100f2f636. Necesitará ese ID de contenedor más adelante para identificar el contenedor cuando desee eliminarlo.

    Ahora puedes ejecutar cualquier comando dentro del contenedor. Por ejemplo, vamos a actualizar la base de datos de paquetes dentro del contenedor. No necesitas anteponer ningún comando con sudo, porque estás operando dentro del contenedor como usuario root :

    1. apt update

    Luego instala cualquier aplicación en él. Instalemos Node.js:

    1. apt install nodejs

    Esto instala Node.js en el contenedor desde el repositorio oficial de Ubuntu. Cuando finalice la instalación, verifique que Node.js esté instalado:

    1. node -v

    Verás el número de versión mostrado en tu terminal:

    Outputv10.19.0

    Cualquier cambio que realice dentro del contenedor sólo se aplicará a ese contenedor.

    Para salir del contenedor, escriba exiten el indicador.

    A continuación veamos cómo administrar los contenedores en nuestro sistema.

    Paso 6: Gestión de contenedores Docker

    Después de usar Docker durante un tiempo, tendrá muchos contenedores activos (en ejecución) e inactivos en su computadora. Para ver los activos , use:

    1. docker ps

    Verá un resultado similar al siguiente:

    OutputCONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

    En este tutorial, iniciaste dos contenedores: uno desde la hello-worldimagen y otro desde la ubuntuimagen. Ambos contenedores ya no se están ejecutando, pero aún existen en tu sistema.

    Para ver todos los contenedores (activos e inactivos), ejecute docker psel -amodificador:

    1. docker ps -a

    Verás un resultado similar a este:

    e4dcb273b696   ubuntu        "bash"     About a minute ago   Exited (0) 30 seconds ago             suspicious_hopper79b892f318e9   hello-world   "/hello"   3 minutes ago        Exited (0) 3 minutes ago              boring_jang

    Para ver el último contenedor que ha creado, pásele el -linterruptor:

    1. docker ps -l
    1. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    2. e4dcb273b696 ubuntu "bash" 2 minutes ago Exited (0) About a minute ago suspicious_hopper

    Para iniciar un contenedor detenido, utilice docker start, seguido del ID del contenedor o del nombre del contenedor. Iniciemos el contenedor basado en Ubuntu con el ID de e4dcb273b696:

    1. docker start e4dcb273b696

    El contenedor se iniciará y podrás docker psver su estado mediante lo siguiente:

    CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMESe4dcb273b696   ubuntu    "bash"    2 minutes ago   Up 4 seconds             suspicious_hopper

    Para detener un contenedor en ejecución, utilice docker stop, seguido del ID o el nombre del contenedor. Esta vez, utilizaremos el nombre que Docker le asignó al contenedor, que es sharp_volhard:

    1. docker stop suspicious_hopper

    Una vez que haya decidido que ya no necesita un contenedor, elimínelo con el docker rmcomando, nuevamente utilizando el ID o el nombre del contenedor. Use el docker ps -acomando para buscar el ID o el nombre del contenedor asociado con la hello-worldimagen y elimínelo.

    1. docker rm boring_jang

    Puede iniciar un nuevo contenedor y darle un nombre mediante el --namemodificador. También puede utilizar el --rmmodificador para crear un contenedor que se elimine a sí mismo cuando se detenga. Consulte el docker run helpcomando para obtener más información sobre estas opciones y otras.

    Los contenedores se pueden convertir en imágenes que puedes usar para crear nuevos contenedores. Veamos cómo funciona.

    Paso 7: Confirmación de cambios en un contenedor en una imagen de Docker

    Cuando inicia una imagen de Docker, puede crear, modificar y eliminar archivos como lo haría con una máquina virtual. Los cambios que realice solo se aplicarán a ese contenedor. Puede iniciarlo y detenerlo, pero una vez que lo destruya con el docker rmcomando, los cambios se perderán para siempre.

    Esta sección le muestra cómo guardar el estado de un contenedor como una nueva imagen de Docker.

    Después de instalar Node.js dentro del contenedor de Ubuntu, ahora tienes un contenedor que se ejecuta a partir de una imagen, pero el contenedor es diferente de la imagen que usaste para crearlo. Sin embargo, es posible que quieras reutilizar este contenedor de Node.js como base para nuevas imágenes más adelante.

    Luego, confirme los cambios en una nueva instancia de imagen de Docker usando el siguiente comando.

    1. docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

    El modificador -m es para el mensaje de confirmación que le ayuda a usted y a otros a saber qué cambios realizó, mientras que -a se utiliza para especificar el autor. El container_ides el que anotó anteriormente en el tutorial cuando inició la sesión interactiva de Docker. A menos que haya creado repositorios adicionales en Docker Hub, el repositorysuele ser su nombre de usuario de Docker Hub.

    Por ejemplo, para el usuario sammy , con el ID de contenedor de d9b100f2f636, el comando sería:

    1. docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

    Cuando envías una imagen, la nueva imagen se guarda localmente en tu computadora. Más adelante en este tutorial, aprenderás a enviar una imagen a un registro de Docker como Docker Hub para que otros puedan acceder a ella.

    Al enumerar nuevamente las imágenes de Docker, se mostrará la nueva imagen, así como la antigua de la que se derivó:

    1. docker images

    Verás un resultado como este:

    OutputREPOSITORY               TAG                 IMAGE ID            CREATED             SIZEsammy/ubuntu-nodejs   latest              7c1f35226ca6        7 seconds ago       179MBubuntu                   latest              113a43faa138        4 weeks ago         81.2MBhello-world              latest              e38bc07ac18e        2 months ago        1.85kB

    En este ejemplo, ubuntu-nodejsse muestra la nueva imagen, que se derivó de la ubuntuimagen existente de Docker Hub. La diferencia de tamaño refleja los cambios que se realizaron. Y en este ejemplo, el cambio fue que se instaló NodeJS. Por lo tanto, la próxima vez que necesite ejecutar un contenedor con Ubuntu con NodeJS preinstalado, puede usar la nueva imagen.

    También puedes crear imágenes a partir de un archivo .exe Dockerfile, lo que te permite automatizar la instalación de software en una nueva imagen. Sin embargo, esto queda fuera del alcance de este tutorial.

    Ahora compartamos la nueva imagen con otros para que puedan crear contenedores a partir de ella.

    Paso 8: enviar imágenes de Docker a un repositorio de Docker

    El siguiente paso lógico después de crear una nueva imagen a partir de una imagen existente es compartirla con algunos amigos seleccionados, con todo el mundo en Docker Hub o en otro registro de Docker al que tenga acceso. Para enviar una imagen a Docker Hub o a cualquier otro registro de Docker, debe tener una cuenta allí.

    En esta sección se muestra cómo enviar una imagen de Docker a Docker Hub. Para aprender a crear su propio registro de Docker privado, consulte Cómo configurar un registro de Docker privado en Ubuntu 14.04 .

    Para enviar su imagen, primero inicie sesión en Docker Hub.

    1. docker login -u docker-registry-username

    Se le solicitará que se autentique con su contraseña de Docker Hub. Si especificó la contraseña correcta, la autenticación debería realizarse correctamente.

    Nota: Si el nombre de usuario del registro de Docker es diferente del nombre de usuario local que utilizó para crear la imagen, deberá etiquetar la imagen con el nombre de usuario del registro. Para el ejemplo dado en el último paso, debe escribir:

    1. docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

    Luego puedes enviar tu propia imagen usando:

    1. docker push docker-registry-username/docker-image-name

    Para enviar la ubuntu-nodejsimagen al repositorio sammy , el comando sería:

    1. docker push sammy/ubuntu-nodejs

    El proceso puede tardar un tiempo en completarse mientras se cargan las imágenes, pero una vez finalizado, el resultado se verá así:

    OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]e3fbbfb44187: Pushed5f70bf18a086: Pusheda3b5c80a4eba: Pushed7f18b442972b: Pushed3ce512daaf78: Pushed7aae4540b42d: Pushed...

    Después de enviar una imagen a un registro, debería aparecer en el panel de su cuenta, como se muestra en la imagen a continuación.

    Si un intento de inserción da como resultado un error de este tipo, es probable que no hayas iniciado sesión:

    OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]e3fbbfb44187: Preparing5f70bf18a086: Preparinga3b5c80a4eba: Preparing7f18b442972b: Preparing3ce512daaf78: Preparing7aae4540b42d: Waitingunauthorized: authentication required

    Inicie sesión docker loginy repita el intento de inserción. Luego, verifique que exista en la página del repositorio de Docker Hub.

    Ahora puedes usarla para extraer la imagen a una nueva máquina y usarla para ejecutar un nuevo contenedor.docker pull sammy/ubuntu-nodejs

    Conclusión

    En este tutorial, instaló Docker, trabajó con imágenes y contenedores y envió una imagen modificada a Docker Hub. Ahora que conoce los conceptos básicos, explore otros tutoriales de Docker en la Comunidad de DigitalOcean.

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion