A l’article anterior vàrem veure com descarregar imatges i executar contenidors de forma bàsica. En aquest article aprofundirem en la gestió del cicle de vida dels contenidors: com configurar-los, inspeccionar-los, interactuar-hi i gestionar-ne l’execució.
Per il·lustrar els conceptes, farem feina amb dos serveis: MariaDB, la base de dades relacional, i Adminer, la interfície web per gestionar bases de dades.
Execució amb configuració #
La comanda docker run accepta moltes opcions per configurar el comportament del contenidor. Vegem les més habituals creant un contenidor de MariaDB:
docker run --name mariadb-demo \
--env MARIADB_ROOT_PASSWORD=secret \
--env MARIADB_DATABASE=demo \
--env MARIADB_USER=demouser \
--env MARIADB_PASSWORD=demopass \
--publish 3306:3306 \
--detach \
mariadb:12Analitzem les opcions utilitzades:
| Opció | Descripció |
|---|---|
--name mariadb-demo |
Assigna un nom descriptiu al contenidor |
--env VARIABLE=valor |
Defineix variables d’entorn dins del contenidor |
--publish 3306:3306 |
Mapeja el port 3306 de l’amfitrió al port 3306 del contenidor |
--detach |
Executa el contenidor en segon pla |
mariadb:12 |
La imatge i etiqueta a utilitzar |
Les variables d’entorn són el mecanisme estàndard per configurar contenidors. Cada imatge defineix les seves pròpies variables; en el cas de MariaDB:
MARIADB_ROOT_PASSWORD: Contrasenya de l’usuari root (obligatòria).MARIADB_DATABASE: Nom d’una base de dades a crear automàticament.MARIADB_USERiMARIADB_PASSWORD: Usuari i contrasenya amb accés a la base de dades creada.
Llistar i inspeccionar contenidors #
Per veure els contenidors en execució:
docker psLa sortida mostra informació bàsica de cada contenidor:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
968c157c2e0f mariadb:12 "docker-entrypoint.s…" 30 seconds ago Up 29 seconds 0.0.0.0:3306->3306/tcp mariadb-demoPer veure tots els contenidors, incloent els aturats, afegim l’opció --all:
docker ps --allLa comanda docker ps --all, o docker ps -a, és molt útil per diagnosticar problemes: si un contenidor s’atura immediatament després d’iniciar-se, apareixerà aquí amb l’estat Exited.
Per obtenir informació detallada d’un contenidor, usam docker inspect:
docker inspect mariadb-demoAquesta comanda retorna un document JSON amb tota la configuració del contenidor: xarxes, volums, variables d’entorn, punts de muntatge, etc. Podem filtrar la sortida amb l’opció --format, per exemple per obtenir només l’adreça IP del contenidor:
docker inspect \
--format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
mariadb-demoLogs #
La comanda docker logs és l’eina principal per consultar la sortida d’un contenidor:
docker logs mariadb-demoOpcions més útils:
| Opció | Descripció |
|---|---|
--tail N |
Mostra només les últimes N línies |
--follow o -f |
Segueix els logs en temps real (com tail -f) |
--timestamps |
Afegeix marca temporal a cada línia |
--since TEMPS |
Mostra logs des d’un moment específic (p.ex. --since 10m) |
Per exemple, per seguir els logs en temps real mostrant només les últimes 20 línies:
docker logs --follow --tail 20 mariadb-demoPer sortir del mode --follow, premem Ctrl+C.
Ús de recursos #
La comanda docker stats mostra l’ús de recursos en temps real:
docker stats mariadb-demoLa sortida mostra:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
968c157c2e0f mariadb-demo 0.15% 89.4MiB / 15.6GiB 0.56% 1.2kB / 0B 12.3MB / 41kB 8Per obtenir una captura instantània sense actualització contínua, usam --no-stream:
docker stats --no-stream mariadb-demoSi el contenidor està aturat, totes les estadístiques mostraran zero.
Cicle de vida #
Un contenidor pot estar en diferents estats: creat, en execució, pausat, aturat o eliminat. Les comandes principals per gestionar el cicle de vida són:
| Comanda | Descripció |
|---|---|
docker stop mariadb-demo |
Atura el contenidor |
docker start mariadb-demo |
Inicia un contenidor aturat |
docker restart mariadb-demo |
Atura i inicia el contenidor |
docker pause mariadb-demo |
Congela tots els processos del contenidor |
docker unpause mariadb-demo |
Descongela els processos del contenidor |
La comanda docker stop envia primer un senyal SIGTERM al procés principal del contenidor, donant-li l’oportunitat de tancar-se correctament. Si el procés no s’atura en 10 segons (configurable amb --time), Docker envia SIGKILL per forçar l’aturada.
Per eliminar un contenidor aturat:
docker rm mariadb-demoPer eliminar un contenidor en execució, hem d’aturar-lo primer o usar l’opció --force:
docker rm --force mariadb-demoInteracció #
Sovint necessitam executar comandes dins d’un contenidor en execució, ja sigui per depurar problemes, consultar dades o realitzar tasques administratives.
Primer, tornem a crear el contenidor de MariaDB:
docker run --name mariadb-demo \
--env MARIADB_ROOT_PASSWORD=secret \
--env MARIADB_DATABASE=demo \
--env MARIADB_USER=demouser \
--env MARIADB_PASSWORD=demopass \
--publish 3306:3306 \
--detach \
mariadb:12La comanda docker exec permet executar comandes dins d’un contenidor en execució. Per exemple, podem executar una comanda simple:
docker exec mariadb-demo ls -la /var/lib/mysqlPerò també podem executar comandes interactives, per exemple obrir un shell:
docker exec --interactive --tty mariadb-demo /bin/bashLes opcions --interactive (-i) i --tty (-t) són necessàries per a sessions interactives:
--interactive: Manté l’entrada estàndard (stdin) oberta.--tty: Assigna un pseudo-terminal (necessari per a shells i editors).
Normalment s’usen combinades com -it:
docker exec -it mariadb-demo /bin/bashAlgunes imatges minimalistes (com les basades en Alpine o les distroless) no inclouen Bash. En aquests casos, usarem
/bin/sh.
Un pic dins del contenidor, podem executar comandes com si estiguéssim en un sistema Linux normal. Les eines disponibles depenen del que estigui instal·lat a la imatge. Per sortir del shell, escrivim exit o premem Ctrl+D.
Connexió a MariaDB #
Podem connectar-nos al client de MariaDB directament:
docker exec -it mariadb-demo mariadb \
--user=demouser --password=demopass demoUn pic dins del client MariaDB, podem executar consultes SQL:
-- Mostrar les bases de dades disponibles
SHOW DATABASES;
-- Crear una taula
CREATE TABLE productes (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
preu DECIMAL(10,2)
);
-- Inserir dades
INSERT INTO productes (nom, preu) VALUES
('Teclat mecànic', 89.99),
('Ratolí ergonòmic', 45.50),
('Monitor 27"', 299.00);
-- Consultar les dades
SELECT * FROM productes;
-- Sortir del client MariaDB
EXIT;Des de l’amfitrió #
Com que hem publicat el port 3306, també podem connectar-nos des de l’amfitrió si tenim el client MariaDB instal·lat. En cas de no ser així, ho podem fer amb la següent comanda:
sudo apt-get install mariadb-clientUna vegada tenim el client MariaDB instal·lat, ja podem connectar-nos:
mariadb --host=127.0.0.1 --port=3306 --user=demouser \
--password=demopass demoCòpia de fitxers #
La comanda docker cp permet copiar fitxers entre l’amfitrió i un contenidor (en qualsevol direcció). Per exemple, per a copiar un fitxer de l’amfitió al contenidor:
docker cp fitxer.sql mariadb-demo:/tmp/fitxer.sqlI per a copiar un fitxer del contenidor a l’amfitió:
docker cp mariadb-demo:/var/log/mysql/error.log ./error.logPer exemple, suposem que tenim un fitxer init.sql amb dades inicials:
-- init.sql
CREATE TABLE IF NOT EXISTS clients (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
email VARCHAR(100)
);
INSERT INTO clients (nom, email) VALUES
('Anna García', '[email protected]'),
('Pere Martí', '[email protected]'),
('Marta Vidal', '[email protected]');Podem copiar-lo al contenidor i executar-lo amb les següents sentències. Primer, el copiam al contenidor:
docker cp init.sql mariadb-demo:/tmp/init.sqlAra ja podem executar el fitxer SQL dins del contenidor:
docker exec mariadb-demo mariadb --user=demouser \
--password=demopass demo -e "SOURCE /tmp/init.sql"I, per acabar, podem verificar que s’han creat les dades:
docker exec mariadb-demo mariadb --user=demouser \
--password=demopass demo -e "SELECT * FROM clients"Adminer #
Adminer és una eina lleugera per gestionar bases de dades des del navegador. Executem un contenidor d’Adminer connectat a la mateixa xarxa que MariaDB:
docker run --name adminer \
--publish 8080:8080 \
--detach \
adminerAra podem accedir a http://localhost:8080 des del navegador. Per connectar-nos a MariaDB des d’Adminer, necessitam saber l’adreça IP del contenidor MariaDB:
docker inspect \
--format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
mariadb-demoA la interfície d’Adminer, introduïm:
- Sistema: MySQL
- Servidor: L’adreça IP obtinguda (p.ex.
172.17.0.2) - Usuari:
demouser - Contrasenya:
demopass - Base de dades:
demo
A l’article sobre xarxes veurem com crear una xarxa Docker personalitzada on els contenidors es poden comunicar usant els seus noms en lloc d’adreces IP.
Neteja #
Per netejar els recursos creats durant aquesta lliçó:
docker rm --force mariadb-demo adminer
docker rmi mariadb:12 adminerExercicis pràctics #
Es proposen tres exercicis pràctics per facilitar l’aprenentatge progressiu.
Exercici 1 #
Exploració de PostgreSQL
- Descarrega la imatge
postgres:18-alpine. - Consulta la documentació a Docker Hub i la documentació oficial al per identificar les variables d’entorn necessàries.
- Executa un contenidor anomenat
pg-testamb una base de dadesbiblioteca, usuaribiblioi contrasenyadFeWm5y2dZCP9wKKWYAe. - Connecta’t al contenidor amb
docker execi obre el clientpsql. - Crea una taula
llibreamb columnesid,titoliautor, i insereix un conjunt de registres. - Consulta les dades per verificar que s’han inserit correctament.
- Consulta els logs del contenidor per veure els missatges d’inicialització.
- Atura i neteja el contenidor.
Pista: Usa
psql --helpper a averiguar com connectar-te a la base de dades a través de les variables d’entorn i executar comandes SQL.
Respostes
Creació del contenidor:
docker run --name pg-test \
--env POSTGRES_PASSWORD='dFeWm5y2dZCP9wKKWYAe' \
--env POSTGRES_USER=biblio \
--env POSTGRES_DB=biblioteca \
--publish 5432:5432 \
--detach postgres:18-alpineConnexió al contenidor:
docker exec -it pg-test /bin/bashExecució del client de terminal psql per connectar-nos a la base de dades:
psql --user=$POSTGRES_USER --dbname=$POSTGRES_DBCreació de la taula:
CREATE TABLE IF NOT EXISTS llibre
(id SERIAL PRIMARY KEY, titol VARCHAR(50), autor VARCHAR(50));Inserció de registres a la taula:
INSERT INTO llibre (id, titol, autor)
VALUES (1, 'Red Sparrow', 'Jason Matthews'),
(2, 'A Feast for Crows', 'George R. R. Martin'),
(3, 'Foundation', 'Isaac Asimov'),
(4, '1984', 'George Orwell'),
(5, 'The Lord of the Rings', 'J. R. R. Tolkien'),
(6, 'Woken Furies', 'Richard Morgan')
ON CONFLICT (id) DO NOTHING;Consulta de registres existents:
SELECT * FROM llibre ORDER BY id ASC;Consulta dels logs generats pel contenidor:
docker logs pg-testAturada i neteja del contenidor:
docker rm --force pg-testExercici 2 #
Diagnòstic i monitorització
Per a aquest exercici farem servir uns fitxers SQL ja preparats, que pots descarregar:
- city.sql: Crea la taula
cityamb dades de ciutats i coordenades geogràfiques (requereix PostGIS). - student.sql: Crea la taula
studentamb dades d’estudiants. - queries.sql: Consultes SQL per generar activitat al servidor.
- Descarrega els tres fitxers SQL.
- Executa un contenidor PostgreSQL usant la imatge
postgis/postgis:18-3.6-alpineanomenatpg-monitoramb una base de dadesescola, usuariescolai claumMG5fZFtXm0N6TgW1F6P. - Obre una nova terminal i executa
docker logs --follow pg-monitorper veure els logs en temps real. - Obre una altra terminal i executa
docker stats pg-monitorper monitoritzar l’ús de recursos. - Usant
docker cp, copia els fitxerscity.sqlistudent.sqlal contenidor i executa’ls per crear les taules i inserir les dades. - Copia el fitxer
queries.sqlal contenidor i executa’l diverses vegades per generar activitat. - Observa com canvien les estadístiques de CPU i memòria.
- Atura el monitoratge amb Ctrl+C i neteja el contenidor.
Les consultes espacials amb PostGIS generen més càrrega de CPU que les consultes simples, cosa que facilita observar els canvis a
docker stats.
Respostes
Creació del contenidor:
docker pull postgis/postgis:18-3.6-alpine
docker run --name pg-monitor \
--env POSTGRES_PASSWORD='mMG5fZFtXm0N6TgW1F6P' \
--env POSTGRES_USER=escola \
--env POSTGRES_DB=escola \
--publish 5432:5432 \
--detach postgis/postgis:18-3.6-alpineCopia els fitxers SQL al contenidor:
docker cp city.sql pg-monitor:/city.sql
docker cp student.sql pg-monitor:/student.sql
docker cp queries.sql pg-monitor:/queries.sqlExecució de les consultes SQL:
docker exec pg-monitor psql --user=escola \
--dbname=escola -f /city.sql
docker exec pg-monitor psql --user=escola \
--dbname=escola -f /student.sql
docker exec pg-monitor psql --user=escola \
--dbname=escola -f /queries.sqlAturada i neteja del contenidor:
docker rm --force pg-monitor