Un Raspberry Pi és ideal per instal·lar tot tipus de programes que sempre s'han d'executar. La manera més fiable de fer-ho és amb Docker: d'aquesta manera cada programa s'executa aïllat en un contenidor, de manera que no poden interferir entre ells. Us mostrarem com utilitzar Docker en un Raspberry Pi i a què hauríeu de prestar atenció.
Si fa temps que tens un Raspberry Pi, és probable que continuïs instal·lant-hi més i més programari. Home Assistant, Zwave2Mqtt, Node-RED, Rhasspy... Tot va bé, fins que actualitzeu tot el vostre programari a una versió nova i, de sobte, un dels vostres programes deixa de funcionar i mostra un missatge d'error vague.
Què va passar? Un escenari comú és el següent. El programari A i B utilitzen la versió 1.0 de la biblioteca C. Mentrestant, s'allibera la versió 2.0 de la biblioteca C, que és incompatible amb la C 1.0. El programari A es reescriu per utilitzar la biblioteca C 2.0, mentre que els desenvolupadors del programari B no són tan ràpids i es mantindran amb la biblioteca C 1.0 durant un temps. Actualitzeu el programari A i que instal·la la biblioteca C 2.0. Però Raspbian només pot instal·lar una versió d'una biblioteca. Com a resultat, el programari B ja no funciona de cop, perquè no és compatible amb la biblioteca C 2.0.
A la pràctica, les distribucions de Linux fan tot el possible per evitar aquest tipus de situacions, però passa. De vegades de maneres molt més subtils, de manera que no sempre és obvi immediatament què està causant el problema.
01 Què és Docker?
Docker facilita als desenvolupadors la distribució d'aplicacions perquè pugueu executar-les en qualsevol sistema Linux. Aquestes aplicacions es poden trobar en forma d'imatge al Docker Hub. Aquesta imatge és bàsicament una plantilla per a un sistema Linux mínim, que podeu executar a sobre de Raspbian en forma de contenidor.
Cada contenidor està completament aïllat dels altres contenidors. Per tant, l'aplicació d'un contenidor no veu les aplicacions d'altres contenidors. I instal·lar i actualitzar un contenidor garanteix que la nova versió no entri en conflicte amb les aplicacions d'altres contenidors. Per tant, si voleu executar més d'un grapat d'aplicacions al vostre Raspberry Pi, Docker us ajudarà a fer-ho de manera fiable. Gràcies a Docker, també podeu experimentar de manera segura amb programari nou: no us agrada, només heu de suprimir el contenidor després.
02 Instal·leu Docker
Suposem que teniu Raspbian instal·lat, la versió Lite serà suficient. A continuació, inicieu sessió mitjançant ssh per executar les ordres d'aquest curs bàsic. Primer, instal·leu Docker amb l'ordre:
curl -sSL //get.docker.com | sh
A continuació, doneu a l'usuari Pi (amb el qual heu iniciat sessió) accés a Docker, de manera que no executeu totes les ordres de Docker amb l'ordre sudo ha de realitzar:
sudo usermod pi -aG docker
Tanqueu la sessió amb sortida i torneu a iniciar sessió. Ara l'usuari pertany Pi al grup docker.
03 Hola món
Ara hauríeu de poder arrencar un primer contenidor Docker:
docker run --rm hola-món
Aquesta ordre executarà el contenidor Docker hello-world. Aquest contenidor mostra a la seva sortida què passa exactament: la imatge no es troba al vostre Raspberry Pi i Docker la baixa des del Docker Hub. A continuació, Docker crea un contenidor basat en aquesta imatge i hi executa el programa. Per opció --rm el contenidor es neteja després de tancar el programa. Ara sabeu que Docker està instal·lat i funciona correctament.
Hipriota
Simplement instal·larem Docker a Raspbian en aquest tutorial bàsic, però també són possibles altres sistemes operatius si esteu interessats en Docker en un Raspberry Pi. Per exemple, hi ha Hypriot: un sistema operatiu per al Raspberry Pi que està optimitzat per utilitzar Docker. Aleshores només heu d'instal·lar aquesta imatge a la targeta micro-SD del vostre Raspberry Pi i podeu començar a utilitzar Docker immediatament. Hypriot és especialment interessant si només esteu executant contenidors Docker al vostre Raspberry Pi i res més.
04 Crear contenidors
Els fonaments bàsics de treballar amb contenidors Docker es fan amb l'ordre docker, com vam mostrar al pas anterior. Normalment amb Docker no voleu executar un contenidor i tancar-lo immediatament, sinó deixar-lo funcionar. Així que no fem servir l'opció --rm. A més, voleu que el contenidor s'executi en segon pla, sense veure la sortida a la pantalla tot el temps. L'opció -d.
Si vau iniciar un contenidor d'aquesta manera, Docker li donaria un nom aleatori, que no és útil si teniu més d'un grapat de contenidors. Amb l'opció --nom NOM per tant, doneu al contenidor un nom fix.
Aleshores també heu de mirar les connexions de xarxa. Com que cada contenidor de Docker està aïllat, no podeu accedir, per exemple, a un servidor web que s'executa al port 80 d'un contenidor. Per tant, heu d'indicar a Docker que reenviï totes les sol·licituds del port 8888 del Raspberry Pi, per exemple, al port 80 d'un contenidor específic. Ho fas amb l'opció -p 8888:80. Ajuntant totes aquestes opcions per al contenidor de mostra containous/whoami, executeu l'ordre següent:
docker run -d --name whoami -p 8888:80 containous/whoami
Si tot va bé, després d'un temps veureu una llarga cadena de números hexadecimals (com ara 5122c935ce5178751a59699d2c5605c607700bd04e5f57a6c18de434ae53956e). Aquest és l'identificador del contenidor. Si ara navegueu al vostre navegador web //IP:8888 amb en comptes de IP l'adreça IP del vostre Raspberry Pi, veureu una pàgina web que genera el servidor web al contenidor.
05 Consulta els teus contenidors
Un cop has posat en marxa uns quants contenidors com aquest, la gestió comença a ser important. En primer lloc, és útil veure quins contenidors s'estan executant:
docker ps
A continuació, veureu informació sobre tots els contenidors que estan actius (amb l'opció -a inclosos els contenidors que s'han aturat). La primera columna conté un identificador únic per a cada contenidor, al costat la imatge a partir de la qual es va crear el contenidor. La columna ESTAT millor si tens problemes. Per exemple, si el contenidor continua reiniciant-se a causa d'un problema, el veureu aquí.
A la columna PORTS veus els ports utilitzats. Per exemple, davant del nostre contenidor hi ha whoami 0.0.0.0:8888->80/tcp. Això significa que el port tcp 8888 del Raspberry Pi es redirigirà al port tcp 80 del contenidor. A l'última columna veureu el nom del contenidor, que podeu utilitzar en altres ordres de Docker.
Si voleu més informació, arriba l'ordre estadístiques de docker útil. A continuació, veureu les estadístiques de cada contenidor, com ara el consum del processador, la memòria i la xarxa. Si voleu tota la informació que Docker sap sobre un contenidor específic, executeu aquesta ordre amb l'ID o el nom del contenidor:
Docker inspecciona CONTENIDOR
I, finalment, si voleu veure els registres d'un contenidor, executeu una d'aquestes dues ordres:
registres de docker CONTENIDOR
Docker logs -f CONTENIDOR
Amb l'opció -f seguir els registres en temps real a mesura que el contenidor els genera.
06 Gestiona els teus contenidors i imatges
Si voleu aturar, iniciar o reiniciar un contenidor que s'està executant, podeu fer-ho fàcilment amb aquestes ordres respectivament:
docker stop CONTENIDOR
docker llança CONTAINER
docker restart CONTAINER
Si voleu aturar temporalment un contenidor (tots els programes que hi hagi estaran temporalment "congelats"), executeu aquesta ordre:
docker pausa CONTENIDOR
Després d'aquesta ordre, tots els programes del contenidor es tornaran a executar:
docker reactiva CONTENIDOR
Amb l'ordre imatges de docker veureu la llista d'imatges que Docker ha descarregat. Per al nostre contenidor whoami vegeu a la columna REPOSITORI el text contingut/whoami dempeus i a la columna ETIQUETA estands més recent. El nom complet de la imatge seria containous/whoami:darrer són, però aquells més recent és el valor predeterminat de l'etiqueta, per la qual cosa es pot ometre. És per això que, en la nostra tasca a l'apartat 4, nosaltres Docker Run només continú/whoami com a imatge.
A la columna CREAT mireu quant de temps fa que es va descarregar aquesta imatge. Per actualitzar aquesta imatge, executeu l'ordre següent:
docker pull containous/whoami:última
A continuació, Docker baixa la darrera versió de la imatge o us indica que la imatge està actualitzada. Si ho tornes a fer després imatges de docker veureu que s'ha afegit una imatge.
Però el contenidor whoami actual encara utilitza la imatge antiga. Per actualitzar això, atureu (Docker stop whoami) i suprimir (docker rm wohami) creeu el contenidor i torneu a crear-lo mitjançant l'ordre docker run de la secció 4.
Netejar
Si actualitzeu regularment les vostres imatges de Docker per executar la darrera versió en un contenidor, les imatges antigues es mantindran. La targeta micro-SD del vostre Raspberry Pi amb una capacitat d'unes quantes desenes de gigabytes com a màxim es pot omplir ràpidament, sobretot si feu servir contenidors grans. Per exemple, els contenidors com els de Home Assistant i Rhasspy tenen una mida de més d'un gigabyte. Ara Docker funciona amb un sistema de manera que amb una actualització no es descarrega ni s'emmagatzema un gigabyte complet, sinó que després de moltes actualitzacions l'emmagatzematge requerit continua augmentant. Amb l'ordre docker rmi IMAGE_ID suprimiu una imatge segons l'ID que especifiqueu a la sortida de l'ordre imatges de docker troba. Docker també coneix l'ordre poda la imatge de Docker que elimina totes les imatges que no són utilitzades per un contenidor. De poda el sistema docker també elimineu els contenidors aturats, les xarxes no utilitzades per almenys un contenidor i els fitxers de memòria cau.
07 Volum
El nostre contenidor d'exemple whoami no va utilitzar cap dada ni dada de configuració. Però podeu compartir un directori al vostre Raspberry Pi amb un contenidor Docker perquè pugui accedir-hi a les dades. Docker anomena volum a aquest directori compartit.
Si treballareu amb diversos contenidors al vostre Raspberry Pi, us recomanem que poseu tots els seus directoris. Creeu un directori per a això, per exemple amb:
mkdir -p /home/pi/containers/nginx/data
A continuació, col·loqueu-lo a la carpeta contenidors/nginx/dades un arxiu index.html amb una pàgina html.
Aleshores ja podeu iniciar un contenidor amb nginx (un servidor web) amb el qual compartiu aquest directori:
docker run -d --name nginx -p 8080:80 -v /home/pi/containers/nginx/data:/usr/share/nginx/html:ro nginx
Aleshores, el contenidor s'inicia amb el servidor web i munta el directori /home/pi/containers/nging/data al vostre Raspberry Pi al contenidor de la ubicació /usr/share/nginx/html, amb permisos només de lectura (ro significa només lectura). Si navegueu ara IP: 8080 obteniu el fitxer html index.html veure.
08 Docker Compose
Fins ara hem iniciat manualment els contenidors Docker amb l'ordre Docker Run. Però si esteu executant uns quants contenidors Docker més i voleu canviar-ne la configuració regularment, és millor un enfocament diferent: posar-ho tot en un fitxer de configuració. Això passa amb Docker Compose.
Per fer-ho, primer instal·leu el gestor de paquets de Python pip i després Docker Compose (que és un programa de Python) amb aquestes ordres:
sudo apt install python3-pip
sudo pip3 instal·la docker-compose
Ara podeu configurar diversos contenidors Docker en un sol fitxer docker-compose.yml fer. Per fer-ho, creeu un fitxer Docker Compose amb:
nano docker-compose.yml
Poseu-hi la configuració següent per als nostres contenidors d'exemple whoami i nginx:
versió: '3.7'
serveis:
Qui sóc:
imatge: containous/whoami
nom_contenidor: whoami
reiniciar: sempre
port:
- 8888:80
nginx:
imatge: nginx
nom_contenidor: nginx
reiniciar: sempre
port:
- 8080:80
volum:
- /home/pi/containers/nginx/data:/usr/share/nginx/html:ro
09 YAML
Deseu el fitxer amb Ctrl+O i sortiu de nano amb Ctrl+X. Aquest és un fitxer YAML (amb l'extensió .yml). YAML (significa l'abreviatura recursiva "YAML Ain't Markup Language") és un format de fitxer per definir les dades de configuració d'una manera llegible. Es pot trobar més informació al lloc web oficial.
Podeu veure en aquest fitxer que definim dos contenidors com a serveis. Per a cada contenidor definim la imatge utilitzada, el nom que s'ha de donar al contenidor i si el contenidor s'ha de reiniciar automàticament en cas de problemes. A més, també definim els ports redirigits i els volums.
També podeu trobar tota aquesta informació a les línies d'ordres amb Docker Run, però en aquest fitxer Docker Compose està una mica més organitzat.
10 Treballar amb Docker Compose
Un cop tingueu un fitxer docker-compose.yml podeu crear i executar fàcilment els contenidors definits en ell:
docker-compose up -d
Després d'això, podeu gestionar aquests contenidors amb l'ordre docker, però docker-compose també té moltes opcions específicament per gestionar els contenidors que heu creat amb Docker Compose. Així és com netejar-ho tot amb l'ordre següent, tots els contenidors definits s'aturaran i s'eliminaran:
Docker composa cap avall
També podeu seguir els registres de tots els contenidors amb:
docker-compose registres -f
Cada contenidor mostra els seus missatges de registre en un color diferent. Docker Compose també té una melodia familiar per aturar, iniciar i reiniciar tots els contenidors:
parada de composició docker
inici de composició docker
reinici de docker compose
Actualitzeu tots els contenidors del vostre fitxer Docker Compose amb les dues ordres següents:
docker compose pull
reinici de docker compose
La primera ordre baixarà imatges noves per a tots els contenidors que heu definit i la segona ordre reiniciarà tots aquests contenidors perquè utilitzin la nova imatge. Després d'això, podeu esborrar les imatges antigues si voleu amb:
poda la imatge de Docker
11 I més enllà
Podeu trobar imatges de Docker de moltes aplicacions a Docker Hub. A LinuxServer.io també trobareu desenes d'imatges de Docker mantingudes per voluntaris. Aquestes imatges estan ben conservades i documentades, i totes utilitzen un enfocament similar i una infraestructura bàsica.
Intenteu limitar-vos a imatges "oficials" de Docker, que són proporcionades pel propi projecte, o imatges de parts fiables com LinuxServer.io. Perquè en principi qualsevol pot publicar imatges de Docker a Docker Hub, però no sempre es mantenen actualitzades.
L'arquitectura de processador adequada
És important que baixeu les imatges de Docker per a l'arquitectura de processador correcta. El Raspberry Pi té un processador ARM, que no és compatible amb els processadors Intel o AMD que es troben als ordinadors. Es publiquen moltes imatges de Docker per descarregar automàticament la versió correcta per a l'arquitectura del vostre processador. A Docker Hub, trobareu quines arquitectures són compatibles a la pàgina d'imatge de Docker desitjada. Per a Raspbian que és arm32v7, arm/v7 o armhf. Si rebeu el missatge d'error en iniciar un contenidor Docker: error de format exec probablement heu baixat una imatge de l'arquitectura del processador incorrecta. Si això passa, haureu de descarregar una imatge amb una etiqueta diferent. Per exemple, el projecte motionEye distribueix la seva imatge oficial de Docker amb dues possibles etiquetes: tu executes ccrisan/motioneye:master-amd64 en processadors compatibles amb Intel i ccrisan/motioneye:master-armhf en un Raspberry Pi.