Utilizzare Docker Machine per creare hosts in Microsoft Azure

In questo articolo vedremo come creare delle macchine virtuali in Microsoft Azure da utilizzare come Hosts per i container Docker.

Esistono diversi modi per poterlo fare, ma certamente avere un automatismo che mi crei la macchina virtuale e mi installi Docker semplifica di molto il lavoro.

Il comando che permette di creare automaticamente la macchina virtuale da usare come host è docker-machine. Potrete trovare un esauriente articolo alla pagina https://docs.docker.com/machine/, che vi darà un’idea dei comandi da utilizzare.

Il comando docker-machine create creerà per voi l’host per i container, in base ai driver che gli indicherete. I driver https://docs.docker.com/machine/drivers/ rappresentano le piattaforme che possono ospitare il nostro host. Attualmente sono disponibili i seguenti driver:

Creazione tramite Azure Cloud Shell

Il modo più veloce per creare un host container su Azure è l’utilizzo della Azure Cloud Shell. Azure Cloud Shell è una shell interattiva accessibile dal browser che permette di gestire le risorse di Azure. Gli utenti Linux possono scegliere di utilizzare Bash, mentre gli utenti Windows possono scegliere di utilizzare PowerShell. È possibile lanciare la Azure Cloud Shell direttamente dal portale di Azure, come mostrato in figura:

Figura 1: Lancio della Azure Cloud Shell dal portale

Quando lanciate la Azure Cloud Shell dal portale di Microsoft Azure per la prima volta, vi verrà chiesto di creare un gruppo di risorse, un account di archiviazione e una condivisione file (Azure file share). Scegliete di utilizzare Bash (Linux).

Figura 2: Primo lancio della Azure Cloud Shell con la richiesta di creazione dello storage

Dopo aver creato un account di archiviazione con ridondanza locale (LRS), a cui vengono applicati i normali costi di uno storage account, e aver creato una Azure file share, questa verrà utilizzata sia per gli ambienti Bash che PowerShell.

Figura 3: Creazione di Azure Cloud Shell completata

Nella Azure Cloud Shell sono preinstallati i più diffusi strumenti da riga di comando. Quindi non abbiamo bisogno di installare nulla e per lanciare la creazione di una nuova macchina virtuale host ci basterà utilizzare il comando:

docker-machine create -d azure –azure-subscription-id “id_della_vostra_sottoscrizione” –azure-ssh-user ictpower –azure-open-port 80 –azure-size “Standard_D2_v2” dockervm00

Dopo aver lanciato il comando verrà creata una VM chiamata dockervm00 che utilizzerà come sistema operativo Ubuntu 16.04 LTS, in cui verrà installato Docker. Tramite il comando abbiamo anche indicato di rendere disponibile la porta 80 (che verrà aperta nel Network Security Group) e abbiamo scelto di usare per l’autenticazione tramite SSH un utente chiamato ictpower.

Al momento del lancio del comando vi verrà chiesto di autenticarvi, collegandovi al link https://aka.ms/devicelogin ed inserendo il codice monouso visualizzato nella console.

Figura 4: Inserimento del codice monouso nella pagina di autenticazione https://aka.ms/devicelogin

Figura 5: Autenticazione con il proprio account al tenant Azure

Figura 6: Dopo aver completato l’accesso viene richiesta l’autorizzazione al login da parte di Docker Machine for Azure

Figura 7: Autenticazione e Autorizzazione completata

Dopo aver completato la procedura di login ed aver autorizzato Docker Machine for Azure, la creazione della macchina virtuale (resource group, storage account, vnet, public ip, ecc.) procede in autonomia, come mostrato in figura:

Figura 8: Creazione della VM host per i container

Dopo pochi minuti la macchina sarà pronta e sarà possibile cominciare ad utilizzare i container con Docker.

Creazione tramite l’applicazione Docker for Windows

