Containers amb Windows Server 2016

5 abril 2016
Josep Ma Solanes 0

Entrada de gestió de Containers amb Microsoft Windows Server 2016 versió final.

Aquesta entrada sobre containers està basada en la versió preliminar de Windows Server 2016 Technical Preview 4 i pot estar subjecte a canvis.

ACTUALITZACIÓ JUNY 2016: Modificació de les comandes per operar amb la versió preliminar de Windows Server 2016 Technical Preview 5, continua poden estar subjecte a canvis.

 

 

Amb aquest article m’estreno al YouTube!. Us deixo el vidro explicatiu que parla sobre els containers.
Si us agrada no us oblideu de donar-li al like.

Introducció als Containers

El concepte de container, aplicat a la informàtica, consisteix en agrupar i aïllar entre sí aplicacions o grups d’aplicacions que s’executen sobre un mateix nucli de sistema operatiu.

Per entendre-ho millor, podríem arribar a fer el símil amb la virtualització de màquines. En ella, es comparteix un mateix maquinari entre diversos sistemes operatius. En el cas dels containers, anem a un pas més en aquest món. Imagineu que heu de desplegar una aplicació web com pot ser el WordPress. A priori es requereix d’un servidor Web i d’un servidor de base de dades. Depenent del grau de càrrega i alta disponibilitat podria ser que es necessitessin dos servidors web com a frontals configurats d’una forma concreta. L’opció actual que aplicaríem en aquest cas, seria desplegar tres màquines virtuals: dos servidors web i un servidor de base de dades, configurant-los segons les necessitats. Sí, ja sé que depenent de la càrrega es pot fer tot en una, però fem-ho bé i separem les màquines. Això vol dir: servidor físic, plataforma de virtualització, tres màquines virtuals amb els seus tres sistemes operatius i, finalment, la part d’aplicació que correspongui a cadascuna de les màquines virtuals.

Passant aquest exemple a un entorn de containers podria quedar de la següent manera: el servidor físic, la plataforma de virtualització, una màquina virtual amb el seu sistema operatiu habilitat per allotjar containers i els containers corresponents: dos de servidor web i un de base de dades.

Avantatge a priori, la quantitat de recursos necessaris per mantenir engegada l’aplicació:

  • En el primer cas, requeria de tres màquines virtuals amb el seu sistema operatiu, es manté triplicada la part comuna del sistema operatiu.
  • En el segon cas, només requereix d’una màquina virtual amb el seu sistema operatiu, només varia la part de les aplicacions.

containers-014

Per tant, menys superfície d’atac, menys configuracions i més movible. Només canviant el container d’equip t’emportes tota l’aplicació i a funcionar, sense necessitat de reinstal·lacions.

En definitiva, en l’entorn de containers, en comptes de compartir només el maquinari, havent d’instal·lar el mateix sistema operatiu en diverses màquines per diferents aplicacions, el que es fa és instal·lar el mateix sistema operatiu i a damunt d’ell les diferents aplicacions en forma de caixes, aïllades entre sí, com si fossin màquines virtuals.

El container es pot fer córrer en entorns Linux i Windows Server 2016 o Windows 10.

Sí, ho entenc, és un concepte nou i pot ser una mica espès, però la idea agrada i s’ha de veure com una eina més que se’ns posa a la nostra disposició. Què pot ser un embolic? No, simplement aplicar-la on correspongui:

  • Per coses de més rendiment i més eficients: Containers
  • Per coses més segures i aïllades: Màquines Virtuals

containers-015

Si voleu saber més d’aquesta tecnologia podeu consultar el projecte de codi obert Docker que manté l’empresa amb el mateix nom, Docker, i que és el motor que integra Microsoft per donar servei de containers als nous sistemes operatius.

En Windows, els containers, poden ser de dos tipus diferents segons el grau d’aïllament entre ells:

  • Windows Server Container. Les instàncies dels containers s’executen a la vegada sobre el mateix amfitrió, compartint el mateix nucli comú.
  • Hyper-V Container. Les instàncies dels containers s’executen a la vegada en el mateix amfitrió, però no comparteixen el mateix nucli sinó que s’aïlla entre cadascú utilitzant la tecnologia de virtualització Hyper-V.

A nivell funcional, els Windows Server Containers i els Hyper-V Containers, es creen, gestionen i funcionen de forma idèntica.

Comencem a tenir contacte amb aquesta tecnologia, pas a pas, des de la plataforma de Microsoft i, el primer que faré consisteix en desplegar la plataforma per donar servei de containers.

 

Instal·lació de Windows Server Container

Per utilitzar containers en Windows el que necessitem, a data d’avui, és un servidor Microsoft Windows Server 2016 o superior; o bé una versió de Windows 10 build 1607 (Anniversary Update) o superior, instal·lat i actualitzat a la data, com no.

