bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


Barra lateral

ASIX Administració de Sistemes Informàtics i Xarxes
Tots els mòduls del cicle
MP01 Implantació de sistemes operatius
Totes les UFs del modul
MP02 Gestió de bases de dades
Totes les UFs del modul
MP03 Programació bàsica
Totes les UFs del modul
MP04 Llenguatges de marques i sistemes de gestió d'informació
Totes les UFs del modul
MP05 Fonaments de maquinari
Totes les UFs del modul
MP06 Administració de sistemes operatius
Totes les UFs del modul
MP07 Planificació i administració de xarxes
Totes les UFs del modul
MP08 Serveis de xarxa i Internet
Totes les UFs del modul
MP09 Implantació d'aplicacions web
Totes les UFs del modul
MP10 Administració de sistemes gestors de bases de dades
Totes les UFs del modul
MP11 Seguretat i alta disponibilitat
Totes les UFs del modul
MP12 Formació i orientació laboral
Totes les UFs del modul
MP13 Empresa i iniciativa emprenedora
Totes les UFs del modul
MP14 Projecte
Totes les UFs del modul
DAM Desenvolupament d’aplicacions multiplataforma
Tots els mòduls del cicle
MP01 Sistemes informàtics
Totes les UFs del modul
MP02 Bases de dades
Totes les UFs del modul
MP03 Programació bàsica
Totes les UFs del modul
MP04 Llenguatges de marques i sistemes de gestió d'informació
Totes les UFs del modul
MP05 Entorns de desenvolupament
Totes les UFs del modul
MP06 Accés a dades
Totes les UFs del modul
MP07 Desenvolupament d’interfícies
Totes les UFs del modul
MP08 Programació multimèdia i dispositius mòbils
Totes les UFs del modul
MP09 Programació de serveis i processos
Totes les UFs del modul
MP10 Sistemes de gestió empresarial
Totes les UFs del modul
MP11 Formació i orientació laboral
Totes les UFs del modul
MP12 Empresa i iniciativa emprenedora
Totes les UFs del modul
MP13 Projecte de síntesi
Totes les UFs del modul
MPDual Mòdul Dual / Projecte
DAW Desenvolupament d’aplicacions web
Tots els mòduls del cicle
MP01 Sistemes informàtics
Totes les UFs del modul
MP02 Bases de dades
Totes les UFs del modul
MP03 Programació
Totes les UFs del modul
MP04 Llenguatge de marques i sistemes de gestió d’informació
Totes les UFs del modul
MP05 Entorns de desenvolupament
Totes les UFs del modul
MP06 Desenvolupament web en entorn client
Totes les UFs del modul
MP07 Desenvolupament web en entorn servidor
Totes les UFs del modul
MP08 Desplegament d'aplicacions web
Totes les UFs del modul
MP09 Disseny d'interfícies web
Totes les UFs del modul
MP10 Formació i Orientació Laboral
Totes les UFs del modul
MP11 Empresa i iniciativa emprenedora
Totes les UFs del modul
MP12 Projecte de síntesi
Totes les UFs del modul
SMX Sistemes Microinformàtics i Xarxes
Tots els mòduls del cicle
MP01 Muntatge i manteniment d’equips
Totes les UFs del modul
MP02 Sistemes Operatius Monolloc
Totes les UFs del modul
MP03 Aplicacions ofimàtiques
Totes les UFs del modul
MP04 Sistemes operatius en xarxa
Totes les UFs del modul
MP05 Xarxes locals
Totes les UFs del modul
MP06 Seguretat informàtica
Totes les UFs del modul
MP07 Serveis de xarxa
Totes les UFs del modul
MP08 Aplicacions Web
Totes les UFs del modul
MP09 Formació i Orientació Laboral
Totes les UFs del modul
MP10 Empresa i iniciativa emprenedora
Totes les UFs del modul
MP11 Anglès
Totes les UFs del modul
MP12 Síntesi
Totes les UFs del modul
CETI Ciberseguretat en Entorns de les Tecnologies de la Informació
Tots els mòduls del cicle
docker

Docker pràctic

Docker és una tecnologia de gestió de containers. Els contenidors són un entorn aïllat d'execució segur, a mode de màquina virtual lleugera, i que s'executen aprofitant el mateix nucli de la màquina host.

Altres articles sobre Docker a aquesta wiki:

2021/10/19 17:38 ENRIC MIEZA SANCHEZ
2021/10/18 10:13 ENRIC MIEZA SANCHEZ
2021/09/10 21:07 ENRIC MIEZA SANCHEZ
2021/11/30 19:50 ENRIC MIEZA SANCHEZ
2021/12/04 12:55 ENRIC MIEZA SANCHEZ
2021/11/01 21:20 ENRIC MIEZA SANCHEZ
2021/11/29 21:25 ENRIC MIEZA SANCHEZ
2021/10/26 15:00 ENRIC MIEZA SANCHEZ

