Portainer es una solución que te va a ayudar con la administración de tu clúster de Docker, Docker Swarm y Kubernetes. En este tutorial, te muestro como desplegarlo en Docker Swarm.

Como comentaba en la bajada de este artículo, Portainer nos va ayudar mucho con la administración de un host o un clúster de Docker o Kubernetes. Nos da una interfaz web que nos permite no solo administrarlo de una manera más amigable, sino también delegar "recursos" para que otras personas puedan desplegar sus contenedores sin necesidad de darle acceso a una terminal.

En este tutorial, te voy a mostrar lo sencillo que es desplegar Portainer en un clúster de Docker Swarm el cual se compone de dos servidores, un Manager y un Worker.

Si estás interesado en saber cómo armar un clúster de Docker Swarm, te dejo este artículo que escribí recientemente:

Llevando a Docker más allá con Docker Swarm
En este artículo, te voy a mostrar cómo crear un cluster de Docker Swarm. Fácil, rápido y efectivo.

Arrancamos

Antes de desplegar, debemos entender la arquitectura de Portainer. Esta solución tiene dos componentes, El Portainer mismo, que es el que tiene la interfaz web y desde donde haremos toda la magia y un agente, que debe instalarse en cada nodo de Docker Swarm que queremos manejar con Portainer, para que esto suceda, por lo general, desplegaremos el agente con el mode: global, para que corra un contenedor con ese agente en cada nodo.

Veamos el contenido del archivo portainer.yml que es que vamos a desplegar para este tutorial:

version: '3.2'

services:
  agent:
    image: portainer/agent
    environment:
      # REQUIRED: Should be equal to the service name prefixed by "tasks." when
      # deployed inside an overlay network
      AGENT_CLUSTER_ADDR: tasks.agent
      # AGENT_PORT: 9001
      # LOG_LEVEL: debug
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - agent_network
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    ports:
      - "9000:9000"
      - "8000:8000"
    volumes:
      - data:/data
    networks:
      - agent_network
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]

networks:
  agent_network:
    driver: overlay

volumes:
   data:

Lo que vamos a desplegar aquí es el agente, que como les comente, vamos a hacerlo en modo global, para que el mismo se instale en todos los nodos del clúster y le vamos a exponer como volumen, la ruta /var/lib/docker/volumes, así como también el socket de Docker.

Si alguna vez seguiste este tutorial y cambiaste la carpeta donde trabaja Docker, la ruta de los volúmenes de Docker tiene que estar de acuerdo a su ubicación.

Cómo cambiar la carpeta en donde trabaja Docker
El miércoles les comente que había puesto en producción un CoreOS en Azure, hoy te cuento, cómo hacer para que Docker funcione en otro directorio al instalado por defecto. Lo primero que tenés que hacer es editar un archivo llamado daemon.json, el archivo es nuevo, está vacío. Lo haces de esta mane…

Lo siguiente que especificamos aquí es una red del tipo overlay y no mucho más.

Luego, vemos que vamos a desplegar un contenedor con el Portainer "Server", noten que exponemos dos puertos, uno es el 9000 que es por donde vamos a entrar a la UI de Portainer y el puerto 8000 está reservado para los agentes hablen a través de SSH de manera segura con el servidor. Especificamos un volumen para hacer persistente la configuración y lo metemos en la misma red que el agente.

Definimos la red y el volumen data y ya con esa configuración, así como esta, estamos listos para desplegar.

¡Desplega querido!

Para desplegar, lo vamos a hacer como un Stack, para este caso, vamos a ejecutar lo siguiente en el Manager de Docker Swarm:

$ docker stack deploy portainer -c portainer.yml

Si todo sale bien, debemos ver algo como esto:

Creating network portainer_agent_network
Creating service portainer_agent
Creating service portainer_portainer

Para ver cómo va el despliegue, ejecutamos:

$ docker service ls

La devolución debería ser algo como esto:

ID                  NAME                  MODE                REPLICAS            IMAGE                        PORTS
ngvbdywoej8o        portainer_agent       global              2/2                 portainer/agent:latest
uq7zsmd5badq        portainer_portainer   replicated          1/1                 portainer/portainer:latest   *:8000->8000/tcp, *:9000->9000/tcp

Si ven algo como esto de aquí arriba quiere decir que nuestro despliegue se realizó correctamente. Como pueden ver, el agente tiene dos replicas corriendo, eso es así porque hay una instancia corriendo en el Manager del Swarm y el otro en el Worker.

Lo siguiente que haremos es apuntar nuestros navegadores hacia la IP del nodo Manager de Docker Swarm por el puerto 9000.

En mi caso quedó así:

http://172.30.225.238:9000/

La respuesta debería ser algo como esto:

Lo siguiente que vamos a hacer es configurar el usuario de administrador, si nuestra instancia de Portainer va a estar expuesta a Internet, te recomiendo elegir otro nombre de usuario, elegimos la contraseña y hacemos un clic en "Create User".

Lo siguiente que veremos será nuestro Portainer listo para empezar a trabajar.

Para ir cerrando

Como ves el despliegue de Portainer es muy sencillo y en unos minutos estamos listos para manejar nuestro clúster de Docker Swarm desde una interfaz amigable y potente, que consume muy pocos recursos.

Les dejo aquí el Github donde esta hosteado el archivo portainer.yml:

xe-nvdk/awesome-swarm
These samples provide a starting point for how to integrate different services using in Docker Swarm. You’re invited to contribute. - xe-nvdk/awesome-swarm

En otros artículos veremos como sacarle provecho y por supuesto veremos como desplegarlo para administrar nuestros clúster de Kubernetes.

Si algo no anduvo, no dudes en dejar algún comentario aquí abajo.