Com treballarem amb Docker
En aquest tutorial intentarem explicar les eines que utilitzarem pel treball amb ls contenidors de Docker de la nostra màquina local.
Intentarem no mapejar cap unitat ni directori del nostre ordinador amb el contenidor sinó que utilitzarem les eines disponibles al mercat laboral.
Estructura de directoris
Crearem una estuctura de directoris, més que res, per a fer els fitxers Dockerfile
. Una possible estructura serà crear un Directori inicial a l'arrel del disc C:\MVD
(en Linux opdria ser /srv/MVD
) i dins hi crearem un directori per a cada imatge que vulguem crear amb la comanda docker build
.
Iniciem el Docker Desktop
Caldrà iniciar l'aplicació Docker Desktop
que tenim instal·lada a l'ordinador Windows.
Una vegada iniciat observarem una nova icona, del Docker, al costat del rellotge: i quan l'obrim ja ens apareix
Un projecte ProvaInicial
en marxa
Posarem un projecte en marxa, aquest l'anomenarem ProvaInicial. Per això el que cal fer és:
-
Crear l'estructura de directoris
-
Preveure els ports del contenidor als que cal accedir des de la màquina real o des de la xarxa (ports que cal exposar)
-
Copiar el fitxer
Dockerfile
al directori del contenidor -
Adaptar el Dockerfile segons els serveis que hi posarem: ports.
Per tant, comencem:
Directori i Dockerfile
Creem el directori per la imatge
mkdir C:\MVD\ProvaInicial
mkdir -p /srv/MVD/ProvaInicial
i dins el directori ProvaInicial
hi posem el fitxer Dockerfile
.
Compte al copiar el fitxer Dockerfile
en Windows
És possible que si descarreguem directament el fitxer d'aquesta web, el Windows, ens hi posi una extensió .txt
. Aquest fitxer no ha de tenir extensió, cal treure-la.
ren Dockerfile.txt Dockerfile
mv Dockerfile.txt Dockerfile
Analitzem el fitxer descarregat i...
-
Comprovem els ports que voldrem exposar
En aquest cas cal mirar si tenim tots els ports de tots els serveis que voldrem servir o accedir des del nostre PC o des de qualsevol de la xarxa. Cal comprovar les línies
EXPOSE 22 EXPOSE 80 EXPOSE 443
Creem la imatge
Crearem una primera imatge que pot servir-nos per a crear més d'un contenidor. Per la creació de la imatge executarem la comanda docker build
. Per a simplificar la gestió de les imatges i la creació dels contenidors, posarem nom a la imatge. De moment li direm i_ubuntu24
.
COMPTE: Aquesta és la única ordre que per executar-la cal que estiguem situats al directori on tenim el fitxer Dockerfile
, ara mateix seria el directori C:\MVD\ProvaInicial
o /srv/MVD/ProvaInicial
docker build -t i_ubuntu24 .
Possible sortida generada
c:\MVD\ProvaInicial>docker build -t i_ubuntu24 .
[+] Building 7.9s (11/11) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.53kB 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:24.04 1.6s
=> [auth] library/ubuntu:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/6] FROM docker.io/library/ubuntu:24.04@sha256:dfc10878be8d8fc9c61cbff33166cb1d1fe44391539243703c72766894fa 3.6s
=> => resolve docker.io/library/ubuntu:24.04@sha256:dfc10878be8d8fc9c61cbff33166cb1d1fe44391539243703c72766894fa 0.0s
=> => sha256:b1e9cef3f2977f8bdd19eb9ae04f83b315f80fe4f5c5651fedf41482c12432f7 2.30kB / 2.30kB 0.0s
=> => sha256:dafa2b0c44d2cfb0be6721f079092ddf15dc8bc537fb07fe7c3264c15cb2e8e6 29.75MB / 29.75MB 2.8s
=> => sha256:dfc10878be8d8fc9c61cbff33166cb1d1fe44391539243703c72766894fa834a 1.34kB / 1.34kB 0.0s
=> => sha256:77d57fd89366f7d16615794a5b53e124d742404e20f035c22032233f1826bd6a 424B / 424B 0.0s
=> => extracting sha256:dafa2b0c44d2cfb0be6721f079092ddf15dc8bc537fb07fe7c3264c15cb2e8e6 0.7s
=> [2/6] RUN echo '#!/bin/bash' > /srv/start.sh 0.9s
=> [3/6] RUN chmod a+x /srv/start.sh 0.3s
=> [4/6] RUN echo 'service apache2 start 2> /dev/null' >> /srv/start.sh 0.4s
=> [5/6] RUN echo 'service mariadb start 2> /dev/null' >> /srv/start.sh 0.4s
=> [6/6] RUN echo '/bin/bash' >> /srv/start.sh 0.5s
=> exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:02cc24881969fdb6affbdac095748f788bc4bf99aa0d33a346e668ccffb77111 0.0s
=> => naming to docker.io/library/i_ubuntu24 0.0s
View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/a94d5on84nk1zmhq5tppmhkw4
1 warning found (use docker --debug to expand):
- JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals (line 33)
What's next:
View a summary of image vulnerabilities and recommendations → docker scout quickview
i_ubuntu24
i amb ella podrem crear els diferents contenidors.
c:\MVD\ProvaInicial>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
i_ubuntu24 latest 02cc24881969 About a minute ago 78.1MB
Creem el contenidor
Anem a crear el contenidor anomenat PI
.
Executant la comanda que ens proposa ... En aquest exemple estem preparant molts ports per exportar.
docker run -ti --name PI -p 22:22 -p 80:80 -p 443:443 i_ubuntu24
Ja tindrem la màquina iniciada.
root@d3c3b12d599e:/#
Fixeu-vos que aquesta vegada tenim una shell iniciada al dins del contenidor
Això és degut a que hem creat el contenidor amb els paràmetres -ti
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3c3b12d599e i_ubuntu24 "/bin/sh -c '/srv/st…" 3 minutes ago Up 3 minutes 0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp PI
Tal i com hem fet el docker run
quan sortim del contenidor (amb la comanda exit
) se'ns aturarà el contenidor.
És possible que per sortir del contenidor haguem d'escriure dues vegades la comanda exit
Tornem a iniciar el contenidor
Cada vegada que iniciem l'ordinador i vulguem treballar amb algun contenidor (amb el Docker) caldrà iniciar, abans de res, el Docker Desktop.
Una vegada ja tinguem iniciat el Docker Desktop podem iniciar el contenidor amb la comanda docker start
de la següent manera; aprofitem que li hem posat nom al contenidor i així la comanda serà la mateixa per a tothom.
docker start PI
Una vegada iniciat el contenidor podem veure que està iniciat amb la comanda docker ps
. Si no sortís a la llista seria que el contenidor no està iniciat. Per veure una llista de tots els contenidors, iniciat i aturats, tenim la comanda docker ps -a
.
c:\MVD\ProvaInicial>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
d3c3b12d599e i_ubuntu24 "/bin/sh -c '/srv/st…" 6 minutes ago Up 2 seconds 0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp PI
Comandes al contenidor
Una vegada iniciat el contenidor, per entrar dins el contenidor i executar comandes seguides, el millor és obrir una shell i executar totes les comandes que ens interessi. Quan acabem podem executar la comanda exit
i el contenidor continuarà iniciat.
Per iniciar una shell al contenidor executarem la comanda
docker exec -ti PI /bin/bash
Si la comanda no és interactiva (no hem d'entrar dades nosaltres) podem fer-ho de la següent forma
docker exec -ti PI tail /etc/hosts
Instal·lació dels serveis ...
Ara, farem la instal·lació dels diferents serveis que necessitem. Ho farem des d'una shell iniciada prèviament al notre contenidor.
apt update
apt install -y apache2
Iniciem el servei
service apache2 start
i ja podem accedir, si tot ha anat bé, a la web http://localhost/
Perquè ...
-
no hem tingut problemes en la instal·lació? El contenidor utilitza la nostra connexió de xarxa i si ens hi fixem bé, hem iniciat la shell del contenidor amb l'usuari
root
-
perquè acceedeixo a la web pel port 80? El contenidor té instal·lat el servidor web Apache, que utilitza el port 80, cosa que hem indicat al
Dockerfile
amb la líniaEXPOSE 80
. Al crear el contenidor, hem mapejat el port 80 del contenidor amb el nostre port local 80-p 80:80
.
Si tenim el xampp iniciat, potser tenim problemes per iniciar el contenidor ja que no podrà obrir el port 80 local i ens pot donar error
Cal vigilar bé el mapeig dels ports per tal que sigui compatible amb tot el que tenim i fem
Com configurem la web?
És possible que vulgem modificar alguns del fitxers del contenidor. Per això podem utilitzar diferents tècniques:
Visual Studio Code
En Visual Studio Code tenim diferents extensions que ens permeten editar directament fitxers d'un contenidor. Per exemple:
-
Docker: Docker ens permet treballar directament amb fitxers
Dockerfile
i facilita la creació, gestió i implementació d'aplicacions en contenidors a Visual Studio Code. És necessària per a poder utilitzar l'extensió Dev Containers. -
Dev Containers: Dev Containers ens permet treballar directament amb fitxers ja creats dins el contenidor. Aquesta extensió ens permet connectar a partir d'un Remote Explorer que ens permetrà connectar amb el contenidor i visualitzar tot el sistema de fitxers.
A partir d'ara ja podem modificar els fitxers des del nostre editor preferit i quedarà reflectit al contenidor.
Més serveis?
Si volem afegir més serveis, podem instal·lar-los al contenidor ja que ho hem mig preparat per tal de poder, fins i tot, iniciar-los a 'iniciar el contenidor, una vegada instal·lats.
Modifiquem l'inici dels serveis
Els serveis que s'inicien a l'iniciar el contenidor tenen les comandes d'inicia al fitxer /srv/start.sh
. Podem fer-ho amb l'editor directament o bé copiant el fitxer original al nostre PC, modificar-lo, i , tornar-lo modificat al seu lloc. (des del PC, no des del contenidor) amb la comanda docker container cp
-
copiar el fitxer a
c:\MVD\ProvaInicial
docker container cp PI:/srv/start.sh c:\MVD\ProvaInicial
-
modificar el fitxer amb un editor. El trobarem al sistema de fitxers del nostre PC al directori
c:\MVD\ProvaInicial
-
restaurar el fitxer altra vegada a
/srv
docker container cp c:\MVD\ProvaInicial\start.sh PI:/srv
-
copiar el fitxer a
/srv/MVD/ProvaInicial
docker container cp PI:/srv/start.sh /srv/MVD/ProvaInicial
-
modificar el fitxer amb un editor. El trobarem al sistema de fitxers del nostre PC al directori
/srv/MVD/ProvaInicial
-
restaurar el fitxer altra vegada a
/srv
docker container cp /srv/MVD/start.sh PI:/srv