Des de l’Administrador del servidor, en el menú superior de la dreta, clicar a Administrar i, a continuació, Afegir rols i característiques.

containers-001

S’inicia l’assistent per afegir els rols i característiques. Es pot marcar el piscu per no tornar a ensenyar la pantalla d’introducció. Clicar el botó Següent.

containers-002

Marcar instal·lació basada en instal·lar rol o característica i clicar el botó Següent.

containers-003

Seleccionar el servidor on habilitar el rol o característica i clicar el botó Següent.

containers-004

De la llista de rols, a no ser que haguem d’utilitzar Containers Hyper-V, no cal marcar cap opció. Clicar el botó Següent.

containers-005

Com a característica, marcar el piscu a Containers i clicar el botó Següent.

containers-006

Resum de la instal·lació. Si tot és correcte, es pot marcar el piscu de reiniciar l’equip quan calgui i clicar el botó Instal·lar.

containers-007

Finalitzada la instal·lació, si no s’ha marcat el piscu de reiniciar automàticament, clicar el botó Tancar i reiniciar el servidor.

containers-008

Amb la màquina reiniciada no espereu trobar grans canvis. Toca utilitzar la PowerShell. Iniciar-la des del menú Inici, escrivint PowerShell, per exemple.

containers-009

El següent pas que hem de fer és instal·lar el motor i client Docker. S’ha fet un esforç perquè sigui transparent per a totes les plataformes i es puguin utilitzar les mateixes comandes, d’aquesta forma no he d’aprendre comandes noves quan salto de Windows a Linux o al inrevés.

Important saber que al fer la instal·lació estàndard es crea una xarxa via NAT on s’executen els Containers. Per tant, no existirà accés directe al container des de l’exterior de l’amfitrió. Ho hem de tenir en compte per publicar els ports cap al container o canviar aquesta xarxa a un altre tipus, tot dependrà del serveis que oferim. De moment, aquest article el continuo amb la xarxa de NAT.

 

Instal·lació de Docker

Des de la PowerShell es pot fer la descàrrega dels fitxers necessaris perquè això funcioni. La versió de descàrrega de docker encara està en release preview, però ja és la què funciona. Personalment no m’agrada massa que s’hagi de descarregar a banda i t’hagis de preocupar de la versió, però de moment és el que hi ha:

Invoke-WebRequest "https://download.docker.com/components/engine/windows-server/cs-1.12/docker.zip" -OutFile "$env:TEMP\docker.zip" -UseBasicParsing

Descomprimir el fitxer a la carpeta c:\Program Files\Docker:

expand-archive -path "$env:TEMP\docker.zip" -DestinationPath $env:ProgramFiles

Afegir el directori de Docker al path del sistema de forma persistent:

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Docker", [EnvironmentVariableTarget]::Machine)

Si només el volem afegir momentàniament, això vol dir que quan es reinicia la màquina es perd:

$env:path += ";c:\program files\docker"

Afegir el servei de Docker al sistema:

dockerd.exe --register-service

Iniciar el servei de Docker:

start-service Docker

Ja es pot comprovar que Docker està operatiu i funciona correctament al nostre sistema amb la comanda:

docker version

On us donarà una informació semblant a aquesta:

PS C:\> docker version
Client:
 Version:      1.12.2-cs2-ws-beta-rc1
 API version:  1.25
 Go version:   go1.7.1
 Git commit:   62d9ff9
 Built:        Fri Sep 23 20:50:29 2016
 OS/Arch:      windows/amd64

Server:
 Version:      1.12.2-cs2-ws-beta-rc1
 API version:  1.25
 Go version:   go1.7.1
 Git commit:   62d9ff9
 Built:        Fri Sep 23 20:50:29 2016
 OS/Arch:      windows/amd64

 

Carregar les imatges de sistema operatiu per a containers

Per crear containers des de 0 ho hem de fer amb imatges del sistema operatiu mig preparades pel seu desplegament com a containers. Aquestes imatges les podem generar nosaltres des de 0 amb la ISO de instal·lació del sistema operatiu o bé descarregar-les d’Internet.

Optarem per aquesta segona opció, la descàrrega des del Hub Docker. On podeu trobar imatges preparades de tot tipus. En el cas de Windows Server tenim:

  • Microsoft Windows Server 2016 edició core. Amb la comanda:
    docker pull microsoft/windowsservercore
  • Microsoft Windows Server 2016 edició nano. Amb la comanda:
    docker pull microsoft/nanoserver

Finalitzada la descàrrega i instal·lació al repositori d’imatges, comprovar s’ha carregat correctament:

docker images

Amb aquesta versió és possible fer còrrer containers amb Windows Server Core i Windows NanoServer. Comento això perquè en les versions prèvies no es permetia.

 

