Come Creare un’Immagine Docker Windows Con il Tag Docker Build

Sei nuovo alle immagini di Docker per Windows? Stai attualmente lavorando in un ambiente Windows e sei curioso di apprendere le build di Docker per le immagini dei container? Sei nel posto giusto. Il modo migliore per imparare qualcosa di nuovo è metterci mano utilizzando i comandi docker build e docker build "tag"!

In questo articolo imparerai come creare la tua prima immagine Docker per Windows da un Dockerfile utilizzando il comando docker build.

Cominciamo!

Comprensione delle immagini di container Docker

Per anni, l’unico modo per testare o sviluppare su più sistemi operativi (OS) era avere diverse macchine fisiche o virtuali dedicate con l’immagine della versione OS desiderata. Questa metodologia richiedeva più hardware e overhead per creare nuove macchine per ciascun software e specifica OS.

Tuttavia, oggi l’uso delle immagini di container Docker è cresciuto in parte grazie alla popolarità dell’architettura a microservizi. In risposta all’aumento della popolarità di Docker, Microsoft ha iniziato a supportare pubblicamente le immagini Docker per diversi prodotti di punta sulla loro pagina di Docker Hub. Hanno persino aggiunto il supporto nativo per le immagini per Windows come funzionalità del prodotto in Windows 10 e Windows Server 2016!

A Docker image is run on a container by using the Docker Engine. Docker images have many benefits such as portability (applicable to multiple environments and platforms), customizable, and highly scalable.  As you can see below, unlike traditional virtual machines, the Docker engine runs on a layer between the host OS kernel and the isolated application services that are being containerized.

Source: Docker

Comprensione delle Build e delle Immagini Docker

Il comando docker build può essere sfruttato per automatizzare la creazione di immagini container, adottare una pratica DevOps container-as-code e integrare la containerizzazione nel ciclo di sviluppo dei tuoi progetti. I Dockerfile sono semplicemente file di testo che contengono istruzioni di build utilizzate da Docker per creare una nuova immagine container basata su un’immagine esistente.

L’utente può specificare l’immagine di base e l’elenco dei comandi da eseguire quando un’immagine container viene distribuita o avviata per la prima volta. In questo articolo, imparerai come creare un’immagine docker basata su Windows da un Dockerfile utilizzando un container Windows.

Questo processo ha diversi vantaggi rispetto all’utilizzo di un’immagine container pre-costruita:

  1. È possibile ricostruire un’immagine container per diverse versioni di Windows, il che è ottimo per testare le modifiche del codice su diverse piattaforme.
  2. Avrai maggiore controllo su ciò che viene installato nel container. Ciò ti permetterà di mantenere le dimensioni del container al minimo.
  3. Per motivi di sicurezza, potresti voler controllare il container per individuare vulnerabilità e applicare procedure di sicurezza alla base dell’immagine

Prerequisiti/Requisiti

Questo articolo è una guida passo-passo per imparare come creare un’immagine Docker utilizzando un Dockerfile. Se desideri seguirla, assicurati di avere i seguenti prerequisiti in atto.

Nota: Assicurati di abilitare la configurazione dei contenitori Windows durante l’installazione di Docker.

Preparazione

Prima di tutto, è necessaria una cartella per memorizzare tutte le immagini e i contenitori Docker che verranno creati da tali immagini. Per farlo, apri un terminale PowerShell o cmd (utilizzerai PowerShell per tutto questo articolo) e crea una nuova directory chiamata C:\Containers.

Una volta creata la cartella, passa a quella directory. Questo imposta la directory di lavoro corrente della console su C:\Containers per impostare automaticamente tutti i download su questa directory.

PS51> mkdir C:\Containers
PS51> cd C:\Containers

In questo articolo, otterrai un vantaggio iniziale. La maggior parte dei file per lavorare su questo progetto è già disponibile. Una volta creata la cartella, esegui un Git pull per copiare i file necessari per questo articolo dal repository Github di TechSnips alla cartella C:\Containers. Una volta completato, controlla che la cartella C:\Containers sia simile a quanto segue.

Tutorial files

Scaricando l’immagine Docker di Windows IIS

Il primo compito da eseguire è scaricare una “template” o immagine di base. Costruirai la tua immagine Docker in seguito, ma prima hai bisogno di un’immagine per iniziare. Scaricherai le ultime immagini IIS e Windows Server Core necessarie per questo tutorial. L’elenco aggiornato delle immagini può essere trovato sulla pagina delle immagini Docker ufficiali di Microsoft.

Revisione delle immagini Docker di base attuali

