Docker al mòdul DAM-M02

De wikijoan
Salta a la navegació Salta a la cerca

Referències

Instal·lació de Docker

Docker (container engine) logo.png

Instal·lació a Linux

$ sudo apt-get update

$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88

$ lsb_release -cs
ulyana (o bé bionic,...) 

ulyana a Linux Mint és l'equivalent a focal a Debian

o bé:

Ens descarreguem aquests fitxers: (o els que correspongui segons la teva versió de Linux)

containerd.io_1.4.9-1_amd64.deb  
docker-ce-cli_19.03.10~3-0~ubuntu-focal_amd64.deb 
docker-ce_19.03.10~3-0~ubuntu-focal_amd64.deb

i ara instal·lem aquests paquets:

$ sudo dpkg -i *.deb

I ara ja podem arrencar un docker:

$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:37a0b92b08d4919615c3ee023f7ddb068d12b8387475d64c622ac30f45c29c51
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Per tal de poder utilitzar docker sense sudo (seguidament hem de tancar i tornar a obrir la sessió de Linux):

$ sudo groupadd docker (ja existeix)
$ sudo usermod -aG docker $USER

En el cas dels alumnes de l'aula 43, instal·lem el docker amb la sessió de super, i en aquesta sessió fem:

$ sudo usermod -aG docker alu-01

per tal de què els alumnes puguin treballar amb normalitat en la seva sessió.

Instal·lació a Windows 10

Instal·lo el Docker Desktop 3.5.2 o la versió més nova disponible.

Hem de reiniciar l'ordinador. Arrenco el Docker Desktop, i protesta perquè la instal·lació de WSL2 és incompleta. Seguir les instruccions. Senzillament es tracta d'instal·lar el paquet d'actualització wsl_update_x64.msi

The Windows Subsystem for Linux (WSL) is a way to run a full Linux environment on your Windows machine, without having to install a "heavier" virtual machine, such as Virtual Box, VM Ware, or Hyper-V. WSL 2 also provides a mechanism for running Docker (with Linux containers) on your Windows machine. We'll install it as a prerequisite for Docker Desktop for Windows

A Windows normalment farem servir el Windows Desktop. Però també tenim la possibilitat d'utilitzar tota la funcionalitat de Docker a la consola, per exemple, per descarregar un contenidor del núvol, per arrencar i executar un contenidor, etc.

Docker del mòdul: mysql_m02bd v5

Descàrrega de dockerhub

El docker (contenidor) que farem servir a l'assigntura està documentat a:

Concretament és la versió 5:

En aquesta versió 5 es pot entrar directament amb l'usuari alumne (password: keil2Lai), i tenim 10 bases de dades per treballar a classe:

  • HR
  • municipis
  • langtrainer
  • empresa
  • sakila
  • northwind
  • mysqlsampledatabase
  • categories_bikeshop
  • vestuari
  • englishresources

El docker que farem servir està pujat al núvol (dockerhub), i s'anomena joanillo/mysql_m02bd:5.0.

Així doncs, després d'instal·lar el Docker a la teva màquia (Linux o Windows o Mac), hem de baixar el contenidor del dockerhub:

$ docker pull joanillo/mysql_m02bd:5.0
a21d4bfd3284: Pull complete 
Digest: sha256:2b48d332cece8ba8d2e256537427c3d26d18c28dc6732913032a57d5df9bde03
Status: Downloaded newer image for joanillo/mysql_m02bd:5.0
docker.io/joanillo/mysql_m02bd:5.0

Engego aquest contenidor i l'executo

$ docker run --name=mysql_m02bd -d joanillo/mysql_m02bd:5.0
267f094d20f3142ab89484a1919e1193fffbd2e53882ded31f80031005336707

NOTA IMPORTANT USUARIS WINDOWS: usuaris de Windows que es voldran connectar amb el mysql-workbench, s'ha de fer:

$ docker run --name=mysql_m02bd -d -p 127.0.0.1:3306:3306 joanillo/mysql_m02bd:5.0
267f094d20f3142ab89484a1919e1193fffbd2e53882ded31f80031005336707

El contenidor està arrencat:

$ docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                             PORTS                       NAMES
e593408e5541        joan/mysql_m02bd:5.0   "/entrypoint_v5.sh m…"   14 seconds ago      Up 13 seconds (health: starting)   3306/tcp, 33060-33061/tcp   mysql_m02bd

Per mirar els logs (NOTA: és important anar executant aquesta comanda, i en algunes màquines el procés de càrrega dels scripts pot ser lent. Esperar fins que surti el missatge 'Acaba privilegis.sql):

$ docker logs mysql_m02bd

...
[Entrypoint] GENERATED ROOT PASSWORD: V59Sj1R6^?2cd:p?XLH+,RbRm?O5/51O
després del generated root password
comencen els scripts
[BD] Comença HR.sql:
[BD] Acaba HR.sql. Comença municipis_v2122.sql:
[BD] Acaba municipis_v2122.sql. Comença langtrainer_211018.sql:
[BD] Acaba langtrainer_211018.sql. Comença empresa.sql:
[BD] Acaba empresa.sql. Comença sakila-schema.sql:
[BD] Acaba sakila-schema.sql. Comença sakila-data.sql:
[BD] Acaba sakila-data.sql. Comença northwind-default-current-timestamp.sql:
[BD] Acaba northwind-default-current-timestamp.sql. Comença northwind-data.sql:
[BD] Acaba northwind-data.sql. Comença mysqlsampledatabase.sql:
[BD] Acaba mysqlsampledatabase.sql. Comença categories_bikeshop.sql:
[BD] Acaba categories_bikeshop.sql. Comença vestuari.sql:
[BD] Acaba vestuari.sql. Comença englishresources.sql:
[BD] Acaba englishresources.sql. Comença privilegis.sql:
[BD] Acaba privilegis.sql:
acaben els scripts
...
2021-11-15T17:05:34.128903Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2021-11-15T17:05:34.129065Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.27'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server - GPL.

Recordar! No puc entrar amb l'usuari alumne fins que no em surti ready for connections (abans s'estan executant els scripts, i els privilegis de l'usuari alumne no es fan fins al final)

$ docker exec -it mysql_m02bd mysql -u alumne -pkeiL2lai
mysql>

I ara ja sóc dins i ja puc iniciar una sessió. Per a Windows el procés és el mateix, però també puc utilitzar la interfície gràfica que se'ns proporciona.

També és interessant mirar els recursos de la màquina local que consumeix el contenidor:

$ docker stats

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
71551cd939f6        mysql_m02bd         0.41%               367.3MiB / 7.304GiB   4.91%               12.5kB / 0B         12.1MB / 441MB      39

NOTA: després de fer el run, la primera vegada, segur que el contenidor està arrencat. Però si apagues la màquina i tornes a engegar-la, el docker està aturat. NO cal tornar a fer el run (això només es fa la primera vegada). Només cal fer el start:

$ docker start mysql_m02bd

Aturar i arrencar els contenidors

La comanda docker run crea un nou contenidor i executa la comanda que s'executa en el Dockerfile, CMD, o ENTRYPOINT. Un cop arrencat el contenidor ja s'ha creat i no l'haurem de tornar a crear.

Un cop el tenim arrencat, el que podem fer en tot cas és aturar-lo i tornar-lo a engegar, amb stop i start. Amb docker ps podem veure els contenidors arrencats, i amb docker ps -a podem veure tots els contenidors, estiguin arrencats o no. Per tant, si ens trobem un contenidor aturat, el que hem de fer és tornar-lo a arrencar amb start (no hem de tornar a fer run).

$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                    PORTS                       NAMES
b3f2a93ca018        joanillo/mysql_m02bd:5.0   "/entrypoint_v5.sh m…"   3 hours ago         Up 13 minutes (healthy)   3306/tcp, 33060-33061/tcp   mysql_m02bd

$ docker stop mysql_m02bd (o bé el container id)

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                      PORTS               NAMES
b3f2a93ca018        joanillo/mysql_m02bd:5.0   "/entrypoint_v5.sh m…"   3 hours ago         Exited (0) 15 seconds ago                       mysql_m02bd

$ docker start mysql_m02bd (o bé el container id)

Sessió a la consola de mysql

$ docker exec -it mysql_m02bd mysql -u alumne -pkeiL2lai

mysql> show databases

He de comprovar que tinc les 10 bases de dades.

mysql> use HR; -> per utilitzar la base de dades HR
mysql> show tables; -> per veure les taules de la base de dades HR
mysql> desc employees; -> per veure els camps de la taula employees;
mysql> select * from employees; -> ja podem fer consultes i comandes SQL

Si vull entrar directament a una base de dades podem fer:

$ docker exec -it mysql_m02bd mysql -u alumne -pkeiL2lai municipis
o bé
$ docker exec -it mysql_m02bd mysql -u alumne -pkeiL2lai -D municipis

NOTA: el que no podem fer és:

$ docker exec -it mysql_m02bd mysql -u alumne -p keiL2lai municipis <- NO és correcte!

No pot haver-hi un espai en blanc entre la p i el password (doncs es pensaria que hi ha la base de dades anomenada keiL2lai)

NOTA: també existeix el paràmetre -P (majúscula): port, que és el port TCP de connexió del mysql, que per defecte és el 3306:

$ docker exec -it mysql_m02bd mysql -h localhost -P 3306 -u alumne -pkeiL2lai municipis

També hem utilitzat -h localhost per indicar que el servidor mysql s'està executant en la màquina local (ja veiem que per defecte és opcional). En resum, hi ha molts paràmetres que els anirem veient poc a poc (i no cal veure'ls tots). Pots provar-ho fent:

