====== 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**.