Administrant imatges de containers

Tenim imatges, i si volem esborrar una d’aquestes imatges? Sempre hem de tenir en comte que no es pot esborrar una imatge que tingui containers associats. Si això és compleix, per esborrar un container només cal executar la comanda:

docker rmi (seguida del nom del container)

Posem un exemple. Per esborrar la imatge de container microsoft/nanoserver executem:

docker rmi microsoft/nanoserver

Es pot importar/exportar una imatge de container al sistema de fitxers local? Doncs la veritat és que sí, com? mitjançant la importació i exportació de imatges indicat en els punts:

 

Administrant containers

Comprovar que encara no tenim cap container creat:

docker ps -a

En cas de tenir-ne, es poden veure els containers que s’estan executant amb la comanda:

docker ps

Tinc containers! No els vull, com els esborro? Tranquils, el container té un identificador, el container ID. Preneu nota i executeu la comanda per esborrar-lo:

docker rm container_ID

 

Crear un container per Internet Information Server (IIS)

No seria massa bonic deixar l’entrada aquí, amb la mel als llavis, on gairebé no s’ha vist res d’espectacular. Per fer un cosa senzilla, despleguem un servidor web basat en Internet Information Server sobre Windows Server 2016 core.

Per crear el nou container pel servidor Web, que es dirà ServidorWeb i utilitzarà la imatge del sistema operatiu que s’ha descarregat anteriorment, WindowsServerCore.

Per no complicar més la cosa de moment, s’utilitza la connexió de xarxa estàndard del sistema de containers, és a dir, hi haurà una connexió NAT entre la xarxa de containers (172.20.0.0/16) i l’equip local. Si es vol publicar cap a l’exterior de l’equip local s’utilitzarà la publicació de ports en el mateix.

Atenció a la comanda!

Al repositori de imatges tinc una imatge de Windows Server Core (microsoft/windowsservercore). El que faig és crear un container amb el què pugui interactuar per configurar l’entorn web i el què necessiti. Per això, executo la comanda amb els paràmetres:

  • -it  Consola interactiva, em permetrà interactuar amb el container, depèn de la comanda que li enviï.
  • -p 80:80 Es fa un NAT del port 80 de la màquina amfitrió, amb el port 80 del container. D’aquesta forma es podrà accedir al servei web al fer una petició a l’adreça IP de l’amfitrió.
  • Finalitzo amb la comanda powershell, que és l’aplicació que vull que m’executi.
docker run -it -p 80:80 microsoft/windowsservercore powershell

Per crear la imatge està bé, però després per a producció, millor afegir el paràmetre -d perquè executi el container en segon pla i no obri consoles innecessàries.

Un cop engegat el container, tinc una consola de powershell. Si faig un hostname (ID del container) o ipconfig (xarxa 172.20.x.x) observo que no és la màquina amfitriona sinó una altra. Estic dins el container.

Per configurar el rol de servidor Web amb Internet Information Server només cal instal·lar-lo:

Install-WindowsFeature web-server

Per comprovar que el servei web acabat d’instal·lar funciona correctament, hem d’accedir per un navegador.

  • Des de l’amfitrió, hem de fer una petició a l’adreça IP del container. Per això hem de saber l’adreça IP que té el container. Es pot fer mitjançant un ipconfig o un Get-NetIPAddress -AddressFamily IPv4. Penseu que ha de ser una adreça de la xarxa 172.20.x.x

containers-012

Però la idea es que s’hi pugui arribar des de qualsevol equip de la xarxa. Com que el switch virtual està basat en NAT, s’ha de configurar el salt del port, en aquest cas el port 80 TCP. És el que hem fet amb el paràmetre -p 80:80.

Recordo que el NAT es fa sobre la IP que té l’amfitrió i, per tant, no es poden duplicar els ports en la mateixa IP. No es poden tenir dos containers donant servei al port 80 amb NAT sobre la IP de l’amfitrió.

Abans d’executar el container amb el NAT, comprovar que no n’hi hagi un de creat que pugui entrar en conflicte. Tornant a la PowerShell de l’amfitrió de containers (es pot obrir una nova consola de PowerShell si no es vol abandonar el container), comprovar la columna PORTS:

docker ps

També s’ha de permetre l’accés mitjançant el tallafocs, comprovar que hi hagi una regla que permeti aquest accés pel port TCP 80:

Get-NetFirewallRule | Where {$_.Direction -eq "Inbound" -and $_.Enabled -eq "True"} | Get-NetFirewallPortFilter | Where {$_.LocalPort -eq 80}

Si no existeix, crear-ne una de nova:

New-NetFirewallRule -Name "ServidorWeb" -DisplayName "ServidorWeb" -Protocol tcp -LocalPort 80 -Action Allow -Enabled True

