> For the complete documentation index, see [llms.txt](https://educacion.gitbook.io/programacion/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://educacion.gitbook.io/programacion/ud8-persistencia-en-bases-de-datos/anexo-dockers.md).

# Anexo: Dockers

<img src="https://educacion.gitbook.io/ficheros/~gitbook/image?url=https%3A%2F%2F885264038-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FuYOXey29R05ZZBQOEwju%252Fuploads%252Fgit-blob-6411560e13900b97f7e531a0ff4f1124e15c4d42%252Fimage%2520%282%29%2520%281%29.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=a0d3464b&#x26;sv=2" alt="" height="331" width="742">

Docker é unha **plataforma de contedorización** que permite crear, despregar e executar aplicacións en contedores. Pensa nos contedores como "paquetes lixeiros" que inclúen todo o necesario para que unha aplicación funcione: código, bibliotecas, dependencias e configuracións.

A **diferencia fundamental entre un docker e unha maquina virtual**, é que con un docker so virtualizas as aplicacións ou servizos que vas utilizar, mentres que nunha máquina virtual tes que virtualizar o equipo completo. Unha analoxía sería alugar unha casa completa con tres habitacions, cando nos unicamente necesitamos unha.

### Instalación <a href="#instalacion" id="instalacion"></a>

O primerio paso e realizar a instalación de Docker Desktop no ordenador. E posible descargalo e instalalo no teu ordenador desde o seguinte enlace:

{% embed url="<https://www.docker.com/products/docker-desktop/>" %}

A opción a elixir será Windows para AMD64.

Durante o proceso de instalación, asegurade que está habilitada a opción de de **WSL 2 (Windows Subsystem for Linux), xa que é necesario para executar contedores en Windows 11**. Inicia Docker Desktop despois da instalación e verifica que este a correr. Deberías ver o ícono de Docker na barra de tarefas. Se non o esta, abre o cmd e escribe:

```
wsl --update
```

É posible comporobar desde power shell que está instalado empregando o seguinte comenado:

<img src="https://educacion.gitbook.io/ficheros/~gitbook/image?url=https%3A%2F%2F885264038-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FuYOXey29R05ZZBQOEwju%252Fuploads%252Fgit-blob-ee5af7b4fb6c3ad619a7e62f5261d3c61c696365%252Fimage%2520%281%29%2520%281%29%2520%281%29%2520%281%29%2520%281%29%2520%281%29.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=3129392d&#x26;sv=2" alt="" height="109" width="573">

### Ficheiro docker-compose.yml <a href="#ficheiro-docker-compose.yml" id="ficheiro-docker-compose.yml"></a>

Este fichero, para o noso proxecto vai conter a seguinte información:

```yml
version: '3.8'

services:
  mariadb:
    image: mariadb:11
    container_name: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      #testdb
      MYSQL_DATABASE: alumnos
      MYSQL_USER: testuser
      MYSQL_PASSWORD: testpass
    ports:
      - "3306:3306"
    volumes:
      - ./src/main/resources/bd/init.sql:/docker-entrypoint-initdb.d/init.sql

  phpmyadmin:
    image: phpmyadmin:5
    container_name: phpmyadmin
    restart: always
    depends_on:
      - mariadb
    environment:
      PMA_HOST: mariadb
      PMA_USER: root
      PMA_PASSWORD: rootpassword
    ports:
      - "8081:80"

  javaapp:
    build: .
    container_name: javaapp
    depends_on:
      - mariadb
    environment:
      DB_URL: jdbc:mariadb://mariadb:3306/alumnos
      DB_USER: testuser
      DB_PASS: testpass
```

Esta configuración vainos permitir virtualizar contenedores para unha base de datos mariaDB e a aplicación phpAdmin, que nos vai a proporcionar una interface web para consultar a información vía navegador:

* **version**: Define a versión de Docker Compose (3.8 é unha das máis comúns)
* **services**: Configura os tres servizos da aplicación

## Dockerfile

```
FROM maven:3.9.6-eclipse-temurin-21 AS build

WORKDIR /app
COPY pom.xml .
COPY src ./src

RUN mvn clean package -DskipTests

# Etapa de ejecución ligera
FROM eclipse-temurin:21-jdk-alpine
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar

CMD ["java", "-jar", "app.jar"]
```

#### **Servizo MariaDB** <a href="#servizo-mariadb" id="servizo-mariadb"></a>

* **image**: Usa MariaDB versión 11
* **container\_name**: Nome do contedor: mariadb
* **restart: always**: Reiníciase automaticamente en caso de fallo
* **environment**: Configura variables de entorno:
  * **MYSQL\_ROOT\_PASSWORD**: Contrasinal do usuario root
  * **MYSQL\_DATABASE**: Nome da base de datos: alumnos
  * **MYSQL\_USER** e **MYSQL\_PASSWORD**: Usuario adicional con permisos
* **ports**: Mapea o porto 3306 do host ao 3306 do contedor para acceder a MySQL
* **volumes**: Monta un script SQL que se executa automaticamente ao crear o contedor

#### **Servizo PHPMyAdmin** <a href="#servizo-phpmyadmin" id="servizo-phpmyadmin"></a>

* **image**: Usa PHPMyAdmin versión 5
* **container\_name**: Nome do contedor: phpmyadmin
* **restart: always**: Reiníciase automaticamente
* **depends\_on**: Depende de MariaDB, iníciase despois
* **environment**: Configura a conexión a MariaDB
* **ports**: Mapea o porto 8081 do host ao 80 do contedor para acceder á interface web

#### **Servizo JavaApp** <a href="#servizo-javaapp" id="servizo-javaapp"></a>

* **build**: Constrúe a imaxe dende o Dockerfile do directorio actual
* **container\_name**: Nome do contedor: javaapp
* **depends\_on**: Depende de MariaDB
* **environment**: Configura a conexión á base de datos para a aplicación

### Levantar os contenedores <a href="#levantar-os-contenedores" id="levantar-os-contenedores"></a>

Tendo o ficheiro configurado, para levantar os contenedores é necesario facer o seguinte.

1. Abrimos a consola desde IntellIJ e **nos situamos na carpeta do proxecto que conten o ficheiro docker-compose.yaml**

<img src="https://educacion.gitbook.io/ficheros/~gitbook/image?url=https%3A%2F%2F885264038-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FuYOXey29R05ZZBQOEwju%252Fuploads%252Fgit-blob-78bd2ca9693d519668a7b1d1f26f7f6b7775b9be%252Fimage.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=103a6285&#x26;sv=2" alt="" height="670" width="991">

1. Escribimos o seguinte comando:

<a class="button secondary">Copy</a>

```
docker-compose up --build
```

Na primeira execución realizara a descarga de varios paquetes e cargara os contenedores, finalizando con unha saida similar a esta:

<figure><img src="/files/0QczUdUVWfWXf5hOQP6R" alt=""><figcaption></figcaption></figure>

A partir de este momento o servicio de mariaDB e phpAdmin deberian de estar dispoñibles en localhost:8081:

<figure><img src="/files/zuavgUaTcHP5gVLZvoZa" alt=""><figcaption></figcaption></figure>

### Detención e finalización do contenedor <a href="#detencion-e-finalizacion-do-contenedor" id="detencion-e-finalizacion-do-contenedor"></a>

No momento que queiras deter e eliminar os conedores, basta con escribir o seguinte comando na terminal, na carpeta na que se atopa o ficheiro:

```
docker-compose down -v  
```

<figure><img src="/files/02tBROLuUSshWBPXjtGy" alt=""><figcaption></figcaption></figure>

### Consulta de estado do contenedor <a href="#consulta-de-estado-do-contenedor" id="consulta-de-estado-do-contenedor"></a>

Podes consultar que contenedores estan correndo na máquina na actualidade:

```
docker-compose ps 
```

<figure><img src="/files/16F1vtxxLqla5x7UJszL" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://educacion.gitbook.io/programacion/ud8-persistencia-en-bases-de-datos/anexo-dockers.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
