Docker: a DevOps tool

docker
Docker: a DevOps tool

Cada pocs anys apareix una nova tecnologia que sacseja l’àmbit IT. El 2009, la realitat augmentada. El 2012, el Big Data. El 2015, el Internet of Things. Algunes són volàtils, d’altres queden establertes i es fan un lloc dins de les organitzacions TIC. Aquest és el cas de Docker, nascuda el Març del 2013.

Cada pocs anys apareix una nova tecnologia que sacseja l’àmbit IT. El 2009, la realitat augmentada. El 2012, el Big Data. El 2015, el Internet of Things. Algunes són volàtils, d’altres queden establertes i es fan un lloc dins de les organitzacions TIC. Aquest és el cas de Docker, nascuda el Març del 2013.

Introducció

La tecnologia que s’amaga al darrere d’aquesta simpàtica icona d’una balena, tracta sobre la contenidorització d’aplicacions per facilitar el seu desplegament. Més concretament, i tal com defineixen ells mateixos “Docker allows you to package an application with all of its dependencies into a standardized unit for software development”.

Sent pragmàtics, quan ens convé utilitzar Docker? Doncs imagina que vols desenvolupar una petita plataforma web, que necessita una base de dades, un entorn de servidor (Apache, NodeJs…) i un intèrpret de llenguatge com Python. Ho pots descarregar i configurar en el teu entorn local per començar a desenvolupar. Una vegada es vulgui pujar a producció en un (per exemple) Cloud Server a DigitalOcean, caldrà tornar a descarregar, instal·lar i configurar l’entorn de producció. En aquest punt, imagina que la plataforma té èxit, creix, i necessites crear un servidor de test. Cal tornar a gastar temps en descarregar, instal·lar i configurar l’entorn.

Docker permet crear aquest entorn d’una forma eficient, i replicar-lo d’una manera molt senzilla. En altres paraules, només inverteixes el temps en configurar-ho la primera vegada, i el cost en temps de replicar-lo és gairebé nul.

Conceptes

Hem dit que Docker utilitza contenidors de software. Un contenidor està format una capa base i un conjunt de capes imatge a sobre de la base. La capa base és un sistema de fitxers mínim (per exemple, Busybox o Ubuntu). Les capes imatge són aplicacions que se li afegeixen a la base per tal de crear la imatge del contenidor que necessitem.

 

Exemple de dos contenidorsFigura 1: Exemple de dos contenidors (font: www.docker.com)

A la Figura 1 es mostra un exemple de dues imatges de contenidors. En taronja una imatge de contenidor amb únicament un sistema de fitxers BusyBox. En blau una altra imatge de contenidor amb un sistema de fitxers Debian, i dues capes imatge: emacs i apache.

Tot i que aquesta estructura recorda a les Màquines Virtuals (VM), cal dir que són diferents. Una VM necessita un Sistema Operatiu (SO) amb kernel propi sobre un Hipervisor, com per exemple VMWare. Dins d’aquest SO propi, cada VM disposa únicament dels seus propis recursos, i les aplicacions dins de cada SO els utilitzen. En canvi, Docker elimina aquesta necessitat de kernel i recursos propis, compartint-los entre els contenidors. Un dels grans avantatges és la disminució del consum de recursos (tant d’emmagatzemament com d’execució) necessaris per córrer les aplicacions. A la Figura 2 es mostra un exemple amb dues aplicacions (A i B).

 

Container vs VMFigura 2: Diferència entre VM i Contenidor (font: www.serversideup.net)

Docker permet gestionar els contenidors d’una forma molt senzilla des de la línia de comandes. Crearem un contenidor a partir d’una imatge amb la comanda docker run, el pausarem amb docker pause, el pararem i engegarem amb docker stop o docker start i l’eliminarem amb docker rm. A la figura 3 es mostra amb més detall el cicle de vida dels contenidors.

 

cicle de vida contenidorFigura 3: Cicle de vida d’un contenidor

I d’on surten les imatges? Docker proporciona el Docker Hub, un repositori d’imatges on les organitzacions pengen les seves imatges oficials (com és el cas de mysql, ubuntu o nginx entre molts d’altres), i on també els usuaris poden penjar les seves imatges pròpies. Cada vegada que volem baixar una imatge del repositori amb la comanda docker pull, el servei Docker client (local) es connecta al Docker Hub i la descarrega al host local. La comanda docker run inclou un docker pull de les imatges que no disposi el servei Docker local.

 

arquitectura client-hubFigura 4: Arquitectura Docker Client-Hub (font: docs.docker.com)

Hands On!

Per entendre millor aquests conceptes, anem a practicar-los amb un parell d’exemples: El primer, muntarem un sistema de fitxers basat en Ubuntu. El segon, muntarem un WordPress en un moment.

