# 3.1 Portainer. Gestión de contenedores

[![portainer-logo.png](https://libros.catedu.es/uploads/images/gallery/2023-02/scaled-1680-/portainer-logo.png)](https://libros.catedu.es/uploads/images/gallery/2023-02/portainer-logo.png)

Imagen obtenida de https://www.portainer.io/

## Esta herramienta sirve para...

Gestionar los distintos contenedores, imágenes, stacks,... que tengamos en nuestra Raspberry Pi a través de un entorno gráfico en lugar de hacerlo a través del terminal del sistema operativo. Cuenta con una versión BE (Business Edition) y otra CE (Community Edition), usaremos la 2ª.

## Web de proyecto y otros enlaces de interés

Página web oficial: [https://www.portainer.io/](https://www.portainer.io/)

Repositorio de la versión CE en github: [https://github.com/portainer/portainer](https://github.com/portainer/portainer)

Documentación del proyecto: [https://docs.portainer.io/](https://docs.portainer.io/)

## Despliegue

<p class="callout info">Si crees que instalar portainer del modo que a continuación se explica es complicado puedes instalarlo a través del método que explicamos en el [capítulo 3.3 Linux Media Delivery System (LMDS)](https://libros.catedu.es/books/raspberry-pi/page/33-linux-media-delivery-system-lmds-centro-de-descargas "3.3 Linux Media Delivery System (LMDS). Centro de descargas"). No te librará de utilizar la terminal pero quizás te resulte mas amigable.</p>

En la propia documentación podemos encontrar como desplegar Portainer ( [https://docs.portainer.io/start/install-ce/server/docker/linux](https://docs.portainer.io/start/install-ce/server/docker/linux) ). Vamos a recopilar aquí qué hay que hacer y explicar los comandos

```bash
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
```

En la primera línea creamos un volumen llamado portainer\_data

En la segunda línea lanzamos, desplegamos un contenedor:

- -d (--detach): Ejecuta un contenedor en segundo plano.
- -p (--expose): Nos permite indicar qué puerto del contenedor se corresponde con qué puerto de la máquina anfitriona.
- --name: Nos permite establecer el nombre del contenedor.
- --restart: Nos permite establecer qué queremos que ocurra en caso de que el contenedor falle. En este caso establecemos que se reunicie siempre.
- -v (--volume): Nos permite mapear rutas del contenedor con rutas de la máquina anfitriona.
- El último parámetro que aparece en la ruta `portainer/portainer-ce:latest` es la imagen que se va a ejecutar.

<p class="callout warning">Visto y explicado cómo realizar la instalación según indica la documentación oficial, nosotros/as vamos a hacerlo de otro modo.</p>

La forma que hemos visto con anterioridad funciona. Podéis usarla sin ningún problema. Ahora bien, dado que en este curso desconozco el nivel de partida de cada compañero/a que lo cursa voy a optar por utilizar un modo de despliegue semejante para cada servicio y, por ello, voy a hacer uso de docker-compose. Vamos allá:

Para ello accedemos al terminal y escribimos lo siguiente:

```bash
cd $HOME
mkdir portainer
cd portainer
nano docker-compose.yml
```

Dentro del fichero escribimos el siguiente contenido:

```yaml
version: '2'
services:

  portainer:
    container_name: portainer
    image: portainer/portainer-ce
    restart: unless-stopped
    ports:
      - 9000:9000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./volumes/data:/data
```

Para salir del fichero pulsaremos `control + x` y guardaremos los cambios. Posteriormente ponemos en marcha los contenedores con `docker compose up -d` Aparecerá en pantalla algo similar a

[![portainer-deploy.png](https://libros.catedu.es/uploads/images/gallery/2023-07/scaled-1680-/portainer-deploy.png)](https://libros.catedu.es/uploads/images/gallery/2023-07/portainer-deploy.png)

*Elaboración propia*

Si queremos comprobar que el contenedor está en marcha podemos ejecutar `docker ps --all` lo que nos mostrará todos los contenedor que hay en la máquina. Si queremos ver si, concretamente, está disponible el que acabamos de crear podemos ejecutar docker `ps --all | grep portainer`. Obteniendo unos resultados similares a los siguientes:

[![docker-ps-grep-portainer.png](https://libros.catedu.es/uploads/images/gallery/2023-02/scaled-1680-/docker-ps-grep-portainer.png)](https://libros.catedu.es/uploads/images/gallery/2023-02/docker-ps-grep-portainer.png)

*Elaboración propia*

También podemos tratar de acceder a la interface gráfica a través de un navegador web. Para ello accedemos a través del navegador la Raspberry Pi y al servicio Portainer del siguiente modo `http://<IP>:puerto` en mi caso tengo configurada la raspberry Pi con la IP `192.168.0.201` y portainer con el puerto `9000` por lo que escribo `http://192.168.0.201:9000` y así accedo a la interface web de portainer.

[![portainer-index.png](https://libros.catedu.es/uploads/images/gallery/2023-02/scaled-1680-/portainer-index.png)](https://libros.catedu.es/uploads/images/gallery/2023-02/portainer-index.png)

*Elaboración propia*

## Funcionamiento

<p class="callout info">En el resto del curso el despliegue de los distintos servicios lo haré siempre a través de comandos pero debes saber que con esta herramienta puedes hacer lo mismo en un entorno gráfico.</p>

Como ya indicamos en la introducción esta herramienta es una interface web para docker lo cual facilitará enormemente la vida a aquellas personas que no estén acostumbradas a trabajar desde una interface de texto (terminal).

Nada mas acceder veremos una imagen como la que hemos visto un par de párrafos más arriba en ella podemos gestionar los usuarios, entornos, logs, parámetros de configuración... de este primer menú lateral no voy a comentaros nada. Si pinchamos en local veremos una imagen como la siguiente:

[![portainer-local.png](https://libros.catedu.es/uploads/images/gallery/2023-03/scaled-1680-/portainer-local.png)](https://libros.catedu.es/uploads/images/gallery/2023-03/portainer-local.png)

*Elaboración propia*

En la misma os he remarcado 4 zonas:

- zona 1 (verde): Tenemos acceso a los diferentes contenedores, imágenes, redes y volúmenes de nuestro entorno local.
- zona 2 (azul claro): Acceso a las mismas secciones que teníamos antes de entrar en el entorno local.
- zona 3 (rojo): Información del entorno.
- zona 4 (morado): Similar a la zona 1 con algo de información adicional.

Si accedemos a, por ejemplo, `Containers` tendremos un listado de todos los contenedores descargados:

[![portainer-containers.png](https://libros.catedu.es/uploads/images/gallery/2023-03/scaled-1680-/portainer-containers.png)](https://libros.catedu.es/uploads/images/gallery/2023-03/portainer-containers.png)

*Elaboración propia*

Dónde podemos ver si hay contenedores detenidos, fallando, sanos,... también podemos acceder al detalle de cualquiera de ellos y dentro del detalle detenerlo, reiniciarlo, pausarlo, borralo,... ver los logs, acceder al terminar del contenedor,... todo ello sin necesidad de conocer los comandos docker que hay por detrás:

[![portainer-container-details.png](https://libros.catedu.es/uploads/images/gallery/2023-03/scaled-1680-/portainer-container-details.png)](https://libros.catedu.es/uploads/images/gallery/2023-03/portainer-container-details.png)

*Elaboración propia*

[![portainer-container-details-logs.png](https://libros.catedu.es/uploads/images/gallery/2023-03/scaled-1680-/portainer-container-details-logs.png)](https://libros.catedu.es/uploads/images/gallery/2023-03/portainer-container-details-logs.png)

*Elaboración propia*

Es bastante probable que nunca tengáis que recurrir a estas opciones pero si en alguna ocasión las necesitáis no tendréis que buscar que con `docker logs nombre_del_contenedor --follow` podéis hacer lo mismo que haciendo 4 clicks.

Acceder a las secciones de `Images` o `Volumes` nos puede resultar muy útil para de un vistazo ver, respectivamente, que imágenes o volúmenes no están en uso y así borrarlas para que dejen de ocupar espacio en nuestro disco duro.

[![portainer-image.png](https://libros.catedu.es/uploads/images/gallery/2023-03/scaled-1680-/portainer-image.png)](https://libros.catedu.es/uploads/images/gallery/2023-03/portainer-image.png)

*Elaboración propia*

Además, por si fuera poco, nos agrupa los contenedores por stacks de modo que nos facilita ver si los contenedores asociados a un determinado servicio (hay servicios que pueden requerir el funcionamiento de mas de 1 contenedor) están operativos o no.

[![portainer-stacks.png](https://libros.catedu.es/uploads/images/gallery/2023-03/scaled-1680-/portainer-stacks.png)](https://libros.catedu.es/uploads/images/gallery/2023-03/portainer-stacks.png)

*Elaboración propia*

[![portainer-stack-details.png](https://libros.catedu.es/uploads/images/gallery/2023-03/scaled-1680-/portainer-stack-details.png)](https://libros.catedu.es/uploads/images/gallery/2023-03/portainer-stack-details.png)

*Elaboración propia*

Y, ya para terminar pero no por ello menos importante, nos ofrece también la posibilidad de crear contenedores a partir de plantillas de aplicaciones preexistentes. Esta funcionalidad puede permitirnos desplegar servicios en segundos sin conocer ni un solo comando de docker (si bien no es lo deseable):

[![portainer-templates.png](https://libros.catedu.es/uploads/images/gallery/2023-03/scaled-1680-/portainer-templates.png)](https://libros.catedu.es/uploads/images/gallery/2023-03/portainer-templates.png)

*Elaboración propia*

Como nos ocurrirá en servicios posteriores, esta herramienta podría dar por si misma para un curso dedicado. Os presento aquellas cuestiones que me parecen mas relevantes a fin de que seáis capaces de continuar vosotros/as desde este punto de partida.