Deploy applicazione docker personale su AZURE
In questo breve articolo vediamo come effettuare il deploy di applicazioni in docker direttamente su Microsoft Azure. Prendiamo come ipotesi quella di avere già un’applicazione “dockerizzata”, che sappiamo già funzionare in locale e che vogliamo mettere in deploy.
Dobbiamo quindi avere:
- Applicazione che vogliamo eseguire
- Configurazione Docker per l’applicazione che vogliamo eseguire (Dockerfile nella root dell’app)
- Account sul portale Azure
Vedremo ora come caricare un contenitore docker, in un servizio app, partendo da un’immagine docker caricata su un registro privato di Azure. Ciò ci permette di utilizzare una qualsiasi immagine di cui abbiamo fatto la build locale. Nel nostro esempio utilizzeremo un’applicazione nest.js di cui vedremo velocemente il Dockerfile.
Sebbene il Dockerfile che vedremo sia pensato per questa particolare applicazione, la procedura di caricamento su Azure resta invariata per qualsiasi applicazione contenente un Dockerfile correttamente specificato.
Il Dockerfile
Questo file non è altro che una serie di istruzioni da dare a docker, comprende la versione base del sistema da utilizzare ed eventuali comandi da lanciare all’applicazione da dockerizzare.
Nel caso della nostra app in nest.js il file sarà qualcosa di questo tipo
FROM node:10 AS builder
WORKDIR /app
COPY ./package.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:10-alpine
WORKDIR /app
COPY --from=builder /app ./
CMD ["npm", "run", "start:prod"]
All’interno di questo file andiamo a chiedere a docker di:
- Fare l’installazione di tutte le dipendenze e la build nella directory /app utilizzando la versione 10 dell’immagine di node, copiando il file package.json e l’intero sorgente dell’app (./)
- Eseguire l’applicazione con node10-alphine che si trova nella directory /app (creata nel punto 1) tramite il comando npm run start:prod
E’ importante ricordarsi come l’istruzione CMD non sia altro che il comando che docker va a lanciare per far partire l’applicazione (nel nostro caso) o un qualsiasi altro script.
Una cosa che potrebbe saltare all’occhio per chi conosce Docker, potrebbe essere il fatto che nel Dockerfile non è dichiarata la porta d’esecuzione della nostra applicazione, questo perchè il servizio di Azure (così come la maggior parte dei servizi cloud) si occuperà di fare il provisioning automatico della porta.
Prima di iniziare il processo di creazione del registro delle immagini e la creazione del nostro processo app, se non lo abbiamo ancora fatto è il caso di testare il dockerfile andando a fare una build della nostra app dockerizzata. Per fare ciò nella root directory della nostra app (dove deve trovarsi il Dockerfile) ci basterà eseguire il seguente comando
docker build -t <username>/<nomeapp> .
dove <username> è il nostro username e <nomeapp> il nome che vogliamo dare alla nostra immagine docker, ovviamente possono essere nomi inventati e non vi sono vincoli particolari se non sui caratteri speciali che si possono inserire.
Una volta che la build ha avuto successo possiamo volendo lanciare l’immagine nella nostra istanza locale di docker, cosa che non vediamo nello specifico in questo articolo, ma che volendo possiamo fare con un comando simile a
docker run -p 49160:8080 -d <username>/<nomeapp>
Registro contenitori di Azure
Una volta che siamo certi che la nostra immagine funzioni possiamo procedere a caricarla nel registro contenitori di Azure, questo registro ha la stessa funzione del Docker Hub e possiamo considerarlo come un repository privato delle nostre immagini docker.
Per prima cosa accediamo ad azure e cerchiamo il servizio indicato

Facciamo poi click su “crea nuovo”, procediamo alla creazione, selezioniamo un gruppo di risorse o ne creiamo uno nuovo se non lo abbiamo e diamo conferma. E’ fondamentale ricordarsi il nome registro in quanto ci servirà in seguito per effettuare il push della nostra immagine docker locale e per impostarlo come registro origine durante la creazione dell’app.

Una volta che abbiamo creato il nostro registro, se ci rechiamo nuovamente sulla funzione “Registro contenitori” potremo vederlo. Dovremo ora cliccarci sopra, recarci sulla voce “Chiavi di accesso” e abilitare l’account amministratore.

Una volta fatto ciò possiamo recarci nella directory locale della nostra app tramite prompt dei comandi o bash e procedere al collegamento con azure e con il push dell’immagine. Diamo per scontato che sia installato sul sistema la cli di Azure, che ci permette di operare su Azure tramite riga di comando.
Il primo passo consiste nell’autenticarci se ancora non lo abbiamo fatto, eseguiamo quindi
az login
Questo comando ci aprirà una schermata web in cui fare l’accesso, dopo di che saremo autenticati con il nostro account Azure e potremo procedere con la connessione al registro appena creato utilizzando il comando
az acr login --name <nomeregisrtro>
che nel nostro particolare caso sarà
az acr login --name mioimgtest
Una volta fatto ciò dobbiamo assegnare un tag alla nostra immagine, possiamo farlo con il comando
docker tag <username>/<nomeapp> <nomeregisrtro>.azurecr.io/<nomeapp>
Dovremo ovviamente sempre sostituire <username> e <nomeapp> con i nostri dati. Dopo di che potremo procedere al push dell’immagine con il comando
docker push <nomeregisrtro>.azurecr.io/<nomeapp>
Una volta terminato il push siamo pronti per il deploy della nostra app.
Creazione dell’applicazione
Cerchiamo ora nel pannello Azure la voce “Servizi app” e facciamo poi click su “crea”. Assicuriamoci di aver dato un nome valido alla nostra app (sarà endpoint) e assicuriamoci di aver selezionato “Docker”. Potremo quindi fare click su “Avanti: Docker”

Una volta fatto ciò ci basterò specificare l’immagine dal registro immagini creato precedentemente e procedere alla creazione dell’app.

Una volta creata, l’applicazione chiamata test-live-app sarà disponibile nel pannello “Servizi App”, dove potremo gestirla, modificare le sue risorse o cancellarla.
