Docker a DAM-M02

De wikijoan
Salta a la navegació Salta a la cerca

Introducció

Es tracta de treballar amb mysql (o Postgres) sense que els alumnes ho hagin d'instal·lar en les seves màquines locals. I sense haver d'utilitzar màquines virtuals. S'ha de buscar la manera més ràpida, flexible i lleugera per tal de què els alumnes puguin començar a treballar i practicar sentències SQL.

Creiem que avui dia una de les maneres d'aconseguir-ho és amb contenidors.

Introducció. Què és Docker?

  • Cas d'us: curs GDS
  • Cas d'us: M02-Bases de dades

Instal·lació de Docker

Creem la carpeta dockerfiles/

Instal·lació a Linux

$ sudo ap-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

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

Ens descarreguem aquests fitxers:

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 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:

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

Instal·lació a Windows

(TBD)

Docker de DAM-M02

v0. servidor de mysql

(TBD)

v1. MySQL i base de dades de municipis

Ara que ja tenim un mysql funcionant, es tracta de configurar mitjançant un fitxer de configuració (Dockerfile) per tal de complir una sèrie de requeriments.

  • Dockerfile_v1

Mirar per dins aquest fitxer. Bàsicament el que fa és copiar el fitxer de municipis.sql a dins del docker:

...
COPY ./bd/municipis/municipis_v2122.sql /etc/municipis_v2122.sql

Per tal de què funcioni, és necessari descarregar-nos aquests fitxers localment:

$ wget https://raw.githubusercontent.com/mysql/mysql-docker/mysql-server/8.0/docker-entrypoint.sh
$ wget https://raw.githubusercontent.com/mysql/mysql-docker/mysql-server/8.0/healthcheck.sh

$ sudo chmod a+x *.sh

I ara ja puc fer el build del meu docker a partir del meu fitxer de congiguració:

$ docker build -t joan/mysql_municipis:1.0 -f ./Dockerfile_v1 .

$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
joan/mysql_municipis   1.0                 ea563a3aa7aa        14 seconds ago      406MB
oraclelinux            7-slim              078d6e3ae75e        8 days ago          132MB

I ara arrenco el docker:

$ docker run --name=mysql_municipis -d joan/mysql_municipis:1.0
408777e6187f048cdc5c640dfdf7f0c4da0809a04c49acda7fb4374b27a98c31

$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                             PORTS                       NAMES
408777e6187f        joan/mysql_municipis:1.0   "/entrypoint.sh mysq…"   18 seconds ago      Up 18 seconds (health: starting)   3306/tcp, 33060-33061/tcp   mysql_municipis

(el docker ja està funcionant)

el password: abans de fer el exec, he de posar el password:

$ docker logs mysql_municipis 2>&1 | grep GENERATED
[Entrypoint] GENERATED ROOT PASSWORD: -oM5Eb!YkEP#ONagyKr0Kk4cx3f

Ja puc arrencar una instància, i el primer que fem és entrar com a root per a canviar-li el password, i crear la base de dades de municipis i crear l'usuari alumne amb permisos sobre la base de dades de municipis (la creació de l'usuari es fa dins del script sql).

$ docker exec -it mysql_municipis mysql -uroot -p

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '******';
mysql> \! ls /etc/municipis_v2122.sql
/etc/municipis_v2122.sql

mysql> \. /etc/municipis_v2122.sql
mysql> use municipis
mysql> select count(*) from provincies;
mysql> exit

Ara ja podem entrar amb l'usuari alumne:

$ docker exec -it mysql_municipis mysql -u alumne -pkeiL2lai municipis

mysql> show tables;
+---------------------+
| Tables_in_municipis |
+---------------------+
| comunitats          |
| municipis           |
| provincies          |
+---------------------+
3 rows in set (0.00 sec)

mysql> select count(*) from provincies;
+----------+
| count(*) |
+----------+
|       52 |
+----------+

v2. MySQL i bases de dades municipis

Dockerfile_v2: En aquest fitxer fem referència a una nova versió del entrypoint: docker-entrypoint_v2.sh:

$ sudo chmod a+x docker-entrypoint_v2.sh

En la línia 123:

...
source /etc/municipis_v2122.sql;
...

de manera que es carrega la base de dades en el moment del build del docker.

$ docker build -t joan/mysql_municipis:2.0 -f ./Dockerfile_v2 .

$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
joan/mysql_municipis   2.0                 e4ab089a696c        16 seconds ago      406MB
joan/mysql_municipis   1.0                 ea563a3aa7aa        31 minutes ago      406MB
oraclelinux            7-slim              078d6e3ae75e        8 days ago          132MB

$ docker run --name=mysql_municipis_v2 -d joan/mysql_municipis:2.0
23fd38e1eb6354663e9b7d65528e1ca78333a81a2e3ef948cece9c619daae4cc

