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
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:
Des de a, intentem arribar a b pel nom:
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
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.
Normalment connectarem el contenidor a la xarxa en el moment de crear-lo amb --network:
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:
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
- Reproduïu el desplegament de WordPress i comproveu que
wp-bdno és accessible des de l'amfitrió (no té ports publicats), però sí des dewordpress(docker exec wordpress getent hosts wp-bd). - Afegiu un contenidor
phpmyadmina la xarxawp-xarxa, publicat al port 8081, que es connecti awp-bd(consulteu la variablePMA_HOSTa la seva pàgina de Docker Hub). Entreu-hi i localitzeu la taulawp_posts. - Creeu una segona xarxa
altra-xarxaamb un contenidor alpine. Pot ferping wp-bd? Per què? - 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.