Crea hosts de Docker con Docker Machine en Microsoft Azure

Preparando una de las clases que imparto en el Bootcamp DevOps de Lemoncode me hacía falta crearme un host Linux con Docker Engine instalado. Como solo dispongo de Mac y Windows en casa, he hecho uso de la herramienta Docker Machine para poder crear una máquina virtual con todo listo para usar, sin tener que preocuparme de hacer las instalaciones necesarias. En este artículo te cuento cómo.

¿Qué es Docker Machine?

Docker Machine es una herramienta que te permite instalar Docker Engine en host virtuales y administrarlos a través de la línea de comandos. Puedes usarla tanto en Windows, Mac, Linux como con proveedores cloud. En este artículo vamos a verla funcionando tanto en local como en con la nube.

Probándolo en local

Dependiendo del sistema operativo debes seguir los siguientes pasos para su instalación. En mi ejemplo he usado la opción para MacOs:

base=https://github.com/docker/machine/releases/download/v0.16.0 \
  && curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/usr/local/bin/docker-machine \
  && chmod +x /usr/local/bin/docker-machine

Para crear una máquina virtual en tu hipervisor local es tan sencillo como ejecutar el siguiente comando:

docker-machine create docker-on-linux

En el caso de MacOs se utiliza VirtualBox y le he dado el nombre de docker-on-linux. Una vez generada podrás verla en la interfaz del hipervisor:

docker-on-linux en VirtualBox

Lo siguiente que necesitas hacer es conectar tu cliente local de Docker con esta nueva instalación remota. Para ello puedes usar este comando en Mac, que básicamente lo que hace es exportar un conjunto de variables de entorno que el cliente de docker utiliza para saber a dónde se debe conectar:

eval $(docker-machine env docker-on-linux)

A partir de este momento el terminal donde lo has ejecutado estará enganchado al Docker Engine de tu nueva máquina virtual y podrás utilizar los comandos de Docker a los que ya estás acostumbrad@. Si quisieras recuperar el comando para conectarte a la máquina desde Windows necesitarías utilizar este otro (en este ejemplo se asume que se está utilizando un terminal con PowerShell):

docker-machine env --shell powershell docker-on-linux

Para comprobar que esto funciona correctamente, crea un contenedor:

docker run -d -p 9090:80 nginx

En este caso, la IP de la máquina virtual creada es 192.168.99.100, por lo que para poder acceder a este nuevo Nginx desde tu máquina local deberías de utilizar http://192.168.99.100:9090

Cómo usarlo con Microsoft Azure

Al igual que puedes usarlo con hipervisor en local, también puedes hacerlo con proveedores cloud. En el caso de Microsoft Azure, es tan sencillo como esto:

docker-machine create --driver azure \
--azure-subscription-id <YOUR_SUBSCRIPTION_ID> \
--azure-size "Standard_B1ms" \
--azure-location "northeurope" \
--azure-resource-group "Docker-On-Azure" \
docker-vm

Nota: Por defecto elige el tamaño de máquina virtual Standard_A2. Para saber qué tamaños puedes elegir puedes consultarlos con el siguiente comando de Azure CLI:

az vm list-sizes --location northeurope -o table

Aquí puedes ver el resto de parámetros que puedes utilizar.

Una vez lanzado el comando,lo primero que vas a necesitar es iniciar sesión con la cuenta de Microsoft Azure asociada a la suscripción que has especificado. Si el login es satisfactorio comenzará la creación de la máquina.

Creación de una VM con Docker en Microsoft Azure usando Docker Machine

Cuando haya finalizado, si accedes a la suscripción en cuestión y localizas el grupo de recursos Docker-On-Azure podrás ver todo lo que ha creado por ti, además de instalar dentro de la VM Docker Engine.

Grupo de recursos Docker-On-Azure

De nuevo, para comprobar que funciona correctamente, engancha el terminal al nuevo Docker Engine remoto y crea de nuevo un contenedor de prueba:

eval $(docker-machine env docker-vm)
docker run -d --name my_nginx -p 8080:80 nginx

En este caso la IP de acceso que debemos usar es una pública, que Microsoft Azure ha generado bajo la petición de Docker Machine. Para recuperarla puedes hacer uso del siguiente comando:

docker-machine ip docker-vm

Por defecto los puertos de la VM no son accesibles, por lo que tendrás que crear una regla para el puerto 8080 en el Network Security Group del grupo de recursos (este recurso se llamará docker-vm-firewall si has utilizando el mismo nombre que yo para la máquina):

az network nsg rule create \
    --resource-group "Docker-On-Azure" \
    --nsg-name "docker-vm-firewall" \
    --name "my-nginx-rule" \
    --protocol tcp \
    --priority 101 \
    --destination-port-range 8080

Ahora haz una petición a través del puerto 8080 para acceder a tu contenedor con Nginx:

bootcamp-devops-lemoncode [master] ⚡  curl <YOUR_PUBLIC_IP>:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

O bien accede desde el navegador web a http://<TU_IP_PÚBLICA>:8080

También puedes conectarte de manera sencilla por SSH a la máquina, con la ayuda de Docker Machine:

docker-machine ssh docker-vm

Si ahora listas todos los hosts con Docker que has generado con Docker Machine, deberías de tener uno local en tu hipervisor y otro en Microsoft Azure.

docker-machine ls

En el resultado verás algo parecido a esto:

docker-machine ls

Para eliminarlas basta con utilizar docker-machine rm <NOMBRE_DE_LA_MAQUINA> y la herramienta se encargará de desprovisionar todo por ti.

¡Saludos!

logo lemoncode

 

 

Bootcamp DevOps

Si tienes ganas de meterte en el área de DevOps, formo parte del
equipo de docentes del Bootcamp DevOps Lemoncode, ¿Te animas a
aprender con nosotros?

Más Info