$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                             PORTS                       NAMES
23fd38e1eb63        joan/mysql_municipis:2.0   "/entrypoint_v2.sh m…"   12 seconds ago      Up 11 seconds (health: starting)   3306/tcp, 33060-33061/tcp   mysql_municipis_v2
408777e6187f        joan/mysql_municipis:1.0   "/entrypoint.sh mysq…"   31 minutes ago      Up 31 minutes (healthy)            3306/tcp, 33060-33061/tcp   mysql_municipis

ara ja podem entrar amb l'usuari alumne:

$ docker exec -it mysql_municipis mysql -u alumne -pkeiL2lai municipis

mysql> show tables;
+---------------------+
| Tables_in_municipis |
+---------------------+
| comunitats          |
| municipis           |
| provincies          |
+---------------------+

v3: bases de dades de municipi i empresa

És la mateixa idea, però ara carrego dues bases de dades en comptes d'una sola. Per tant, podré carregar en el meu docker totes les bases de dades que vulgui. Dockerfile_v3:

...
# primer copiem les dades al docker
COPY ./bd/municipis/municipis_v2122.sql /etc/municipis_v2122.sql
COPY ./bd/empresa/empresa.sql /etc/empresa.sql

# modifiquem el entrypoint.sh de manera que fa tota la càrrega de les dades (que inclou crear l'usuari alume amb privilegis sobre la base de dades de municipis)
COPY docker-entrypoint_v3.sh /entrypoint_v3.sh
...

entrypoint_v3.sh: (línia 123)

...
source /etc/municipis_v2122.sql;
source /etc/empresa.sql;
...
$ sudo chmod a+x docker-entrypoint_v3.sh

$ docker build -t joan/mysql_municipis_empresa:3.0 -f ./Dockerfile_v3 .

$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
joan/mysql_municipis_empresa   3.0                 6a054a07d3cc        9 seconds ago       406MB
joan/mysql_municipis   2.0                 e4ab089a696c        16 seconds ago      406MB
joan/mysql_municipis   1.0                 ea563a3aa7aa        31 minutes ago      406MB
oraclelinux            7-slim              078d6e3ae75e        8 days ago          132MB

$ docker run --name=mysql_municipis_empresa_v3 -d joan/mysql_municipis_empresa:3.0
15bbfce19f959f0058c3e7cdac93c57176c1fb4eb33ac6ceacac4b1361a658cb

$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                             PORTS                       NAMES
23459904377c        joan/mysql_municipis_empresa:3.0   "/entrypoint_v3.sh m…"   14 seconds ago      Up 14 seconds (health: starting)   3306/tcp, 33060-33061/tcp   mysql_municipis_v3
23fd38e1eb63        joan/mysql_municipis:2.0   "/entrypoint_v2.sh m…"   12 seconds ago      Up 11 seconds (health: starting)   3306/tcp, 33060-33061/tcp   mysql_municipis_v2
408777e6187f        joan/mysql_municipis:1.0   "/entrypoint.sh mysq…"   31 minutes ago      Up 31 minutes (healthy)            3306/tcp, 33060-33061/tcp   mysql_municipis

ara ja podem entrar amb l'usuari alumne a les bases de dades:

$ docker exec -it mysql_municipis_empresa_v3 mysql -ualumne -pkeiL2lai municipis
$ docker exec -it mysql_municipis_empresa_v3 mysql -ualumne -pkeiL2lai empresa

mysql> show tables;

I ara ja puc posar totes les bases de dades que vulgui

També puc entrar al terminal del meu docker:

$ docker exec -it mysql_municipis_empresa_v3 /bin/bash
bash-4.2#
bash-4.2# mysql -h localhost -u alumne -pkeiL2lai empresa
empresa> 

Pujar el docker que acabo de fer a dockerhub

La idea és penjar al dockerhub els meus dockers, per tal de què els alumnes se'ls puguin descarregar.

Step 1: Login to docker hub account

$ docker login
username: joanillo
password: ********
login succeeded

Step 2: Tag the image to upload

$ docker image ls
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
joan/mysql_municipis_empresa   3.0                 16937d3adcad        2 days ago          406M

$ docker tag 16937d3adcad joanillo/mysql_municipis_empresa:3.0

$ docker image ls
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
joan/mysql_municipis_empresa       3.0                 16937d3adcad        2 days ago          406MB
joanillo/mysql_municipis_empresa   3.0                 16937d3adcad        2 days ago          406MB

És necessari posar el tag de joanillo, igual que el username de dockerhub.

Step 3: Push the image to docker hub