Ara sí s’ha de poder accedir al servei web proporcionat pel container des d’un equip de la xarxa. En un navegador introduir la IP de l’amfitrió de containers (en l’exemple 192.168.1.160) i… ja tenim el servidor operatiu a la xarxa:

containers-011

Es pot jugar a crear noves pàgines Web i anar accedint-hi.

echo "Hola món des d'un container de Windows" > c:\inetpub\wwwroot\cat.html

containers-013cat

 

Apagar el Container

Hem vist com crear i executar un container de forma interactiva, deixant oberta una consola de PowerShell. Des d’aquesta PowerShell n’hi ha prou en escriure la següent comanda per tancar:

exit

En cas de tancar la finestra de PowerShell amb el ratolí, el container continuarà executant-se. Es pot comprovar obrint una altre consola de PowerShell i executar la comanda:

docker ps

Es visualitza el container en execució. Per aturar-lo, introduir la comanda següent indicant el número de Container ID:

docker stop CONTAINER_ID

 

Engegar el Container

Aquesta és fàcil, sabent el Container ID:

docker ps -a

Només cal engegar indicant el Container ID:

docker start Container_ID

 

Reiniciar l’amfitrió

Una altra pregunta que pot sortir és si quan es reinicia l’amfitrió es perden els containers. La resposta és no. Els containers continuen creats, però APAGATS. Cal engegar-los si es vol donar servei amb les comandes anteriors.

docker start container_ID

 

Distribuir un Container

Tinc un Container creat i operatiu, amb el rol de IIS i la meva aplicació cloud instal·lada i operativa. Com faig per crear més containers que ofereixin el mateix servei sense haver de configurar un a un? Vaja, que faig un escalat de l’aplicació en els front-ends.

Amb el container apagat es crea una nova imatge d’ell. A partir de la imatge es poden anar creant més containers sobre el mateix amfitrió. Prendre nota del container que es vol convertir amb imatge:

docker ps -a

Per crear la imatge s’indica el Container ID i el nom de la imatge. Si el nom de la imatge no conté res al final s’assigna com la última imatge (latest) en el repositori:

docker commit Container_ID jmsolanes/servidorweb

En canvi, si s’especifica la versió, es guarda amb el número de versió indicat, utilitzar segons els vostres requeriments:

docker commit Container_ID jmsolanes/servidorweb:version1

Comprovar que la imatge s’ha afegit al repositori, a banda de les imatges anteriors del sistema operatiu ha d’aparèixer la imatge que acabem de crear:

docker images

 

Exportar una imatge de container per poder copiar en altres equips

Amb la següent comanda indicant la ruta on guardar el fitxer amb la imatge (c:\containersimages\servidor.tar). Procureu acabar amb la extensió .TAR i indicant el nom de la imatge de containers (jmsolanes/servidorweb):

docker save -o c:\containersimages\servidor.tar jmsolanes/servidorweb

 

Importar una imatge de container des de local

Es pot carregar la imatge a partir del fitxer anterior, sense haver d’accedir a Internet? Naturalment. Només necesito el fitxer .TAR anterior.

docker load -i c:\containersimages\servidor.tar

 

Nous containers a partir de imatges

Crear un nou container a partir de la imatge per escalar uns front-ends, per exemple, ja és molt fàcil. Només cal indicar el nom de la imatge i, si correspon, la configuració dels ports pel NAT. En un entorn en producció aquests containers aniran darrera un balancejador que s’encarregarà de comunicar-se amb ells, però això ja ho veurem en un altre article:

docker run -it -d -p 80:80 jmsolanes/servidorweb powershell

O dos containers (fixeu-vos que utilitzo un altre port (81) a l’amfitrió que passa el port 80 del container):

docker run -it -d -p 81:80 jmsolanes/servidorweb powershell

O tres containers (fixeu-vos que utilitzo un altre port (82) a l’amfitrió que passa el port 80 del container):

docker run -it -d -p 82:80 jmsolanes/servidorweb powershell

No oblidar el tallafocs de l’amfitrió, que tingui l’accés als ports indicats permès:

New-NetFirewallRule -Name "ServidorWeb1" –DisplayName "ServidorWeb-TCP81" -Protocol tcp -LocalPort 81 -Action Allow -Enabled True
New-NetFirewallRule -Name "ServidorWeb2" –DisplayName "ServidorWeb-TCP82" -Protocol tcp -LocalPort 82 -Action Allow -Enabled True

 

Esborrar els containers

Per esborrar un container, llistem els containers que tenim

docker ps -a

i l’esborrem indicant el Container ID amb la comanda:

docker rm Container_ID

 

T’ha agradat l’article? El pots compartir a les xarxes socials. També pots deixar la teva opinió, comentari o suggeriment. Gràcies!

Similar Posts by The Author: