Archivi categoria: docker

Solomon Hykes lascia Docker: il saluto del papà dei container.

Facebooktwittergoogle_plusredditlinkedin

Una settimana fa circa il fulmine a ciel sereno: Solomon Hykes abbandona Docker.

Per chi non lo conoscesse, seppure per l’esattezza non abbia inventato i container, sicuramente è stata la persona che più di tutti ha contribuito a renderli popolari ed uno standard de-facto su cui son nate e sono evolute una serie di altre tecnologie come Kubernetes, per citarne una.

Non si può iniziare a parlare del buon Hykes senza condividere il video di 5 minuti in cui, al PyCon 2013, presentò al mondo Docker, un tool che utilizzavano in dotCloud (società francese fondata da Hykes stesso), per gestire comodamente i container Linux:

Se come dotCloud fornivano servizi per la gestione di applicazioni scalabili usando questa “nuova” tecnologia chiamata container, la presentazione di Docker cambiò il target: finalmente un semplice tool poteva gestire tutto dal network al filesystem, dai namespace dei processi ai cgroup per la gestione delle risorse. Questo fece esplodere il fenomeno al punto che, 5 anni fa, dotCloud cambiò nome come Docker.

Il buon Hykes, che ai tempi era il CEO di dotCloud, insieme alle altre 5 persone al lavoro, decise di assumere un nuovo CEO per Docker in grado di sostenere l’azienda e con esperienza nel ruolo, e si ritagliò il ruolo di CTO (Chief Tecnical Officer). E tutto ha continuato a crescere.

Ora la situazione si è nuovamente evoluta: con la crescita della base clienti di Docker (soprattutto della sua Docker Enterprise Edition), ed in generale della società, si è reso fondamentale trovare un nuovo CTO con l’esperienza necessaria sia al lavoro in team con Steve Singh (attuale CEO), che nella gestione tecnologica della società stessa. E così il ruolo di Hykes cambierà ancora: in un primo momento aiuterà a trovare il CTO ideale al compito e successivamente fornirà la consulenza allo stesso per capire come collaborare al meglio con il team tecnico già presente in azienda.

Sicuramente un ruolo che gli permetterà di mantenere un piede in Docker, lasciandogli però il tempo di continuare a lavorare su altro e chissà, magari, cambiare il mondo dell’IT un’altra volta.

Vi lasciamo al post ufficiale di Hykes sul blog, in cui spiega bene -seppur con un pochino di amarezza- i vari passaggi che l’hanno portato dove è adesso.

Secondo ZDNet i container sono sanissimi, quanto a Docker (l’azienda)…

Facebooktwittergoogle_plusredditlinkedin

Nell’aprile dello scorso anno abbiamo parlato di come Docker avesse deciso di scindere il suo prodotto OpenSource dalla sua controparte commerciale, creando il Moby Project. La mossa era chiaramente volta a separare l’aspetto tecnologico dal lato business ed in termini di chiarezza fu sicuramente una scelta condivisibile.

Ebbene, un anno dopo come sta l’azienda Docker? Secondo ZDNet non molto bene, poiché manca di un business plan.

Non usa infatti mezze parole Steven J. Vaughan-Nichols nel suo articolo, per illustrare come a differenza delle aziende di servizi concorrenti (Google, Microsoft e Amazon) e delle aziende che producono software per gestire la piattaforma (come Red Hat/CoreOS, Canonical e Mirantis), Docker non abbia un piano preciso.

Docker, secondo l’autore, produce unicamente un framework OpenSource per il formato più popolare di container utilizzati.

E pare che la separazione decisa lo scorso anno giochi a favore della confusione: il meccanismo di subscription previsto pare non avere appeal sul mercato, proprio perché il mercato stesso non sa che cosa c’è da comprare. E con l’ascesa di Kubernetes le cose non hanno fatto altro che peggiorare.

Tutti sanno che l’OpenSource è pregno di valori ed aspetti morali positivi, ma senza il cash le aziende falliscono. Sarà questo anche il caso del balenottero?

Creare un Azure Container Service (ACS) con un Kubernetes cluster

Facebooktwittergoogle_plusredditlinkedin

Abbiamo già visto in diversi articoli apparsi su questo sito che l’utilizzo dei container ci permette di migliorare l’utilizzo delle macchine virtuali sia on-premises che nel Cloud. Tuttavia, per migliorare l’affidabilità e la scalabilità, è necessario far girare decine se non migliaia di container utilizzando diversi Host. Azure Container Service, servendosi di diversi tipi di container orchestrator open source come Docker Swarm, Kubernetes e Marathon di Mesosphere’s DC/OS, permette di semplificare tantissimo la gestione dei container cluster.

In questo articolo analizzeremo l’uso di Kubernetes e della sua implementazione in Azure.

Introduzione

Azure Container Service (ACS) permette di gestire cluster di diversi Docker Hosts, dandoci la possibilità di scalare le nostre applicazioni gestendo decine di migliaia di container grazie anche ad orchestrator come Kubernetes.

Google ha rilasciato Kubernetes nel Febbraio 2015 proprio con lo scopo di orchestrare i container Docker. A Marzo 2016 ha reso il codice open source, donandolo alla Cloud Native Computing Foundation (CNCF) e impegnandosi al suo continuo sviluppo. Fin dall’inizio il software ha riscosso parecchio successo tra gli sviluppatori grazie alle numerose funzionalità che supporta.

Creazione di un cluster Kubernetes utilizzando Azure Container Service

Per creare un cluster Kubernetes in Azure è possibile utilizzare il portale web, un template di Azure Resource Manager oppure Azure CLI 2.0. In alternativa è anche possibile utilizzare un progetto open source presente su Github chiamato acs-engine per definire il cluster e per poterlo creare utilizzando Azure CLI 2.0.

Il modo più veloce per creare un cluster container su Azure è l’utilizzo della 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 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 account

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

Figura 3: Avvio della Azure Cloud Shell con Bash

Nella Azure Cloud Shell sono preinstallati i più diffusi strumenti da riga di comando, compreso Azure CLI 2.0, che utilizzeremo per creare l’Azure Container Service. Per prima cosa creiamo un Resource Group con il comando

az group create --name ACS-LabRG --location westeurope

e successivamente creiamo un nuovo servizio di Azure Container Service con orchestrator Kubernetes lanciando il comando

az acs create --orchestrator-type kubernetes --resource-group ACS-LabRG --name ACS-k8scluster --generate-ssh-keys

Figura 4: Creazione del nuovo Azure Container Service

Figura 5: Oggetti creati per l’Azure Container Service

Dopo aver atteso la creazione del nuovo Azure Container Service (che durerà alcuni minuti) possiamo scaricare e configurare le credenziali per accedere all’ACS Kubernetes cluster lanciando il comando

az acs kubernetes get-credentials --resource-group ACS-LabRG --name ACS-k8scluster

Le credenziali verranno salvate nello storage account utilizzato da Azure Cloud Shell.

Figura 6: Download delle credenziali per accedere al cluster ACS

Per verificare la connettività all’ACS Kubernetes Cluster vi basterà eseguire il comando:

kubectl get nodes

e verificare che tutti gli agent nodes siano Ready, come mostrato in figura:

Figura 7: Verifica della creazione e dello stato dei nodi del cluster

Distribuzione di un’applicazione nel cluster ACS Kubernetes

Per testare il nostro cluster distribuiremo un container con nginx, prendendolo dal Docker Hub. Lanciamo il comando

kubectl run nginx-lab --image=nginx --replicas=1 --port=80

e verifichiamo che il pod Kubernetes sia stato creato utilizzando il comando

kubectl get pods

Per identificare lo stato del deployment utilizziamo invece il comando

kubectl get deployment

Figura 8: Verifica dello stato del deployment

Per rendere il pod disponibile dall’esterno dovremo però prima esporlo con il comando

kubectl expose deployment nginx-lab --port=80 --type=LoadBalancer

Dopo qualche minuto, il servizio verrà esposto e potremo connetterci. Per individuare l’indirizzo IP pubblico utilizzato possiamo lanciare il comando

kubectl get services

Se la colonna relativa all’EXTERNAL-IP vi indica Pending, aspettate qualche minuto (nel mio caso ci sono voluti circa 5 minuti) e ripetete il comando.

Figura 9: Indirizzo IP pubblico del cluster

Collegatevi all’indirizzo IP ottenuto ed il vostro container NGINX vi farà apparire la pagina di benvenuto.

Figura 10: Pagina di benvenuto del container

Gestione di un’applicazione nel cluster ACS Kubernetes

Dopo aver creato la prima istanza del nostro deployment, possiamo scalarla facilmente utilizzando il comando

kubectl scale --replicas=2 deployment/nginx-lab

ed esattamente come prima, per verificare la buona riuscita, lanciamo il comando

kubectl get pods

Figura 11: Creazione dello scaling completato

Come potete vedere adesso ci sono due istanze che fanno girare il container nginx.

Con la stessa rapidità con cui è stato scalato è anche possibile cancellare il deployment con il comando

kubectl delete deployment nginx-lab

e verificare con il comando

kubectl get deployment

Figura 12: Cancellazione del Deployment

Conclusioni

I Docker Container di fatto ottimizzano il deployment delle nostre applicazioni e le rendono trasportabili. È necessario però fare in modo che gli Host che ospitano i container siano affidabili e scalabili. Una soluzione di orchestation è quindi necessaria per il corretto funzionamento ma soprattutto per la facilità e rapidità di utilizzo. Kubernetes insieme a Azure Container Service è senza dubbio una soluzione semplice da implementare ed altamente scalabile.

Microsoft ha anche annunciato da un paio di giorni la preview di AKS (Azure Container Service). Per maggiori info visualizzate l’articolo Introducing AKS (managed Kubernetes) and Azure Container Registry improvements

Eseguire i Linux Containers in Windows Server 1709

Facebooktwittergoogle_plusredditlinkedin

