Docker Compose permite crear un conjunto de servicios de forma declarativa, diciendo a docker el resultado que queremos y que docker se encargue de ejecutar las ordenes correspondientes.
Introducció
Hi ha moltes aplicacions que no poden funcionar soles, sinó que necessiten altres aplicacions per funcionar.
Per exemple el Wordpress necessita una base de dades.
Xarxa privada
Crea un directori cluster i dins d’aquesta carpeta un fitxer docker-compose.yml.
A continuació tens el contingut del fitxer en format {% link “/tool/yaml/” %}:
services:
apache:
image: httpd:2.4
ports:
- 80:80-
Pots veure que el fitxer defineix un conjunt de serveis.
-
Cada servei te un nom, en aquest cas
apache, que es farà servir per donar nom al contenidor. -
A continuació per cada servei has de dir quina imatge es farà servir i definir els “port forward” pertinents.
Amb docker compose pots arrencar els contenidors definits perl fitxer docker-compose.yaml amb aquesta ordre:
Pots veure que es crea una xarxa amb el nom cluster_default i un contenidor amb el nom cluster_apache_1.
Per defecte, Docker Compose afegeix el nom de la carpeta on està el fitxer docker-compose.yml com a prefix de tots els recursos que crea, en aquest cas cluster_.
Pots verificar que s’ha creat la xarxa:
|
Que és correspon a una interfície de xarxa virtual (fan servir el mateix id):
|
I que el contenidor està en la xarxa 172.18.0.1/16:
|
✅ Docker Compose crea una xarxa privada que permet a un conjunt de contenidors estar connectats de manera aïllada del reste d’aplicacions que s’estan executant a la màquina.
Serveis
Un fitxer docker-compose.yml et permet definir un conjunt de serveis.
Un servei és una aplicació que s’està executant dins un contenidor i que pot ser accedida per qualsevol altre aplicació que tingui accés a la xarxa privada en que està el contenidor.
Modifica el fitxer docker-compose.yml amb tres serveis apache:
services:
apache_1:
image: httpd:2.4
ports:
- 81:81
apache_2:
image: httpd:2.4
ports:
- 82:80
apache_3:
image: httpd:2.4
ports:
- 83:80Desplega aquesta nova configuració:
for
Pots veure que docker arrencar 3 contenidors, però no elimina el que està en execució.
Un contenidor pot guardar estat (fitxers modificats, dades, etc.) i si elimines el contenidor aquestes estat es perd.
Per tant, per defecte, docker es conservador per evitar que sense voler facis el que no havies de fer:
✅ Amb l’opció --format podem limitar la informació que ens mostra l’ordre docker ps`.
Verifica amb nmapque els 4 contenidors estan escoltant als ports respectius:
Si estas segur del que estas fent pots demanar a docker que elimini el servei que ja no està declarat amb l’opció --remove-orphans:
Verifica que el contenidor cluster_apache_1 s’ha eliminat:
Volum
Al fitxer docker-compose.yml també pots definir volums:
services:
apache_1:
image: httpd:2.4
volumes:
- htdocs:/usr/local/apache2/htdocs
ports:
- 81:80
apache_2:
image: httpd:2.4
volumes:
- htdocs:/usr/local/apache2/htdocs
ports:
- 82:80
apache_3:
image: httpd:2.4
volumes:
- htdocs:/usr/local/apache2/htdocs
ports:
- 83:80
volumes:
htdocs:Torna a arrencar els contenidors:
Com que el fitxer declara un volum htdocs, docker s’encarrega de crear aquest volum.
Fixa’t que al igual que ha fet amb la xarxa i els contenidors el prefix és cluster:
També que s’han tornar a crear els contenidors httpd.
Modifica el contingut htdocs d’un dels contenidors.
A continuació verificar que tots el contenidors comparteixen el mateix volum:
Com que el contingut de la carpeta htdocs està montant en un volum podem eliminar el contenidors sense perdre l’estat:
Pots veure que es borra tot (incloent la xarxa) excepte el volum:
Si tornem a desplegar la composició tot torna a funcionar:
Proxy
A continuació crearem un proxy pels tres servidors web.
Crea un fitxer haproxy.cfg:
frontend proxy
bind :80
default_backend webservers
backend webservers
server s1 apache_1:80 check
server s2 apache_2:80 check
server s3 apache_3:80 checkModifica el fitxer docker-compose.yml:
services:
proxy:
image: haproxy:2.9
sysctls:
net.ipv4.ip_unprivileged_port_start: 0
volumes:
- ${PWD}/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
ports:
- 80:80
- 8404:8404
apache_1:
image: httpd:2.4
volumes:
- htdocs:/usr/local/apache2/htdocs
apache_2:
image: httpd:2.4
volumes:
- htdocs:/usr/local/apache2/htdocs
apache_3:
image: httpd:2.4
volumes:
- htdocs:/usr/local/apache2/htdocs
volumes:
htdocs:Per muntar el fitxer fem servir un volum anònim.
Si vols saber perquè afegim systctls ves a https://hub.docker.com/_/haproxy/
Para i arrenca de nou els contenidors:
És molt important que el fitxer haproxy.cfg acabi amb un LFen la última linia.
Si no tindràs aquest error:
$ curl localhost
curl: (7) Failed to connect to localhost port 80 after 0 ms: S’ha refusat la connexióI si mires el log del contenidor trobaràs aquesta explicació:
✅ Si no t’ha passat modifica el fitxer haproxy.cfg perquè doni aquest error. És important que aprenguis a solucionar aquestes situacions per tu mateix ja que ChatGPT no ho farà per tu.
Verifica que el proxy funciona:
A {% link “/linux/docker/network/” %} vam configurar un proxy de manera imperativa.
Ara tenim un fitxer docker-compose.yml que ens permet configurar un proxy de manera declarativa.
Elimina els contenidors:
Exemples
A continuació tens conjunt d’aplicacions web que es composen de diversos components que s’han desplegat mitjançant Docker Compose.
Aquestes aplicacions s’utilitzen en diferents activitats formatives:
{% pages [“/web/app/etherpad/”, “/web/app/cryptpad/”, “/web/app/wordpress/”, “/web/odoo/”] %}