Salta el contingut

Pas 7 - Xarxes entre contenidors

Fins ara cada contenidor treballava sol. Les aplicacions reals, però, estan formades per diversos serveis que es parlen: una web i la seva base de dades, una API i una memòria cau... En aquest pas veurem com es comuniquen els contenidors i acabarem muntant WordPress amb MySQL només amb el que hem après fins ara.

Objectius del pas

  • Veure les xarxes que crea Docker per defecte.
  • Comprovar que a la xarxa per defecte els contenidors no es troben pel nom.
  • Crear xarxes pròpies amb resolució DNS automàtica.
  • Desplegar una aplicació de dos contenidors (WordPress i MySQL) combinant xarxes, volums, variables i ports.

7.1 Les xarxes per defecte

docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
a1b2c3d4e5f6   bridge    bridge    local
b2c3d4e5f6a7   host      host      local
c3d4e5f6a7b8   none      null      local
Xarxa Comportament
bridge La xarxa per defecte. Cada contenidor rep una IP privada (normalment 172.17.0.x)
host El contenidor fa servir directament la xarxa de l'amfitrió, sense aïllament ni -p
none Sense xarxa: només la interfície de loopback

7.2 A la xarxa per defecte, no hi ha noms

Arrenquem dos contenidors lleugers que es queden esperant:

docker run -d --name a alpine:3.20 sleep infinity
docker run -d --name b alpine:3.20 sleep infinity

Des de a, intentem arribar a b pel nom:

docker exec a ping -c 2 b
ping: bad address 'b'

Ara per IP:

docker inspect --format '{{.NetworkSettings.IPAddress}}' b    # per exemple 172.17.0.3
docker exec a ping -c 2 172.17.0.3                           # funciona

Hi ha connectivitat, però no hi ha resolució de noms. I les IP canvien cada vegada que es recrea un contenidor, així que no ens hi podem refiar.

7.3 Xarxes pròpies: DNS automàtic

