Salta el contingut

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 DockerDesktop que tenim instal·lada a l'ordinador Windows.

Una vegada iniciat observarem una nova icona, del Docker, al costat del rellotge: Docker i quan l'obrim ja ens apareix

Docker

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 .
Aquest procés pot trigar força minuts.

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
Això ens ha creat una imatge anomenada 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

img

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.

Recorda que abans d'instal·lar un servei, és recomanable actualitzar els repositoris
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ínia EXPOSE 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.

DevContainers

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