Prima di scaricare l’immagine dal repository delle immagini, diamo prima un’occhiata alle immagini Docker di base attualmente presenti nel tuo sistema locale. Per farlo, esegui una console PowerShell come Amministratore e poi digita docker images. Questo comando restituisce tutte le immagini presenti nel tuo sistema locale.

Come puoi vedere di seguito, le immagini disponibili sono inizialmente vuote.

PS51> docker images
Docker Build Tag : Listing available Docker images

Scaricando l’immagine di base

Ora è il momento di scaricare l’immagine di base di IIS da Docker Hub. Per farlo, eseguire il comando docker pull come mostrato di seguito. Questo processo può richiedere del tempo a seconda della velocità della tua connessione internet.

PS51> docker pull mcr.microsoft.com/windows/servercore/iis
Downloading an image from the Docker Hub

Ora eseguire docker images e dovresti avere disponibile l’ultima immagine di Microsoft Windows Core IIS per questo tutorial.

PS51> docker images
Viewing available Docker images

Ispezionare il Dockerfile

In un passaggio precedente, hai scaricato un Dockerfile esistente per questo tutorial. Ora diamo un’occhiata a cosa comporta esattamente.

Apri il file C:\Containers\Container1\Dockerfile nel tuo editor preferito. Il contenuto di questo Dockerfile è utilizzato per definire come l’immagine del contenitore sarà configurata durante la fase di costruzione.

Puoi vedere una spiegazione di cosa fa ciascuna parte di questo file nei commenti in linea.

# Specifica che l'ultima immagine di microsoft/iis sarà utilizzata come immagine di base
# Usato per specificare quale immagine di base del contenitore verrà utilizzata dal processo di compilazione.

# Nota che la convenzione di denominazione è "**proprietario/nome dell'applicazione : nome del tag**"
# (mostrato come microsoft/iis:latest); quindi nel nostro caso il proprietario dell'immagine è
# Microsoft e l'applicazione è IIS con il tag "latest" che viene utilizzato
# per specificare che verrà estratta la versione più recente dell'immagine disponibile.
FROM microsoft/iis:latest

# Copia i contenuti della cartella wwwroot nella cartella inetpub/wwwroot nella nuova immagine del contenitore
# Usato per specificare che si desidera copiare la cartella WWWroot nel IIS inetpub WWWroot
# cartella nel contenitore. Non è necessario specificare il percorso completo dei tuoi file locali
# perché docker ha già la logica incorporata per fare riferimento a file e cartelle
# relative alla posizione del file docker sul tuo sistema. Fai anche notare che
# docker riconoscerà solo le barre oblique in avanti per i percorsi dei file - poiché si tratta di
# un contenitore basato su Windows anziché su Linux.
COPY wwwroot c:/inetpub/wwwroot

# Esegui alcuni comandi PowerShell all'interno del nuovo contenitore per configurare l'immagine

# Esegui i comandi PowerShell per rimuovere i file IIS predefiniti e creare un nuovo
# pool di applicazioni chiamato TestPool
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.htm -force
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.png -force
RUN powershell Import-Module WebAdministration
RUN powershell New-WebAppPool -Name 'TestPool'

# Espone la porta 80 nella nuova immagine del contenitore
# Usato per aprire la porta TCP 80 per consentire una connessione http al sito web.
# Tuttavia, questa linea è commentata perché il contenitore IIS ha questa porta
# già aperta per impostazione predefinita.
#EXPOSE 80

# Imposta il comando principale dell'immagine del contenitore
# Ciò dice all'immagine di eseguire un monitor del servizio per il servizio w3svc.
# Quando ciò è specificato, il contenitore si fermerà automaticamente
# se il servizio w3svc si ferma. Questa linea è commentata a causa del
# contenitore IIS ha già questo punto di ingresso in atto per impostazione predefinita.
#ENTRYPOINT ["C:\\ServiceMonitor.exe", "w3svc"]

Costruzione di una Nuova Immagine Docker

Hai il Dockerfile pronto e hai scaricato un’immagine di base di IIS. Ora è il momento di costruire la tua nuova immagine Docker utilizzando il Dockerfile.

Per costruire una nuova immagine, utilizza il comando docker build "tag". Questo comando crea l’immagine. Per questo articolo, puoi vedere di seguito che stai usando anche l’opzione -t ** che sostituisce la parte “tag”. Questa opzione ti consente di dare al tuo nuova immagine un nome di tag amichevole e anche di fare riferimento al Dockerfile specificando il percorso della cartella in cui risiede.

Di seguito puoi vedere un esempio di assicurarti che la console sia nella directory C:\Containers e quindi costruire una nuova immagine dal Dockerfile nella directory C:\Containers\Container1.

PS51> cd C:\Containers
PS51> docker build -t container1 .\Container1