docker network create xarxa-proves
docker network connect xarxa-proves a
docker network connect xarxa-proves b
docker exec a ping -c 2 b
PING b (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.101 ms

Ara sí. En una xarxa definida per l'usuari, Docker ofereix un servidor DNS intern que resol el nom del contenidor a la seva IP. A més, aïlla: només es poden parlar els contenidors connectats a la mateixa xarxa.

docker network inspect xarxa-proves    # contenidors connectats, subxarxa i passarel·la

Normalment connectarem el contenidor a la xarxa en el moment de crear-lo amb --network:

docker run -d --name c --network xarxa-proves alpine:3.20 sleep infinity
flowchart TB
    subgraph DEF["Xarxa bridge per defecte (sense DNS)"]
        A1[a]
        B1[b]
    end
    subgraph PRO["xarxa-proves (amb DNS)"]
        A2[a]
        B2[b]
        C2[c]
    end
    A2 -->|ping b funciona| B2
    A1 -.->|ping b falla| B1
    classDef x fill:#2563EB,stroke:#1E40AF,color:#FFFFFF
    classDef y fill:#16A34A,stroke:#166534,color:#FFFFFF
    class A1,B1 x
    class A2,B2,C2 y

Entre contenidors no cal publicar ports

Els contenidors d'una mateixa xarxa es parlen directament pels ports interns. -p només cal per accedir-hi des de fora de Docker (el navegador, un altre ordinador...). Per exemple, una base de dades que només fa servir la web no s'hauria de publicar.

7.4 Tot junt: WordPress i MySQL a mà

Ara tenim totes les peces: imatges, segon pla, ports, variables, volums i xarxes. Muntem un WordPress complet:

flowchart LR
    N[Navegador] -->|localhost 8000| WP[Contenidor wordpress<br/>port 80]
    WP -->|wp-bd 3306| BD[Contenidor wp-bd<br/>MySQL]
    BD --- V1[(Volum wp-dades-bd)]
    WP --- V2[(Volum wp-fitxers)]
    subgraph X[Xarxa wp-xarxa]
        WP
        BD
    end
    classDef a fill:#7C3AED,stroke:#5B21B6,color:#FFFFFF
    classDef b fill:#2563EB,stroke:#1E40AF,color:#FFFFFF
    classDef c fill:#16A34A,stroke:#166534,color:#FFFFFF
    class N a
    class WP,BD b
    class V1,V2 c

1. La xarxa:

docker network create wp-xarxa

2. La base de dades (a la xarxa, amb volum, sense publicar ports):

docker run -d --name wp-bd \
  --network wp-xarxa \
  -v wp-dades-bd:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=RootSeguret \
  -e MYSQL_DATABASE=wordpress \
  -e MYSQL_USER=wp \
  -e MYSQL_PASSWORD=WpSeguret \
  --restart unless-stopped \
  mysql:8.4

3. WordPress (a la mateixa xarxa, apuntant a la base de dades pel nom wp-bd, i publicat al port 8000):

docker run -d --name wordpress \
  --network wp-xarxa \
  -p 8000:80 \
  -v wp-fitxers:/var/www/html \
  -e WORDPRESS_DB_HOST=wp-bd:3306 \
  -e WORDPRESS_DB_USER=wp \
  -e WORDPRESS_DB_PASSWORD=WpSeguret \
  -e WORDPRESS_DB_NAME=wordpress \
  --restart unless-stopped \
  wordpress:6.7

Obriu http://localhost:8000 i completeu l'instal·lador de WordPress. Creeu una entrada al blog.

4. Prova de persistència: elimineu els dos contenidors i torneu a executar les comandes dels punts 2 i 3. El blog, amb l'entrada que heu creat, continua existint perquè les dades són als volums.

Quina feina!

Fixeu-vos en el que ha calgut: una xarxa, dos volums, dues comandes llargues amb 8 o 9 opcions cadascuna, i recordar-les exactament per poder tornar a crear l'entorn. Si un company vol el mateix entorn, li heu de passar totes les comandes. I per aturar-ho tot, heu d'anar contenidor per contenidor.

Això és exactament el que resol Docker Compose, que veurem al Pas 9: les mateixes comandes descrites en un fitxer i un sol docker compose up. Abans, però, aprendrem a crear imatges pròpies (Pas 8), perquè Compose també les sap construir.

Miniactivitat - Una aplicació amb dues xarxes

  1. Reproduïu el desplegament de WordPress i comproveu que wp-bd no és accessible des de l'amfitrió (no té ports publicats), però sí des de wordpress (docker exec wordpress getent hosts wp-bd).
  2. Afegiu un contenidor phpmyadmin a la xarxa wp-xarxa, publicat al port 8081, que es connecti a wp-bd (consulteu la variable PMA_HOST a la seva pàgina de Docker Hub). Entreu-hi i localitzeu la taula wp_posts.
  3. Creeu una segona xarxa altra-xarxa amb un contenidor alpine. Pot fer ping wp-bd? Per què?
  4. Escriviu en un fitxer de text totes les comandes necessàries per aixecar l'entorn complet des de zero. Quantes línies té? Guardeu-lo: el farem servir al pas 9.

7.5 Neteja

docker rm -f a b c
docker network rm xarxa-proves
# Mantingueu WordPress si voleu comparar-lo amb la versió de Compose del pas 9. Si no:
docker rm -f wordpress wp-bd phpmyadmin
docker network rm wp-xarxa
docker volume rm wp-dades-bd wp-fitxers

Resum del pas

Comanda Què fa
docker network ls / inspect / rm Gestió de xarxes
docker network create NOM Crea una xarxa pròpia (amb DNS entre contenidors)
--network NOM Connecta el contenidor a la xarxa en crear-lo
docker network connect / disconnect Connecta o desconnecta un contenidor existent

Següent pas: fins ara només hem fet servir imatges fetes per altres. Al Pas 8 crearem les nostres amb un Dockerfile.