Con il rilascio dell’ultima versione del sistema operativo server, chiamata Windows Server 1709 e delle cui novità ne ho parlato nella’articolo https://www.ictpower.it/sistemi-operativi/windows-server-2016-1709-quali-saranno-le-novita.htm, Microsoft e Docker ci offrono la possibilità di far girare i container Linux in un Windows Container Host.

Tra i prerequisiti richiesti per far girare i container Linux ci sono l’installazione di Docker Enterprise Edition e di LinuxKit.

In questa guida vi mostrerò come far girare i Linux Containers all’interno di una macchina virtuale. Per poterlo fare sarà necessario abilitare la Nested virtualization nella VM, in quanto i container Linux possono essere solo Hyper-V Containers. Per avere maggiori informazioni sulla Nested Virtualization vi rimando all’articolo https://www.ictpower.it/guide/abilitare-la-nested-virtualization-con-le-nuove-azure-vm-dv3-ed-ev3.htm

Dopo aver creato la macchina virtuale, che ho chiamato 1709 – Linux Containers, sarà necessario configurarla con la memoria RAM statica ed abilitare la nested virtualization con il comando PowerShell (eseguito con privilegi elevati)

Set-VMProcessor -VMName “1709 – Linux Containers” -ExposeVirtualizationExtensions $true

Configurate la scheda di rete della VM in modo tale che sia abilitato il Mac Address spoofing con il comando PowerShell

Get-VMNetworkAdapter -VMName “1709 – Linux Containers” Set-VMNetworkAdapter -MacAddressSpoofing On

Procedete quindi all’installazione di Windows Server 1709 e terminata l’installazione, utilizzando il tool sconfig, affettuate tutti gli aggiornamenti, come mostrato in figura:

Figura 1: Installazione di Windows Server versione 1709 completata

Figura 2: Installazione degli aggiornamenti

Al termine degli aggiornamenti la versione di Windows sarà la 10.0.16299.19

Installazione di Docker Enterprise Edition

Per installare Docker Enterprise Edition è necessario lanciare un prompt PowerShell con privilegi elevati ed eseguire i comandi:

Install-Module DockerProvider -Force

Install-Package Docker -ProviderName DockerProvider -Force

Figura 3: Installazione di Docker Enterprise for Windows completata

Terminata l’installazione procedete ad un riavvio della macchina virtuale.

Dopo il riavvio potete verificare che il servizio Docker stia girando usando il comando PowerShell Get-Service docker e potete verificare la versione utilizzando il comando Docker version, come mostrato in figura:

Figura 4: Verifica della versione di Docker e dello stato del servizio

Adesso che i prerequisiti sono stati installati possiamo procedere all’installazione di Docker for Linux e del LinuxKit.

Installazione di Docker for Linux e del LinuxKit

Utilizzando un prompt PowerShell eseguito con privilegi elevati installiamo LinuxKit con i seguenti comandi:

$progressPreference ‘silentlyContinue’

mkdir $Env:ProgramFiles\Linux Containers”

Invoke-WebRequest -UseBasicParsing -OutFile linuxkit.zip https://github.com/friism/linuxkit/releases/download/preview-1/linuxkit.zip

Expand-Archive linuxkit.zip -DestinationPath $Env:ProgramFiles\Linux Containers\.”

rm linuxkit.zip

Figura 5: Installazione del LinuxKit

A questo punto scaricate la build di Docker deamon che contiene una versione di Preview che supporta i Linux Container in Windows utilizzando la cmdlet di PowerShell

Invoke-WebRequest -UseBasicParsing -OutFile dockerd.exe https://master.dockerproject.org/windows/x86_64/dockerd.exe

Successivamente avviate un demone Docker che sia in ascolto su una pipe separata utilizzando il comando PowerShell

$Env:LCOW_SUPPORTED=1

$env:LCOW_API_PLATFORM_IF_OMITTED=“linux”

.\dockerd.exe -D –experimental -H “npipe:////./pipe//docker_lcow” –data-root c:\lcow

Figura 6: Avvio del demone Docker per l’esecuzione dei container Linux

Lasciate la finestra che ha avviato il demone in esecuzione (NON CHIUDETELA) e provate ad eseguire un Linux Container aprendo un’altra finestra con il Command Prompt e eseguendo il comando:

docker -H “npipe:////./pipe//docker_lcow” run -ti busybox sh

Figura 7: esecuzione del comando per il lancio del Linux Container

Se l’immagine non è presente nel vostro host Windows verrà scaricata, estratta ed eseguita. È possibile scaricare l’immagine anche utilizzando il comando docker -H “npipe:////./pipe//docker_lcow” pull busybox

Conclusioni

Attualmente l’esecuzione di Linux Container in un Windows Server host richiede un po’ di lavoro per la configurazione e non è supportata in produzione. Sicuramente è un ulteriore passo in avanti per poter permettere agli sviluppatori di poter creare e testare applicazioni Windows/Linux facendo girare container per entrambe le piattaforme side-by-side sullo stesso sistema operativo.

Utilizzare Docker Machine per creare hosts in Microsoft Azure

Facebooktwittergoogle_plusredditlinkedin

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.