$ docker push joanillo/mysql_municipis_empresa:3.0
The push refers to repository [docker.io/joanillo/mysql_municipis_empresa]
f864a942ede6: Pushed 
e6cca180e516: Pushed 
de3b0f6a6916: Pushed 
51fee74d9317: Pushed 
293c3b00ec06: Pushed 
55bee6be610f: Pushed 
3.0: digest: sha256:b993da7404da5070380c19034cd3daf6331b87212b6526f1ce52e23eaf401aec size: 1573

ara sí que em deixa perquè joanillo és el nom d'usuari correcte a dockerhub.

Linux. Descarregar el docker mysql_municipis_empresa:3.0.Consola

Recordatori per esborrar

Si vull provar un Docker que és meu, primer l'hauré d'esborrar.

Per eliminar el docker:

$ docker ps
CONTAINER ID
15bbfce19f95
$ docker rm -f 15bbfce19f95

Per eliminar la imatge:

$ docker image ls
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
joan/mysql_municipis_empresa_v3   3.0                 6a054a07d3cc        17 minutes ago      406MB

$ docker rmi -f joanillo/mysql_municipis_empresa:3.0
Untagged: joanillo/mysql_municipis_empresa:3.0
Deleted: sha256:6a054a07d3ccbd7c8122cee0d6d04efc0359d465f0c7d344aa82029cecdc1d7f
Deleted: sha256:4452f57ec65993c48646c7b4dec8049fa81b7740d3713e4fc674bd9d22e28626
...
$ docker rmi -f joan/mysql_municipis_empresa:3.0
Untagged: joan/mysql_municipis_empresa:3.0
Deleted: sha256:16937d3adcadfaae2ff9756ef94ecf92992d5a9517a30f335151d76e363ba977
Deleted: sha256:313c70d3e2da1c23f9aa3bc162b0a7506fce036c50c89d809957f0d9e5567087
Deleted: sha256:51336e21278a2a593c6931540cde82a17ab23a67fd1dea60f30f738aa5578667
...

Descàrrega de dockerhub

$ docker pull joanillo/mysql_municipis_empresa:3.0
...
Status: Downloaded newer image for joanillo/mysql_municipis_empresa:3.0

Ja podem arrencar-lo i executar-lo:

$ docker run --name=mysql_municipis_empresa_v3 -d joanillo/mysql_municipis_empresa:3.0
9278b2777d9ce8754f03858bc4f4f2705a8982eebddd9bf4c86daa953646c98c

$ docker ps
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS                            PORTS                       NAMES
9278b2777d9c        joanillo/mysql_municipis_empresa:3.0   "/entrypoint_v3.sh m…"   6 seconds ago       Up 5 seconds (health: starting)   3306/tcp, 33060-33061/tcp   mysql_municipis_empresa_v3

I ara podem executar-lo:

$ docker exec -it mysql_municipis_empresa_v3 mysql -ualumne -pkeiL2lai empresa
<pre>
Funciona correctament el docker que m'he descarregat de dockerhub.

=Windows. Descarregar el docker mysql_municipis_empresa:3.0.Consola=
He de tenir el Docker Desktop arrencat (que s'havia instal·lat prèviament):
<pre>
$ docker pull joanillo/mysql_municipis_empresa:3.0
...
Status: Downloaded newer image for joanillo/mysql_municipis_empresa:3.0

I ara ja m'apareix en el Docker Desktop

Sobre el contenidor, Run, i selecciono CLI (command line interface, que és la consola)

sh-4.2#
sh-4.2# mysql -h localhost -u alumne -pkeiL2lai municipis
mysql> select count(*) from municipis;
8132
mysql> exit
sh-4.2# exit

Funciona correctament en mode consola.

Linux. mysql-workbench

Instal·lació mysql-workbench-community

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

Ja funciona

Execució contra docker

Es tracta d'executar una instal·lació local de mysql-workbench, i que es connecti al mysql que s'executa dins del contenidor. A Linux ha funcionat a la primera (a diferència de Windows). Tinc el docker funcionant:

$ docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS                   PORTS                       NAMES
9b2a5ad05a2c        joan/mysql_municipis_empresa:3.0   "/entrypoint_v3.sh m…"   9 minutes ago       Up 9 minutes (healthy)   3306/tcp, 33060-33061/tcp   mysql_municipis_empresa_v3
$ mysql-workbench-community

Database > connect to database:

hostname: 0.0.0.0
port: 3306
username: alumne
password: keiL2lai
schema: municipis

Important és que la IP que exposa el docker és 0.0.0.0.

Windows. mysql-workbench

(TBD) Descarrego:

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

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

  • VC_redist.x64.exe
Database > Connect to database
hostname: 0.0.0.0
port: 3306
username: alumne
password: keiL2lai
Default Schema: municipis

TODO: altres versions

TODO: Postgres


creat per Joan Quintana Compte, novembre 2021