Tutorial 0: Instal·lació de l’entorn

Si tens un sistema Linux, comença al pas 2.

Pas 1: Instal·lació Màquina Virtual Linux sobre Windows.

Ja que Docker només corre sobre Linux, cal emular l’entorn. Existeixen altres solucions per instal·lar Docker sobre Windows. Nosaltres ens decantem per crear una màquina virtual ja que el propòsit és provar la tecnologia.

  1. Instal·lar VMWare.
  2. Descarregar ISO Ubuntu 16.04 64-bits.
  3. Crear màquina virtual Ubuntu 16.04 x64 amb VMWare.

Pas 2: Instal·lació servei Docker sobre Linux.

  1. Obrir terminal i entrar com a sudo
    > sudo su
  2. Instal·lar Docker per aptitude.
    > apt-get install docker.io
  3. Comprovar que s’ha instal·lat correctament
    > docker run hello-world

Exemple 1: Sistema de fitxers Ubuntu

En aquest exemple muntarem un contenidor a través d’una imatge, que inclou una capa de sistema de fitxers (Ubuntu) i una capa imatge amb apache.

  1. Arrancar contenidor des d’imatge ubuntu.
    > docker run -it -d --name test_ubuntu ubuntu

    Els flags -it indiquen que voldrem interaccionar amb la shell d’aquest nou contenidor.
    El flag -d indica el detached mode, fent que no entrem al shell del contenidor en arrancar.
    El flag –name li dóna el nom test_ubuntu a aquest contenidor.
    L’última keyword ubuntu indica que voldrem un contenidor amb una imatge ubuntu.

     

  2. Entrar al shell del contenidor
    > docker exec -it test_ubuntu /bin/bash
  3. Sortir del shell del contenidor
    root@########:/ exit
  4. Comprovar que segueix actiu.
    > docker ps -a

    Veurem una fila per cada container que tenim corrent, i que a Status dirà UP x Seconds.

     

  5. Parar el contenidor
    > docker stop test_ubuntu
  6. Eliminar el contenidor
    > docker rm test_ubuntu

Exemple 2: WordPress + Base de Dades

En aquest exemple es muntaran dos contenidors, un amb WordPress i un altre amb MySQL, i els comunicarem entre ells fent que el contenidor WordPress utilitzi el contenidor MySQL com a base de dades.

  1. Arrancar contenidor des d’imatge MySQL
    >; docker run --name wp_mysql -e MYSQL_ROOT_PASSWORD=wp_mysql -d mysql:latest

    El flag -e indica que se li envia la variable d’entorn MYSQL_ROOT_PASSWORD.
    mysql:latest indica que volem l’última versió de la imatge mysql.

     

  2. Arrancar contenidor des d’imatge WordPress i enllaçar-lo al contenidor MySQL
    >; docker run --name wp --link wp_mysql:mysql -p 8080:80 -d wordpress:latest

    El flag –link indica que volem enllaçar el contenidor amb nom wp_mysql, de la imatge mysql, a aquest contenidor.
    El flag -p indica que es vol mapejar el port del host 8080 al port del contenidor 80.

     

  3. Accedir amb el navegador web a http://localhost, i entrarem a la instal·lació del wordpress.

Altres funcions de Docker

Fins ara hem vist funcions molt bàsiques de Docker. Aquesta tecnologia permet moltes altres funcions, com per exemple els Dockerfile. Un Dockerfile és un arxiu amb comandes que munta una imatge automàticament, a través de les instruccions marcades en un llenguatge i format concret.

Podeu consultar aquest altre article: Docker – insights des de la Jasp, on trobareu més informació sobre Dockerfiles i alguns videotutorials.

D’altra banda, Swarm ens permet muntar un clúster de serveis Docker, donant la capacitat de balancejar els contenidors segons la disponibilitat del clúster Docker. Per exemple, si en un clúster tenim un contenidor i de cop i volta el clúster deixa d’estar disponible, Swarm s’encarrega d’assignar-lo a un clúster disponible.

 

docker-swarm​Figura 5: Arquitectura Docker Swarm (font:docs.docker.com)

Per acabar

Hem vist que Docker revoluciona tant el paradigma del desenvolupament com el d’operacions. Es pot resumir amb la seva màxima “Build. Ship. Run.“. Construeixes la teva aplicació a partir d’imatges, sense preocupar-te d’inconsistències entre entorns de desenvolupament o producció. Et permet dissenyar tot el cicle de desenvolupament, proves i distribució de la teva aplicació. Finalment, et permet posar-ho en marxa independentment del sistema d’una manera ràpida i eficient.