Sessió a la consola de Linux, i entrar al mysql com a root

En el nostre docker podem entrar directament a la consola:

$ docker exec -it mysql_m02bd /bin/bash
#

Estem en una sessió de Linux.

Recordem que el SGBD MySQL té una arquitectura client-servidor. D'una banda tenim el servidor, el dimoni (mysql-server), i d'altra banda tenim clients que es poden connectar al servidor. Concretament, quan escrivim mysql en la consola, ens estem referint al client de mysql de la consola (és a dir, l'aplicatiu bàsic de consola que fem servir per connectar-nos a un servidor). Per veure totes les opcions:

# man mysql

Aquí podem veure les opcions que ja hem fet servir, i moltes més (en farem servir algunes més quan calgui).

I des de la consola podem entrar al mysql, similar a com hem fet abans:

# mysql -u alumne -pkeiL2lai municipis
mysql> select count(*) from municipis;
mysql> exit
#

Fins ara hem entrat al mysql amb l'usuari alumne, que té permisos sobre les 10 bases de treball que farem servir.

També podem entrar amb l'usuari root, però el primer que s'haurà de fer és saber quin és el password actual, i l'haurem de canviar.

Entrar com a root

Per saber el password del root (tant per Linux com per Windows, no hi ha cap diferència):

El password del root es va generar quan vam fer el run del docker, i el pots recuerar sempre que vulguis:

$ docker logs mysql_m02bd 2>&1 | grep GENERATED
[Entrypoint] GENERATED ROOT PASSWORD: zuE#2PK;/5c^1Of94.nIqo6%%CMk_8T8

Per a Windows:

$ docker logs mysql_m02bd 2>&1 | find "GENERATED"
[Entrypoint] GENERATED ROOT PASSWORD: zuE#2PK;/5c^1Of94.nIqo6%%CMk_8T8

I ara que ja sabem el password del root, hem d'entrar a dins del mysql i canviar el password:

$ docker exec -it mysql_m02bd mysql -uroot -p

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '*****';
mysql> exit

Tornem a entrar, directament al mysql, com a root, amb el nou password:

$ docker exec -it mysql_m02bd mysql -uroot -p*****
mysql>

Sessió des de la consola de la meva màquina local

Podem saber quina és la IP que exposa el docker en la meva màquina local:

$ docker ps
CONTAINER ID        IMAGE                
242534ba574d        joan/mysql_m02bd:5.0

$ docker inspect mysql_m02bd
...
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
...

I aleshores:

$ mysql -h 172.17.0.2 -u alumne -pkeiL2lai municipis

L'únic requisit és que el docker estigui en funcionament (run), que es pot comprovar amb:

$ docker ps
CONTAINER ID        IMAGE                
242534ba574d        joan/mysql_m02bd:5.0

Sessió amb mysql-workbench

Instal·lació mysql-workbench-community a Linux

Provat a Linux Mint (juliol 2021)

(prèviament hem d'instal·lar snap)

Queda ben instal·lat, però no puc connectar-me a la bd. Per solucionar-ho:

$ snap connect mysql-workbench-community:password-manager-service
$ snap connect mysql-workbench-community:ssh-keys

$ mysql-workbench-community

Ja funciona

Instal·lació mysql-workbench a Windows

Descarrego:

  • mysql-workbench-community-8.0.27-winx64.exe

Necessita Visual C++ 2019 Redistributable package Descarrego i instal·lo:

  • VC_redist.x64.exe

I llavors ja queda ben instal·lat

Configuració mysql-workbench per connectar-se al docker

NOTA: compte, a Windows hem arrencat el docker una mica diferent:

Linux:

Workbench docker HR.png

Necessitem saber quina és la IP que exposa el docker a la nostra màquina local.

$ docker ps
CONTAINER ID        IMAGE                
242534ba574d        joan/mysql_m02bd:5.0

$ docker inspect mysql_m02bd
...
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
...

Configuració per connectar-se a la base de dades de municipis:

hostname: 172.17.0.2
Port: 3306
username: alumne
password: keiL2lai
default schema: municipis

Funciona correctament.

Per configurar el TablePlus es fa de forma similar. L'avantatge del TablePlus és que és per connectar-se al PostgeSQL i altres bases de dades (a part del MySQL).

Windows:

Com que hem arrencat el docker amb la comanda:

$ docker run --name=mysql_m02bd -d -p 127.0.0.1:3306:3306 joanillo/mysql_m02bd:5.0
267f094d20f3142ab89484a1919e1193fffbd2e53882ded31f80031005336707

Les dades per configurar correctament la connexió amb el mysql-workbench són:

hostname: 127.0.0.1
Port: 3306
username: alumne
password: keiL2lai
default schema: municipis

No cal fer res més (no cal tocar el firewall de windows), hauria de funcionar correctament.

Docker del phpMyAdmin

PhpMyAdmin docker.png

Official phpMyAdmin Docker image:

$ docker pull phpmyadmin/phpmyadmin:latest
69692152171a: Pull complete 
9b4ca5ae9dfa: Extracting  69.07MB/76.68MB
...
Status: Downloaded newer image for phpmyadmin/phpmyadmin:latest
docker.io/phpmyadmin/phpmyadmin:latest

Arrenquem el contenidor, tenim vàries possibilitats

Usage with linked server

Els enllaços (links) permeten que els contenidors es descobreixin entre ells i transfereixin de manera segura informació d'un contenidor a un altre contenidor.

Tenim un docker del mysql amb les bases de dades, i un altre docker amb el phpMyAdmin. Per tant, han d'estar els dos contenidors arrencats:

First you need to run a MySQL or MariaDB server in Docker, and the phpMyAdmin image needs to be linked to the running database container:

$ docker run --name=mysql_m02bd -d joanillo/mysql_m02bd:5.0
$ docker run --name myadmin -d --link mysql_m02bd:db -p 8080:80 phpmyadmin/phpmyadmin

I ja funciona:

I ara ja puc entrar (alumne/keiL2lai), i puc veure les 10 bases de dades que tinc.

Tenim els dos dockers arrencats:

$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                   PORTS                       NAMES
ba9c1e635708        phpmyadmin/phpmyadmin      "/docker-entrypoint.…"   2 minutes ago       Up 2 minutes             0.0.0.0:8080->80/tcp        myadmin
a679fe06f4f9        joanillo/mysql_m02bd:5.0   "/entrypoint_v5.sh m…"   3 minutes ago       Up 3 minutes (healthy)   3306/tcp, 33060-33061/tcp   mysql_m02bd

Consum de memòria i CPU:

$ docker stats

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
ba9c1e635708        myadmin             0.01%               35.82MiB / 7.304GiB   0.48%               173kB / 240kB       4.44MB / 283kB      11
a679fe06f4f9        mysql_m02bd         0.42%               376MiB / 7.304GiB     5.03%               55.5kB / 64.5kB     20.2MB / 441MB      40

creat per Joan Quintana Compte, novembre 2021