bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


docker_nodejs

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
docker_nodejs [2023/07/03 09:34]
montserrat_castellarnau [Mini projecte nodejs dockeritzat]
docker_nodejs [2023/07/03 10:58] (actual)
montserrat_castellarnau [Dockeritzar la Base de Dades PostgreSQL (docker_compose.yml)]
Línia 11: Línia 11:
 \\ \\
  
-===== Creació Bases de Dades i RestApi =====+===== Creació Bases de Dades i RestApi en local =====
 En primer lloc en el PostgreSQL, amb el PgAdmin o un altre editor com per exemple DBeaver [[https://dbeaver.io/]], creem una base de dades, en aquest exemple li he dit "docker" amb una taula "pacients" i alguns registres: En primer lloc en el PostgreSQL, amb el PgAdmin o un altre editor com per exemple DBeaver [[https://dbeaver.io/]], creem una base de dades, en aquest exemple li he dit "docker" amb una taula "pacients" i alguns registres:
 {{:wiki:taulapacients.png?nolink&200|}} {{:wiki:taulapacients.png?nolink&200|}}
Línia 76: Línia 76:
 Ara en qualsevol navegador podem consultar les dades de la taula pacients: Ara en qualsevol navegador podem consultar les dades de la taula pacients:
   http://localhost:3000/pacients   http://localhost:3000/pacients
-===== Exercici Dockerfile =====+{{:resultatpacients.png?nolink&200|}} 
 +===== Dockeritzar la RestApi =====
 <WRAP todo> <WRAP todo>
 A partir de la base de dades de PostreSQL i la restapi creada amb nodejs, que amb la ruta /pacients ens mostra tots el pacients que tenim en aquesta taula, crear una imatge (Dockerfile) de tal manera que puguem crear un contenidor per tenir la RestApi funcionant. A partir de la base de dades de PostreSQL i la restapi creada amb nodejs, que amb la ruta /pacients ens mostra tots el pacients que tenim en aquesta taula, crear una imatge (Dockerfile) de tal manera que puguem crear un contenidor per tenir la RestApi funcionant.
 </WRAP> </WRAP>
  
 +En la mateixa carpeta "exercici" creem el fitxer Dockerfile
  
 <file Dockerfile Dockerfile> <file Dockerfile Dockerfile>
Línia 91: Línia 93:
 CMD [ "npm", "start" ] CMD [ "npm", "start" ]
 </file> </file>
 +<WRAP important>
 +Si primer creem el contenidor sense el -d, podrem veure que dona el següent error:
 +   * “Error: connect ECONNREFUSED 127.0.0.1:5432” 
 +El motiu és que si la Api està dins d’un contenidor i accedeix a la bases de dades que hi ha a l'ordinador host, no podem posar localhost, que correspondria a la ip del contenidor on tinc l’api, cal posar la ip del host (del pc on hi ha el docker)
 +{{:wiki:modificacioip.png?nolink&200|}}
 +</WRAP>
 +<WRAP important>
 +Un cop modificada la IP, apareix un altre eror:
 +   * “no hay una línea en pg_hba.conf para 192.168.1.221, usuario postgres”
 +En aquest cas cal afegir, al fitxer pg_hba.conf  la línia, per donar permisos a l'usuari postgres a accedir a aquesta IP:
 +host    all    postgres    192.168.1.221/32    trust
 +</WRAP>
 +Des del terminal, en la carpeta "exercici", construim la imatge:
 +  $ docker build -t imatge_node .
 +I ara podem crear el contenidor:
 +  $ docker run --name contenidor_node -p 3000:3000 -d imatge_node
 +Ara en qualsevol navegador podem consultar les dades de la taula pacients:
 +  http://localhost:3000/pacients
 +===== Dockeritzar la Base de Dades PostgreSQL (docker_compose.yml) =====
 +Dins del mateix directori "exercici", creem un directori sql amb el següent fitxer, que contindrà les instruccions SQL per crear la taula pacients i insertar alguns registres:
 +
 +<file SQL init.sql>
 +CREATE TABLE pacients (
 +    id SERIAL PRIMARY KEY,
 +    nom VARCHAR(50) NOT NULL
 +);
 +
 +INSERT INTO pacients (nom) VALUES
 +    ('Ramon'),
 +    ('Maria'),
 +    ('Isabel'),
 +    ('Laura'),
 +    ('Josep');
 +
 +</file>
 +
 +<WRAP todo>
 +Ara l'exerici consisteix en crear un fitxer docker-compose.yml, que ens aixequi 3 contenidors:
 +  * Contenidor1: La RestApi, però ara ha de treballar amb la BBDD del Continidor2
 +  * Contenidor2: la Base de dades PostgreSQL amb la taula creada i les dades
 +  * Contenidor3: L'eina PgAdmin per comprovar que hi ha la BBDD i la taula. I també podrem fer un Insert.
 +</WRAP>
 +<file docker-compose docker-compose.yml>
 +version: '3'
 +services:
 +  server:
 +    build: 
 +      context: .
 +      dockerfile: Dockerfile
 +    ports:
 +      - "3000:3000"
 +    environment:
 +      NODE_ENV: production
 +      PG_HOST: db
 +      PG_PORT: 5432
 +      PG_DATABASE: appdb
 +      PG_USER: appuser
 +      PG_PASSWORD: password
 +    depends_on:
 +      - db
 +  db:
 +    image: postgres
 +    container_name: postgresdb
 +    ports:
 +      - "5432:5432"
 +    environment:
 +      POSTGRES_DB: appdb
 +      POSTGRES_USER: appuser
 +      POSTGRES_PASSWORD: password
 +    volumes:
 +      - dades:/var/lib/postgresql/data
 +      - ./sql:/docker-entrypoint-initdb.d
 +  pgadmin:
 +    image: dpage/pgadmin4
 +    container_name: pgadmin4_container
 +    restart: always
 +    ports:
 +      - "5050:80"
 +    environment:
 +      PGADMIN_DEFAULT_EMAIL: [email protected]
 +      PGADMIN_DEFAULT_PASSWORD: admin
 +    volumes:
 +      - pgadmin-data:/var/lib/pgadmin
 +volumes:
 +  dades:
 +
 +</file>
 +<WRAP important>
 +Ara cal modificar el fitxer index.controllers.js de l'Api, per tal que apunti a la base de dades del contenidor corresponent:
 +const pool = new Pool({
 +    user: 'appuser',
 +    host: 'db',
 +    password: 'password',
 +    database: 'appdb',
 +    port: '5432'
 +});
 +</WRAP>
 +Ara ja podem aixecar els contenidors:
 +  $ docker-compose up -d
 +Ara en qualsevol navegador podem consultar les dades de la taula pacients i veurem que se'ns mostren les que hem posat en el nostre script SQL:
 +  http://localhost:3000/pacients
 +Ara ens connectarem al contenidor3, PgAdmin i farem l'insert d'un nou registre:
 +
 +{{:wiki:pgadmin.png?nolink&200|}}
 +
 +Ens loguegem amb les credencial que hem posat en el docker-compose en el Contenidor3.
 +Ara necessitem saber la IP del contenidor2, on hi ha la BBDD. Per saber el nom ho podem consulta al Docker Descktop o bé fent docker ps i veure els contenidors que hi ha ara executant-se:
 +
 +{{:wiki:dockerdescktop.png?nolink&200|}}
 +
 +A continuació, posem al terminal:
 +  $ docker inspect postgresdb
 +I la ip en aquest cas és: "IPAddress": "172.22.0.3"
 +En el PgAdmin del navegador, ens connectem a la nostra BBDD, el contenidor2:\\
 +
 +{{:wiki:servidorpostgres.png?nolink&200|}}
 +
 +I efectivament, podem comprovar com hi tenim la BBDD appdb, amb la taula pacients i els registres:
 +
 +{{:wiki:taula.png?nolink&200|}}
 +
 +Si inserim un altre registre a la taula pacients:
 +  INSERT INTO pacients (nom) VALUES ('David')
 +Si tornem al navegador, podem veure que ja se'ns mostra:
 +
 +{{:wiki:afegirregistre.png?nolink&200|}}
 +
 +A més a més, el contenidor2 de la BBDD, s'ha creat amb persistència, és a dir tenim les dades lligades a un volum de docker (dades). Si ho mirem en el docker Desktop, podem observar que li posa el nom de la carpeta, més el nom "dades":
 +
 +{{:wiki:volums.png?nolink&200|}}
 +
 +Amb això, si se'ns para o cau aquest contenidor en podem aixecar un altre lligat a aquest volum i continuarem tenin la BBDD.
 +
docker_nodejs.1688376865.txt.gz · Darrera modificació: 2023/07/03 09:34 per montserrat_castellarnau