miércoles, 3 de junio de 2020

Subir imagen de Docker a Docker Hub

Recién buscaba como instalar Ubuntu con Docker (mas precisamente, como crear un contenedor con Ubuntu 20.04 a partir de una imagen de Docker Oficial), y la mayoría de los resultados me decía como instalar Docker en Ubuntu. Así que, si buscabas lo mismo que yo, este es el lugar.

¿Para que nos puede servir tener un contenedor con Ubuntu? Para un millón de cosas, pero por ejemplo, en un entorno de pruebas, en lugar de crear 2 o 3 máquinas virtuales con VirtualBox y Ubuntu podríamos simplemente crear 2 o 3 contenedores con dicho sistema operativo, algo que sería muchísimo mas rápido y práctico. Y yendo un poco mas lejos, podríamos tener una imagen de Ubuntu con todo lo necesario para que solamente tengamos que descargarla, levantar el contenedor y ya tendríamos todo a disposición. Esto es lo que vamos a hacer en este post.

Primero vamos al Docker Hub y buscamos la imagen Oficial de Ubuntu.
En este caso vamos a instalar la ultima (que es la 20.04) con el siguiente comando:

sudo docker pull ubuntu:latest

Si quisieramos otra versión podríamos revisar las etiquetas  y ver que por ejemplo para instalar la 19.10 deberíamos usar docker pull ubuntu:19.10 o si quisieramos la Bionic que es la 18.04 deberíamos ejecutar docker pull ubuntu:bionic.

Luego de ejecutar el comando aguardamos unos minutos dependiendo nuestra conexión y quedará descargada:


Para chequear:

sudo docker images


Ahora vamos a levantar un contenedor a partir de dicha imagen, llamado VirtualUbuntu00 y al mismo tiempo vamos a iniciar una shell de bash en el contenedor:

sudo docker run --name VirtualUbuntu00 -it ubuntu:latest /bin/bash

Vamos a verificar la versión del Kernel del mismo con:

uname -a



Vemos la versión del Kernel y también vemos en el prompt el ID del contenedor. Para salir del contenedor ejecutamos exit, y para ver todos los contenedores creados ejecutamos:

sudo docker ps -a


Vemos que el ID del contenedor es 194f88de1428 que es el que nos aparecía antes en el prompt.

Para iniciar el contenedor ejecutamos:

sudo docker start VirtualUbuntu00

Para conectarnos al contenedor a través de una shell de bash ejecutamos:

sudo docker exec -it VirtualUbuntu00 /bin/bash

Y vemos que cambia el prompt otra vez (y nos conecta como root por defecto):


Actualizamos los repos y el sistema operativo:

apt-get update

apt-get upgrade


Ahora vamos a crear un usuario de prueba y agregarlo a sudoers:
Creamos usuario:

adduser ardillasenlared


Instalamos nano, sudo y editamos el archivo sudoers:

apt-get install nano

apt-get install sudo

nano /etc/sudoers

Y pegamos lo siguiente:

ardillasenlared ALL=(ALL:ALL) ALL


Guardamos y salimos.

Ahora nos logueamos en el contenedor con el nuevo usuario:

login ardillasenlared


Instalamos el paquete net-tools desde ardillasenlared para probar:

sudo apt-get install net-tools


Si bien se instaló, me devuelve un error:

sudo: setrlimit(RLIMIT_CORE): Operation not permitted

Lo pueden ignorar, al parecer es un bug de mi versión de sudo, o si quieren solucionarlo crean como root el archivo /etc/sudo.conf con la siguiente linea:

Set disable_coredump false


Vemos que me da el error con el sudo nano /etc/sudo.conf, luego como root creo el archivo con la linea, me vuelvo a loguear como ardillasenlared y cuando vuelvo a ejecutar sudo nano /etc/sudo.conf y ya no me devuelve el error.

Bueno, ahora vamos a instalar el ping (no lo trae por defecto, tremendo):

sudo apt install iputils-ping


Ya tenemos ping, pruebo pinguear el host donde esta corriendo el contenedor y vemos que responde:


Si vamos a conectarnos por SSH vamos a necesitar instalarlo:

sudo apt-get install ssh


Ya tenemos SSH en el Ubuntu del contenedor.

Como habrán notado, llevamos algunos minutos instalando y probando cosas, supongamos que quiero otro contenedor mas con todo esto, ¿tengo que hacer todo de vuelta?
No, lo que vamos a hacer ahora es crear una imagen a partir de nuestro contenedor que ya tiene todo lo que necesitamos instalado. La idea es, por un lado, hacer que todo este tiempo lo ahorremos en futuros contenedores, y por el otro, no instalar demasiadas cosas para que la imagen no sea muy grande y podamos descargarla rápidamente.

Primero vamos a salir de nuestro contenedor. Anteriormente salimos con el comando exit (que es equivalente a pulsar Ctrl+D). Sin embargo, este método también detiene la ejecución del contenedor. Si queremos salir del contenedor sin detener su ejecución tenemos que hacer algo llamado "detach", para hacerlo hay que mantener pulsada la tecla Ctrl y luego, sin soltar en ningún momento, presionar primero la P y luego la Q.

Al salir si hacemos un:

sudo docker ps -a

