Introducción
Docker es un software que simplifica el proceso de administración de aplicaciones en contenedores. Estos permiten ejecutar sus aplicaciones en procesos con aislamiento de recursos. Son similares a las máquinas virtuales, pero los contenedores son más portátiles, más flexibles con los recursos y más dependientes del sistema operativo host.
Desarrolladores de Docker
La empresa, Docker Inc., desarrolla el trabajo de la comunidad Docker, lo hace más seguro y comparte estos avances con el resto de la comunidad. También respalda las tecnologías mejoradas y reforzadas para los clientes empresariales.
La comunidad open source Docker trabaja para mejorar estas tecnologías a fin de beneficiar a todos los usuarios de forma gratuita.
Enlace a la página oficial de Docker
Requisitos previos
Para completar este tutorial, necesitará lo siguiente:
- Un ordenador con Ubuntu 20.04 y un usuario sudo no root.
- Una cuenta en Docker Hub.
Paso 1: Instalar Docker
Importante: Para este tutorial vamos a utilizar la imagen de Ubuntu 20.04 Desktop, aunque para otras distribuciones el proceso de instalación resulta similar.
Es posible que la versión del paquete de instalación de Docker disponible en el repositorio oficial de Ubuntu no sea la más reciente. Para asegurarnos de contar con la versión más actualizada, instalaremos Docker desde el repositorio oficial de Docker.
Primero, actualizamos la lista de paquetes existentes:
$ sudo apt update
A continuación, añadimos algunos paquetes necesarios para que APT pueda usar paquetes a través de HTTPS:
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
Luego, añadimos la clave de GPG para el repositorio oficial de Docker en nuestro sistema:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
La salida debe ser la siguiente:
Agregamos el repositorio de Docker a las fuentes de APT:
$ sudo add-apt-repository «deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable»
A continuación, actualizamos el paquete de base de datos con los paquetes de Docker del repositorio que acabamos de agregar:
$ sudo apt update
Comprobamos la versión que vamos a instalar y como podemos observar el candidato para la instalación es la versión 20.10.5:
$ apt-cache policy docker-ce
Por último, instalamos Docker:
$ sudo apt install docker-ce
Comprobamos que la versión que hemos implantado efectivamente coincide con la versión candidata.
$ docker –version
Verificamos que el servicio está corriendo correctamente.
$ sudo systemctl status docker
Paso 2 : Ejecutar el comando Docker sin sudo (opcional)
Por defecto, el comando docker solo puede ser ejecutado por el usuario root o un usuario del grupo docker, que se crea automáticamente durante el proceso de instalación de Docker. Si intentamos ejecutar el comando docker sin sudo como prefijo o sin formar parte del grupo docker, obtendremos un resultado como este:
Si queremos evitar escribir sudo al ejecutar el comando docker, debemos agregar nuestro nombre de usuario al grupo docker:
$ sudo usermod -aG docker ${USER}
Cambiamos ${USER} por nuestro nombre de usuario, en mi caso es pablo y quedaría del siguiente modo:
$ sudo usermod -aG docker pablo
Para aplicar los cambios sin tener que reiniciar el equipo debemos escribir el siguiente comando, al igual que antes cambiamos ${USER} por nuestro nombre de usuario.
$ su – pablo
Paso 3: Usar el comando docker
El uso de docker consiste en pasar a este una cadena de opciones y comandos seguida de argumentos. La sintaxis adopta esta forma:
$ docker [opciones] [comando] [argumento]
Para ver todos los subcomandos disponibles, escribimos lo siguiente:
$ docker
Si deseamos ver las opciones disponibles para un comando específico, escribimos lo siguiente:
$ docker subcomando-docker –help
Para ver información sobre Docker relacionada con todo el sistema, utilizamos el siguiente comando:
$ docker info
Paso 4: Trabajar con imágenes de Docker
Los contenedores de Docker se construyen con imágenes de Docker. Por defecto, Docker obtiene estas imágenes de Docker Hub, un registro de Docker gestionado por Docker, la empresa responsable del proyecto Docker. Cualquiera puede alojar sus imágenes en Docker Hub, de modo que la mayoría de las aplicaciones y las distribuciones de Linux que necesitaremos tendrán imágenes alojadas allí.
Para verificar si puede acceder a imágenes y descargarlas de Docker Hub, escribimos lo siguiente:
$ docker run hello-world
Si la salida que nos devuelve coincide con la plasmada en la imagen anterior, entonces podemos descargar correctamente imágenes de Docker Hub.
Inicialmente, Docker no pudo encontrar la imagen de hello-world a nivel local. Por ello la descargó de Docker Hub, el repositorio predeterminado. Una vez que se descargó la imagen, Docker creó un contenedor a partir de ella y de la aplicación dentro del contenedor ejecutado, y mostró el mensaje.
Podemos buscar imágenes disponibles en Docker Hub usando el comando docker con el subcomando search. Por ejemplo, para buscar la imagen de Ubuntu, escribimos lo siguiente:
$ docker search ubuntu
El comando que acabamos de ejecutar buscará en los repositorios de Docker Hub en busca de imágenes que coincidan con el criterio de búsqueda y devuelve los posibles candidatos.
En la columna de OFFICIAL, OK indica que la imagen creada está avalada por la empresa responsable del proyecto. Una vez que identifique la imagen que desearía usar, podemos descargarla utilizando el subcomando docker pull.
$ docker pull ubuntu
Para ver las imágenes que tenemos disponibles localmente utilizamos el comando:
$ docker images
Paso 5: Ejecutar un contenedor de Docker
El contenedor hello-world que creamos en el paso anterior es un ejemplo de un contenedor que se ejecuta y se cierra tras emitir un mensaje de prueba. Los contenedores pueden ofrecer una utilidad mucho mayor y ser interactivos
Como ejemplo, ejecutemos un contenedor usando la imagen más reciente de Ubuntu. La combinación de los conmutadores -i y -t le proporcionan un acceso interactivo del shell al contenedor:
$ docker run -it ubuntu
Nuestros símbolos del sistema deben cambiar para reflejar el hecho de que ahora estamos trabajando dentro del contenedor.
Ahora podemos ejecutar cualquier comando dentro del contenedor. Por ejemplo, actualizar los repositorios. No es necesario prefijar ningún comando con sudo, ya que todas las operaciones dentro del contenedor se ejecutan por defecto con el usuario root:
$ apt update
Importante: Cuando trabajamos con contenedores debemos tener en cuenta un detalle y es que las imágenes que implementamos en muchas ocasiones pueden no tener instaladas algunas aplicaciones que por defecto si vienen instaladas en otras imágenes. Un claro ejemplo es que el contenedor de Ubuntu que estamos utilizando no tiene el editor de texto nano.
$ nano ficheroprueba
El motivo por el que no está instalado por defecto este editor es simple, las imágenes de Docker buscan ser lo más ligeras y modulares posibles para ofrecer servicios de una manera sencilla y rápida. Por lo que instalar programas innecesarios que harían que el tamaño de la máquina fuese mayor va en contra del propósito por el que fue creada esta tecnología.
Para instalar nano ejecutamos el comando apt seguido del programa que deseamos instalar.
$ apt install nano
Comprobamos que versión hemos instalado.
$ nano –version
Paso 6: Administrar contenedores de Docker
Para mostrar los contenedores activos utilizamos el comando:
$ docker ps
El comando no ha devuelto ningún contenedor ¿por qué? Esto se debe a que si no añadimos la opción -d al comando docker run, cuando salimos del contenedor estos se paran.
Para comprobar los contenedores activos e inactivos utilizamos el comando:
$ docker ps -a
Para ver el último contenedor que ha sido creado utilizamos la opción -l:
$ docker ps -l
Para iniciar un contenedor detenido, utilizamos docker start, seguido del nombre del contenedor o el ID. Vamos a iniciar el contenedor basado en Ubuntu con el ID cf9cc8313e87:
$ docker start cf9cc8313e87
Para detener un contenedor, utilizamos docker stop, seguido del ID o nombre del contenedor. Esta vez usaremos el nombre que Docker asignó al contenedor, que es nostalgic_grothendieck:
$ docker stop nostalgic_grothendieck
Una vez que decidamos que ya no necesitamos un contenedor, lo eliminamos con el comando docker rm y el nombre o ID. Utilizamos el comando docker ps -a para visualizar el ID o nombre del contenedor asociado con su imagen y eliminarlo.
$ docker rm nostalgic_grothendieck
Del mismo modo que hemos borrado el contenedor una vez detenido, también podemos eliminarlo mientras está aún corriendo con la opción -f.
$ docker rm -f nombre_contenedor
Podemos iniciar un nuevo contenedor y darle un nombre usando el conmutador –name. También podemos usar el conmutador –rm para crear un contenedor que se elimine de forma automática cuando se detenga. Consulte el comando docker run help para obtener más información sobre estas y otras opciones.
Paso 7: Creación de una imagen personalizada a partir de un contenedor
Los contenedores pueden convertirse en imágenes que podremos usar para crear contenedores nuevos. Veamos cómo funciona esto.
Después de instalar el editor de texto nano dentro del contenedor de Ubuntu, dispondremos de un contenedor que se ejecuta a partir de una imagen, pero este es diferente de la imagen que utilizamos para crearlo. Sin embargo, quizás deseemos reutilizar este contenedor que ya tiene instalado nano como base de nuevas imágenes posteriormente.
$ docker commit -m «Escribimos una breve descripción del contenedor» -a «Nombre del autor» id_contenedor repositorio/nombre_nueva_imagen
El conmutador -m es el mensaje que permite a otros saber qué cambios realizamos, mientras que -a se utiliza para especificar el autor. El container_id es el que observamos anteriormente en el tutorial cuando iniciamos la sesión interactiva de Docker. A menos que hayamos creado repositorios adicionales en Docker Hub, el campo repositorio generalmente corresponde a nuestro nombre de usuario de Docker Hub.
Partiendo del siguiente caso vamos a crear una imagen personalizada de ubuntu con el editor de texto preinstalado por nosotros.
Con el comando exit salimos del contenedor y adaptamos el comando anterior a nuestro propio caso.
$ docker commit -m «Ubuntu con editor de texto» -a «Pablo» bea6a695cbc3/ubuntu_con_nano
Comprobamos que se ha guardado la imagen localmente con el nombre pjvdockerhub/ubuntu_con_nano
$ docker images
Paso 8: Guardar imágenes de Docker en un repositorio de Docker
En primer lugar, nos registramos en Docker Hub accediendo a su página https://hub.docker.com/.
A continuación iniciamos sesión en Docker Hub con el siguiente comando.
Importante: Se le solicitará autenticarse usando su contraseña de Docker Hub.
$ docker login -u nombre_de_usuario
Para el ejemplo que se muestra en el último paso, deberemos escribir lo siguiente:
$ docker tag pjvdockerhub/ubuntu_con_nano pjvdockerhub/ubuntu_con_nano
Para guardar la imagen de nuestro contenedor en nuestro repositorio de Docker Hub utilizamos el comando.
$ docker push nombre_de_usuario/nombre_imagen
Siguiendo el esquema anterior mi comando quedaría así.
$ docker push pjvdockerhub/ubuntu_con_nano
Iniciamos sesión en nuestro repositorio de docker y comprobamos que ya tenemos disponible nuestra imagen.
Para utilizar esta imagen en cualquier equipo primero iniciamos sesión en docker con el comando docker login -u nombre_usuario y luego escribimos el siguiente comando:
$ docker pull nombre_de_usuario/imagen
En mi caso el comando queda del siguiente modo:
$ docker pull pjvdockerhub/ubuntu_con_nano
Paso 9: Practica con Docker Playground
Podemos practicar gratuitamente Docker desde la siguiente página https://labs.play-with-docker.com/
Hacemos clic sobre Añadir nueva instancia y ya podemos comenzar a practicar con Docker.
Comprobamos la versión de Docker que viene instalada.
Ejercicio: Utiliza Docker Playground para instalar un servidor web Apache.
Solución:
En primer lugar, buscamos una imagen de apache en los repositorios de Docker Hub.
$ docker search apache
Descargamos la imagen oficial de apache httpd.
$ docker pull httpd
Creamos el contenedor de apache.
$ docker run -dit –name servidor_web -p 80:80 httpd
Parámetros docker run:
-d = permite ejecutar el contenedor en segundo plano
-i = permite que el contenedor sea interactivo
–t = proporciona al contenedor una terminal
–-name = nombre del contenedor
-p = permite mapear puertos desde el interior del contenedor 80:80 al exterior del contenedor 80:80. El puerto que utilizamos ha sido el 80 porque es el puerto por defecto que utiliza apache para conexiones no seguras.
Comprobamos que el servidor apache está funcionando correctamente, para ello hacemos clic sobre el puerto mapeado.
Como podemos observar el servidor de apache nos sirve una página que muestra un mensaje de éxito.
Conclusiones
Docker es un entorno que nos permite el despliegue rápido y sencillo de contenedores, estos no son ni más ni menos que máquinas virtuales livianas y modulares con las que podemos crear una aplicación en cuestión de segundos. Esta tecnología tiene una gran comunidad open source que la respalda y sube gran cantidad de documentación sobre el tema. Además, con Docker Hub podemos tener nuestras imágenes preferidas subidas a nuestro repositorio personal y utilizarlas donde quiera que estemos.
Deja una respuesta