Instal·lació

Sobre Ubuntu és més fàcil treballar. Pots crear una VM Ubuntu amb Vagrant fàcilment amb:

$ mkdir ubudocker
$ cd ubudocker
$ vagrant init ubuntu/focal64

Edita el Vagrantfile i activa la xarxa externa per fer-lo accessible per xarxa. Descomenta la línia:

config.vm.network "public_network"

Posa en marxa la VM:

$ vagrant up
$ vagrant ssh

Un cop arrencada la màquina, podem fer:

$ sudo apt update
$ sudo apt install docker.io

Per no haver de fer sudo afegim l'usuari al grup docker:

$ sudo adduser myuser docker

I també afegim l'eina Byobu per a millora de la shell que ens serà pràctic:

$ sudo apt install byobu
$ byobu-install

Caldrà sortir i entrar a la sessió gràfica o a la shell perquè el canvi de grup docker prengui efecte.


Exemples pràctics: search i pull

docker search per buscar imatges al Docker Hub (https://hub.docker.com)

$ docker search ubuntu

docker pull per descarregar una imatge:

$ docker pull ubuntu:focal
$ docker pull centos:8

El format imatge:tag ens permet descarregar diverses versions del mateix contenidor.


Exemples pràctics: images

docker images per veure les imatges que hem descarregat

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ubuntu       focal     597ce1600cf4   4 days ago     72.8MB
debian       latest    a178460bae57   7 days ago     124MB
centos       latest    5d0da3dc9764   2 weeks ago    231MB
ubuntu       groovy    e508bd6d694e   2 months ago   79.4MB  


Primeres passes

Exemple d'arrencada d'un contenidor hello-world que ens descarregarà i posarà en marxa un docker que imprimirà un missatge de «hello world» i sortirà:

$ docker run hello-world

Fixeu-vos en què tornem a tenir disponible la shell mentre que aquest altre exemple la bloqueja:

$ docker run httpd

Podem obrir una altra shell de byobuamb F2. Els shorcuts son:

  • F2 : obre una shell nova.
  • F3 i F4 : moure'ns entre les diferents shells.
  • F6 : sortir mantenint la configuració de les diferents shells remotes.

Ara podràs comprovar que el docker httpd està funcionant amb docker ps:

[email protected]:~$ docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS         PORTS     NAMES
1cf40af37371   httpd     "httpd-foreground"   4 minutes ago   Up 4 minutes   80/tcp    heuristic_curran

Amb docker ps -a també veurem el docker inicial creat:

[email protected]:~$ docker ps -a
CONTAINER ID   IMAGE         COMMAND              CREATED         STATUS                     PORTS     NAMES
af672fa8016d   hello-world   "/hello"             7 seconds ago   Exited (0) 6 seconds ago             jolly_ellis
1cf40af37371   httpd         "httpd-foreground"   5 minutes ago   Up 5 minutes               80/tcp    heuristic_curran

Fixa't que Docker anomena els contenidors amb nom i cognom aleatoris.

Veiem que hello-world està parat. El podem intentar reviure amb docker start però veurem que torna a sortir sense fer res mes. Encara que tècnicament no és «mort», el podem donar com a tal, perquè ha realitzat la seva funció (imprimir un missatge) i ha acabat la seva feina (exited).

Si el volem eliminar del tot perquè no ocupi espai de disc, podem fer (amb les 3 primeres xifres del ID n'hi ha prou, i també funciona amb el nom):

$ docker rm <docker_id_o_nom>

Ara, al fer docker ps -a ja no ens sortirà.


Accedint al contenidor per xarxa interna

Intentarem veure si el httpd sí que està actiu. Per començar, mirarem quina és la seva adreça IP interna:

$ docker inspect <id_o_nom> | grep -i ipadd
          "SecondaryIPAddresses": null,
          "IPAddress": "172.17.0.2",
                  "IPAddress": "172.17.0.2",

Ara podem intentar contactar-lo i veure si ens mostra una web (httpd és l'Apache):

$ curl 172.17.0.2
<html><body><h1>It works!</h1></body></html>

Veiem que sí que funciona i hi podem accedir i veure el contingut. El problema és que només es pot accedir per la màquina host del Docker Daemon.


Publicar ports

Per publicar un port ho hem de fer en el moment de creació del contenidor. Ara crearem un docker nou amb les següents característiques:

  • Nom personalitzat «amadeus».
  • En mode daemon perquè no ens bloquegi la shell.
  • Publicant el port 80 (http) sobre el port 8000 de la màquina host.
$ docker run --name amadeus -d -p 8000:80 httpd

Com abans, podríem accedir a la web per la IP interna, però el què ens interessa és que aquest port es publiqui a la màquina host i que sigui abastable externament. Així, podem accedir amb:

$ curl localhost:8000

Per accedir amb el navegador, primer caldrà que coneixem la IP de la VM, fent

$ ip add | grep inet

I ara podem accedir via browser

http://<ip_de_la_vm>:8000


Entrar a un contenidor

Per accedir dins un contenidor podem executar una shell. Cal distingir entre les opcions:

  • docker run : posa en marxa un nou contenidor
  • docker exec : executa una instrucció en un contenidor existent

Pel nostre cas, farem (-ti és per emular un terminal i enganxar-nos):

$ docker exec -ti amadeus bash

Podem comprovar quina distribució base de Linux fa servir, fent:

$ cat /etc/os-release 

Exercici 1

Entra al contenidor amadeus, modifica el contingut del HTML (index.html), i comprova que a la web es veuen els canvis.


Esborrar tots els containers aturats

Molt sovint cal fer neteja de tots els container aturats. Es pot fer de diverses maneres, però la més còmoda és:

$ docker rm $(docker ps -aq)

La flag -a ens mostra tots els contenidors i -q ens treu només els seus IDs.

Els containers en estat running no es poden matar, ja que primer cal que estiguin aturats.


Connectant als serveis del contenidor

Mirarem ara de connectar a un docker de MariaDB a través d'un client estàndard (no mitjançant eines de Docker).

Exercici 2

  • Llegeix la documentació del Docker oficial de MariaDB al Docker Hub:
  • Posa en marxa un Docker de MariaDB que sigui accessible des de tot arreu.
    • Al publicar el port, si poses -p 127.0.0.1:3306 serà accessible només des de localhost, pel que cal eliminar la IP o posar 0.0.0.0 perquè tingui accés universal.
  • Instal·la el client de MariaDB a la màquina host i connecta't via CLI.
  • Crea una BD i una taula a dins amb algun registre.
  • Surt del CLI de Mariadb.
  • Para el docker (stop). Comprova que ara no hi pots accedir.
  • Posa en marxa (start) el docker de nou.
  • Connecta't i comprova que tornes a connectar-te i que les dades hi són.
  • Destrueix el contenidor (docker stop + docker rm o bé docker rm -f)
  • Torna'l a crear i comprova que la BD ja no existeix.

Com podrem comprovar, els continguts del Docker son efímers, al destruir el contenidor, també es destrueix el seu espai de disc dur.


Volumes

Els docker volumes ens permeten persistir el contingut que d'altra manera seria efímer.

Tenim 2 maneres de persistir l'espai de disc dur:

  • Bind mounts: triem l'espai del filesystem on volem guardar les dades.
  • Volumes: etiquetem el volum que volem utilitzar i el deixem que Docker el guardi al seu espai privat (normalment /var/lib/docker/volumes).

Per exemple, per persistir la BD de dades mitjançant un bind mount ho farem mitjançant -v /path/to/data:/docker/path:

$ docker run --name maria1 -v ~/mysql1:/var/lib/mysql -e MARIADB_ROOT_PASSWORD=my-secret-pw -d mariadb

Si enlloc d'un bind mount volem un volume, ho farem canviant -v amb una simple etiqueta (en aquest cas, mysql2):

$ docker run --name maria2 -v mysql2:/var/lib/mysql -e MARIADB_ROOT_PASSWORD=my-secret-pw -d mariadb

Comprova que el nou volum s'ha creat fent:

$ sudo ls -la /var/lib/docker/volumes

Exercici 3

Comprova la persistència dels volums repetint l'exercici 2 i veient que al recrear el Docker les dades (DB) es mantenen.


Xarxes Docker

El més habitual és fer compartiments estancs amb xarxes BRIDGE.

Quan creem una xarxa bridge, les màquines en aquesta es veuen entre sí i es reconeixen per nom, no només per la IP. Docker Engine els fa de DNS.

La xarxa default és una excepció: les màquines es veuen entre sí, però no tenen «autodiscover» per nom. Per a fer que es coneguin les màquines per nom a la xarxa default podem utilitzar el flag –link, que està obsolet però que encara té aquesta utilitat.

$ docker network create net1
$ docker run --name www1 --net net1 -d httpd

Exercici 4.1

  • Crea 2 màquines a la xarxa default (sense fer –net) i comprova:
    • Es poden fer ping per IP? i per nom?
  • Crea 2 màquines mes a la mateixa xarxa default, però amb –link a les altres màquines anteriors.
    • Poden fer ping per nom?
    • A totes les màquines o només a algunes?

Exercici 4.2

  • Crea 2 xarxes i 3 contenidors dins de cadascuna d'elles.
  • Comprova que es poden fer ping per nom entre les màquines d'una mateixa xarxa.
  • Comprova que no es poden fer ping amb les de l'altra xarxa (ni per nom, ni per IP).
  • Quins rangs d'IP tenen les màquines que has creat?


docker.txt · Darrera modificació: 2022/01/17 09:14 per enrique_mieza_sanchez