Vemos que en Status nos figura Up:


Para crear la imagen del contenedor ejecutamos:

sudo docker commit 194f88de1428 ubuntu20.04_ok

Donde 194f88de1428 es el ID del contenedor, y ubuntu20.04_ok el nombre de la imagen.

El nombre del repositorio debe estar en minúscula
Listo, ya tenemos nuestra imagen creada, chequeamos y deberían aparecernos 2, la que descargamos del Docker Hub y la que acabamos de crear:

sudo docker images


Vemos que la nuestra pesa bastante mas, y tiene sentido porque tiene varios paquetes instalados.

Ahora vamos a crear un contenedor a partir de esta imagen para ver si tenemos creado por defecto el usuario de ardillasenlared, si tenemos instalado el ping y el ssh.
Al nuevo contenedor, para diferenciarlo del otro, lo vamos a llamar VirtualUbuntu01 (el anterior era VirtualUbuntu00) y al mismo tiempo vamos a iniciar una shell de bash en el contenedor para verificar todo:

sudo docker run --name VirtualUbuntu01 -it ubuntu20.04_ok /bin/bash


Si hacemos un cat a /etc/passwd vemos que me creó el usuario ardillasenlared y también veo un usuario de servicio sshd con lo cual intuyo que también tengo el ssh:


Efectivamente, tengo ssh instalado. Voy a probar el login con el usuario de ardillasenlared:

login ardillasenlared

Vemos que el nuevo contenedor tiene el usuario creado y el ping funcionando:


Bueno, y ahora, como frutilla del postre vamos a subir nuestra imagen a Docker Hub para poder descargarla desde cualquier maquina del planeta (?).

Para subir nuestra imagen a Docker Hub, primero tenemos que crearnos una cuenta acá, luego, desde la maquina donde tenemos la imagen de Docker que vamos a subir ejecutamos:

sudo docker login

Y nos logueamos con las credenciales que dimos de alta en la pagina:


Para subir la imagen tenemos que seguir una nomenclatura que es:

nombre_de_usuario/nombre_del_repositorio:etiqueta

En mi caso será:

ardillasenlared/ubuntu:ardillas

Lo que hacemos ahora es generar un tag o etiqueta de nuestra imagen local con esa nomenclatura:

sudo docker tag ubuntuardillas ardillasenlared/ubuntu:ardillas

El nombre ubuntuardillas lo tienen que cambiar por el nombre de la imagen local que van a subir, y ardillasenlared/ubuntu:ardillas por el nombre con la nomenclatura de Docker Hub.


Vemos que las imágenes ubuntuardillas y ardillasenlared/ubuntu tienen el mismo ID, figuran creadas hace el mismo tiempo y pesan lo mismo, porque en realidad se trata de la misma imagen. Ahora si, ya estamos en condiciones de subir nuestra imagen:

sudo docker push ardillasenlared/ubuntu:ardillas


Comienza a subir la imagen, esto puede demorar algunos minutos dependiendo del tamaño de la imagen y de nuestra conexión de internet:


Listo, ya tenemos la imagen subida al Docker Hub, ya puedo descargarla desde cualquier maquina. Incluso vos podrías descargarla desde tu maquina, el único requisito es tener el motor de Docker instalado que lo explico en este post.

Si accedemos a la pagina de Docker Hub vemos que ya esta subida:


Ahora vamos a probar si está todo bien.
Voy a otra maquina y ejecuto:

sudo docker pull ardillasenlared/ubuntu:ardillas


Una vez finalizado chequeamos nuestras imágenes descargadas:

sudo docker images

Y vemos que tenemos disponible la que dice ardillasenlared/ubuntu:


Ahora como paso final, vamos a levantar un contenedor a partir de dicha imagen, llamado VirtualArdillas y al mismo tiempo vamos a iniciar una shell de bash en el contenedor:

sudo docker run --name VirtualArdillas -it ardillasenlared/ubuntu:ardillas /bin/bash

Y por ultimo, la prueba de fuego, probamos loguearnos con el usuario ardillasenlared (contraseña: ardillas), probamos ping, ssh e instalar algo con sudo:

login ardillasenlared

ping 192.168.2.106

ssh ardillasenlared@192.168.2.106

sudo apt-get install mc

Y vemos que funcionó todo:


TREMENDO, esto de Docker es una verdadera locura (?).

Bueno, como paso final, para ahorrar espacio, podrías borrar las imágenes locales ya que ahora la tenes "en la nube".

Para detener los contenedores que están corriendo ejecutas:

sudo docker kill nombredelcontenedor

Para eliminar los contenedores:

sudo docker rm nombredelcontenerdor

Para eliminar las imágenes descargadas:

sudo docker rmi nombredelaimagen

Si intentan eliminar una imagen que tiene un contenedor creado a partir de la misma, deberán eliminar primero el contenedor y luego la imagen, o bien utilizar el parámetro -f:

sudo docker rmi -f nombredelaimagen

Acá elimina la imagen a la fuerza pero deja el contenedor.

No mas por hoy...

COMPARTI, ¿que te cuesta?

Como te ven te tratan, y si te ven mal, te maltratan, ¿y si te ven bien?

Te contratan. Adiós.

No hay comentarios:

Publicar un comentario