Una maniera alternativa che è possibile utilizzare per la creazione dell’host che ospiterà i nostri container è l’utilizzo dell’applicazione Docker for Windows, che possiamo installare in una macchina locale (io ho usato una macchina con Windows 10), da cui poi lanceremo i comandi per la creazione della VM host su Azure. L’applicazione Docker for Windows, scaricabile dal link https://docs.docker.com/docker-for-windows/install/, è un pacchetto che contiene tutto il necessario per eseguire Docker su un sistema operativo Windows, compresi i tool di gestione a riga di comando.

Figura 9: Installazione dell’applicazione Docker for Windows

Figura 10: Installazione di Docker for Windows completata

Io ho installato l’applicazione su una macchina Windows 10, su cui non ho installato Hyper-V. Lanciando l’applicazione ho ricevuto un messaggio di errore che mi invita ad abilitare il ruolo di Hyper-V, come mostrato in figura. Per l’obiettivo che vogliamo raggiungere non è un’operazione necessaria, in quanto al momento mi interessano solo i tool di gestione a riga di comando.

Figura 11: Messaggio di avviso dell’applicazione Docker for Windows che segnala l’assenza di Hyper-V

Da un Command Prompt con privilegi elevati lanciate lo stesso comando che vi ho mostrato prima e che provvederà a creare la VM chiamata dockervm00

docker-machine create -d azure –azure-subscription-id “id_della_vostra_sottoscrizione” –azure-ssh-user ictpower –azure-open-port 80 –azure-size “Standard_D2_v2” –azure-location westeurope dockervm00

Figura 12: Lancio del comando Docker-machine create

Al momento del lancio del comando vi verrà chiesto di autenticarvi, collegandovi al link https://aka.ms/devicelogin ed inserendo il codice monouso visualizzato nella console.

Figura 13: Login dell’applicazione Docker Machine for Windows con un codice monouso

Figura 14: Autenticazione al tenant di Azure

Figura 15: Autenticazione dell’applicazione Docker for Windows completata

Dopo l’autenticazione viene creata la macchina virtuale con Ubuntu 16.04 LTS e viene installato automaticamente il Docker Engine, che utilizzeremo per far girare i nostri container, come mostrato in figura:

Figura 16: Creazione della VM host completata

Lanciando il comando docker-machine ls ci verrà mostrata la VM che è stata creata, l’indirizzo IP che è stato assegnato alla VM e lo stato della VM, come mostrato in figura:

Figura 17: Informazioni sullo stato della VM host creata su Azure

Durante il processo di provisioning della macchina virtuale, Docker Machine crea un certificato self-signed che verrà utilizzatoper creare una sessione SSH sicura verso il Docker host. La chiave privata del certificato verrà conservata nel profilo dell’utente. Questo permette di creare e gestire i Docker container dallo stesso computer da cui avete effettuato il Docker Host deployment. Per semplificare la gestione dell’Host e per creare i container è sufficiente configurare le variabili d’ambiente aprendo una console di PowerShell con privilegi elevati e lanciando il comando

docker-machine env dockervm00 Invoke-Expression

Adesso che abbiamo configurato l’host, possiamo provare ad eseguire un webserver (nel nostro caso nginx) per testare il suo corretto funzionamento. Eseguiamo quindi un container che usa un’immagine con il webserver nginx, che sia in ascolto sulla porta 80 e che se l’host si riavvia riparta in automatico (–restart=always), lanciando il comando:

docker run -d -p 80:80 –restart=always nginx

Figura 18: Esecuzione del container di test con il webserver nginx

Per collegarci al container appena creato possiamo procurarci il suo indirizzo IP anche con il comando
docker-machine ip dockervm00
e da un browser verificare se il webserver è funzionante e raggiungibile.

Figura 19: Verifica dell’esecuzione del container

Conclusioni

Indipendentemente dal metodo utilizzato, sia con la Azure Cloud Shell che con i tool dell’applicazione Docker for Windows, la creazione di un host su Azure per ospitare i nostri container è un’operazione molto semplice che ci dà un’idea dell’enorme flessibilità offerta sia dal Cloud che dalla tecnologia alla base dei container stessi.