Una volta avviato, puoi vedere il progresso del comando mentre attraversa ciascuna istruzione nel file docker riga per riga:

Building a progress of the command as it traverses each instruction in the docker filenew Docker image

Una volta fatto, dovresti avere una nuova immagine Docker!

Ora esegui il comando docker images per visualizzare le immagini disponibili. Puoi vedere di seguito un esempio dell’immagine container1 creata.

Viewing available Docker images

Nota: Il comando docker build —help è un parametro utile per visualizzare informazioni dettagliate sul comando docker in esecuzione.

Esecuzione del Container Docker

A questo punto, dovresti avere creata una nuova immagine. È ora di avviare un container utilizzando quell’immagine. Per avviare un nuovo container, utilizza il comando docker run.

Il comando docker run avvierà un nuovo container Docker basato sull’immagine container1 che hai creato in precedenza. Puoi vedere un esempio di questo qui sotto.

Nota che il parametro -d viene utilizzato. Questo indica al runtime di Docker di avviare l’immagine in modalità staccata e quindi di uscire quando il processo radice utilizzato per eseguire il container esce.

Quando docker run è completato, restituisce l’ID del container creato. Nell’esempio seguente viene acquisito questo ID in una variabile $containerID in modo da poterlo facilmente fare riferimento in seguito.

PS51> $containerID = docker run -d container1
PS51> $containerID
Running a Docker container

Una volta che il container è stato avviato, esegui il comando docker ps. Questo comando ti consente di vedere quali container sono attualmente in esecuzione utilizzando ciascuna immagine. Nota che di seguito l’immagine in esecuzione viene generata automaticamente un soprannome (busy_habit in questo caso). Questo soprannome viene talvolta utilizzato al posto dell’ID del container per gestire il container.

Listing running Docker containers

Esecuzione del codice all’interno di un container Docker

A new container is built from a new image you just created. Let’s now start actually using that container to run code. Running code inside of a Docker container is done using the docker exec command.

In questo esempio, esegui docker exec per visualizzare l’output di PowerShell per il comando Get-ChildItem nel container utilizzando la sintassi del comando qui sotto. Questo assicurerà che le istruzioni nel Dockerfile per rimuovere i file IIS predefiniti siano riuscite.

PS51> docker exec $containerID powershell Get-ChildItem c:\inetpub\wwwroot

Puoi vedere di seguito che l’unico file esistente è index.html il che significa che i file predefiniti sono stati rimossi.

Running PowerShell commands in a Docker container

Ora esegui il comando ipconfig nel container per ottenere l’indirizzo IP locale dell’immagine del container in modo da poter provare a connetterti al sito web IIS.

PS51> docker exec $containerID ipconfig

Puoi vedere di seguito che è stato eseguito ipconfig nel container proprio come se fosse stato eseguito sul tuo computer locale e ha restituito tutte le informazioni IP.

Running ipconfig in a Docker container

Ispezione del Sito Web di IIS

Ora è il momento di rivelare i frutti del tuo lavoro! È ora di vedere se il server IIS in esecuzione nel container Docker sta servendo correttamente la pagina index.html.

Apri un browser e incolla l’indirizzo IP4 trovato tramite ipconfig nella barra degli indirizzi. Se tutto va bene, dovresti vedere un messaggio Hello World!! come quello sotto.

IIS webpage running in a Docker container

Revisione della Storia di Docker

Un comando utile da utilizzare quando si lavora con i container Docker è il comando docker history. Anche se non necessariamente correlato alla creazione di un’immagine o di un container stesso, il comando docker history è un comando utile che consente di rivedere le modifiche apportate all’immagine del container.

PS51> docker history container1

Puoi vedere di seguito che docker history restituisce tutte le attività di Dockerfile e PowerShell eseguite sul container1 con cui hai lavorato.

Inspecting container changes with docker history

Pulizia delle Immagini Docker in Esecuzione

I passaggi seguenti vengono utilizzati per pulire tutti i container arrestati in esecuzione sul tuo computer. Questo libererà spazio su disco e risorse di sistema.

Esegui il comando docker ps per visualizzare un elenco dei container in esecuzione sul tuo sistema:

PS51> docker ps
Viewing available Docker containers

Ora arresta i container in esecuzione utilizzando il comando docker stop:

PS51> docker stop <image nick name: busy_haibt in my case>
PS51> docker stop <image nick name: unruffled_driscoll in my case>
Stopping Docker containers

Infine, puoi rimuovere definitivamente i container arrestati utilizzando il comando docker system prune.

PS51> docker system prune
Removing Docker images

Lettura Ulteriore

Source:
https://adamtheautomator.com/docker-build-tag/