====== Docker Compose ======
Per utilitzar docker-compose cal que abans coneguis a fons [[Docker]].
Referències:
* Documentació oficial Docker: https://docs.docker.com/compose/
* Una bona [[https://gist.github.com/jonlabelle/bd667a97666ecda7bbc4f1cc9446d43a|xuleta o Cheat Sheet de docker-compose]]
Articles previs:
* [[Docker pres]] teoria a bytes.cat
* [[Docker]] pràctiques inicials a bytes.cat
Segueix a:
* [[Docker upgrade de containers]]
* [[Dockerfile]]
{{tag> #FpInfor #Asix #Ceti #Ciber #CetiMp03 #CiberMp03 DevOps docker docker_compose compose wordpress }}
===== Instal·lació =====
Docker-compose es pot instal·lar fàcilment en Ubuntu:
$ sudo apt install docker-compose
Per suposat, abans cal tenir instal·lat el //Docker Engine//. Ves a l'article [[Docker]] si encara no l'has seguit.
\\
===== Wordpress amb docker-compose =====
Mira la [[https://hub.docker.com/_/wordpress|documentació oficial del docker Wordpress]]. Crea l'arxiu ''docker-compose.yml'' i posa'l en marxa amb un:
$ docker-compose up -d
Podràs veure que el ''-d'' ens allibera la //shell// i deixa els contenidors funcionant en background.
Per parar-lo, pots fer:
$ docker-compose down
Comprova quins volums s'han creat, fent:
$ docker volume ls
\\
===== Escalat de contenidors =====
Una de les funcions importants per la gestió dels contenidors és la de l'escalat o replicació. En el cas de les aplicacions web, és molt habitual necessitar diverses instàncies del servidor web i el seu //software// (PHP, Python, etc.), mantenint una sola BD centralitzada (replicar la BD és una operació molt més complexa).
{{load_balancer.png}}
Anem a fer un simple servidor web amb el docker ''nginxdemos/hello'':
version: "2"
services:
web:
image: nginxdemos/hello
ports:
# important marcar el port intern 80 sense assignar a un d'extern
# docker-machine li asignarà un port extern automàticament
- 80
Arranquem amb:
docker-compose up -d
Escalem amb:
docker-compose up -d --scale web=3
Comprovem estat dels nodes amb:
docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------
www_web_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:49159->80/tcp
www_web_2 /docker-entrypoint.sh ngin ... Up 0.0.0.0:49160->80/tcp
www_web_3 /docker-entrypoint.sh ngin ... Up 0.0.0.0:49161->80/tcp
A la mostra veiem que cada node té assignat un port, començant pel 49159. Els nombres de port i de container no tenen perquè ser correlatius. Podem accedir-hi mitjançant el //browser// a la URL:
http://localhost:32768
\\
===== Balanç de càrrega amb HAProxy =====
Per a arrodonir aquest exercici necessitem un balancejador de càrrega que enllaci amb un o altre node web.
version: "2"
services:
web:
image: nginxdemos/hello
ports:
# importante marcar puerto interno 80 sin asignar a uno externo
# docker-machine le asignará puerto externo automáticamente
- 80
lb:
image: dockercloud/haproxy
ports:
- 8085:80
links:
- web
volumes:
- /var/run/docker.sock:/var/run/docker.sock
Veiem que ja no cal redireccionar el port del microservei "web" com hem fet anteriorment.
Ho aixequem tot amb:
docker-compose up -d --scale web=3
Comprovem que estan en marxa els 3 nodes web amb + el HAProxy amb:
docker-compose ps
HAProxy (service lb) ens redirigirà alternativament a un o altre node en cada visita a:
http://localhost:8085
\\
===== Escalat amb Wordpress =====
Anem a fer un ''docker-compose'' de Wordpress escalable.
* Crea un docker-compose a partir de l'[[https://hub.docker.com/_/wordpress|exemple oficial de la pàgina de Docker Wordpress]]
* Configura'l per a poder escalar el contenidor de wordpress (el de la base de dades ha de ser únic).
* Afegeix també un LB (o //load balancer//) ''HAProxy'' com el de l'exemple anterior.
* En total ha de tenir 3 serveis: wordpress, db i lb.
* Assegura't que:
* El //service// ''wordpress'' no té assignat un port extern (si ho té, no podrà escalar).
* No t'interfereix la instal·lació de Wordpress anterior. Per assegurar-ho fes una nova carpeta amb nova instal·lació. Si vols aprofitar la que tenies, mira que el port del LB (HAProxy) sigui el mateix que el de la instal·lació anterior.
* El LB apunta al servei ''wordpress'', i no al ''web'' de l'exemple.
* Comprova que funciona correctament escalant a 4 instàncies de Wordpress i que pots connectar-te a través del port configurat al HAProxy.
* Per assegurar-nos de que realment HAProxy alterna entre els diferents nodes, forçarem a mostrar la IP del servidor. Farem un //hack// per mostrar la IP del container que ens està servint:
* Edita l'arxiu:
$ sudo vi /var/lib/docker/volumes/scaled-wp_wordpress/_data/index.php
* Introdueix aquesta línia just després del ''define'':
echo "IP Address: ".$_SERVER["SERVER_ADDR"];
* Activa el tema ''twentytwentyone'' (fons verd) des de l'admin panel del wordpress.
* Edita l'arxiu:
$ sudo vi /var/lib/docker/volumes/scaled-wp_wordpress/_data/wp-content/themes/twentytwentyone/header.php
* Introdueix aquesta línia després del ''wp_body_open()'':
echo "IP Address: ".$_SERVER["SERVER_ADDR"];
* **Comprova ara que a l'anar a la //main page// del Wordpress es visualitza la IP i que al recarregar anem alternant entre les diverses IPs**.