Portainer nos proporciona una GUI web desde la que administrar un clúster de Docker Swarm: operatividad de contenedores (parada, reinicio, etc…), gestión de stacks, servicios, plantillas de imágenes, volúmenes para persistencia de datos…
En mi entorno parto de 4 nodos, 2 de ellos master y otros dos workers. Los 4 están configurados para poder servir peticiones de mis contenedores:
[root@docker-master1 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION olw40ii82gslxgfjtmy5h2ncr * docker-master1 Ready Active Leader 18.09.1 lvvjz6c4bfe4ez16kzkyuc31o docker-master2 Ready Active Reachable 18.09.1 q8em4kafthkm1phkuuab48eau docker-worker1 Ready Active 18.09.1 hb4ylcxtchc6kevimak7wxr9e docker-worker2 Ready Active 18.09.1
También tengo una serie de servicios desplegados:
root@docker-master1 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS tpmlzwsun4xt httpd_httpd global 4/4 httpd:2.4 *:80->80/tcp, *:443->443/tcp 9040dr4bjqtf jboss_jboss global 4/4 jboss/wildfly:latest *:8080->8080/tcp, *:9990->9990/tcp rhjjxlrqimj7 portainer_agent global 4/4 portainer/agent:latest rs5wrgflhmax portainer_portainer replicated 1/1 portainer/portainer:latest *:9000->9000/tcp oxj7bf6e36kj tomcat_tomcat global 4/4 tomcat:8.0 *:8180->8080/tcp
Como se puede ver Portainer es un servicio más dentro del clúster. El servicio de administración se encuentra desplegado en modo réplica sólo en un nodo:
[root@docker-master1 ~]# docker service ps portainer_portainer ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS u7zkwx0rq1tf portainer_portainer.1 portainer/portainer:latest docker-master1 Running Running 3 hours ago
El agente está en los cuatro nodos.
[root@docker-master1 ~]# docker service ps portainer_agent ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 02s2mimzojgn portainer_agent.q8em4kafthkm1phkuuab48eau portainer/agent:latest docker-worker1 Running Running 3 hours ago lhoewvvlc2zm portainer_agent.olw40ii82gslxgfjtmy5h2ncr portainer/agent:latest docker-master1 Running Running 3 hours ago ldi3cj7kj7hb portainer_agent.lvvjz6c4bfe4ez16kzkyuc31o portainer/agent:latest docker-master2 Running Running 3 hours ago p2sch9c3gqfd portainer_agent.hb4ylcxtchc6kevimak7wxr9e portainer/agent:latest docker-worker2 Running Running 3 hours ago
La instalación de Portainer por tanto se puede realizar desplegándolo como un servicio más dentro de nuestro clúster:
[root@docker-master1 ~]# curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml
Echando un vistazo al fichero de configuración del stack vemos que el agente se despliega en modo global para todo el clúster y el contenedor que contiene los servicios de administración se despliega en modo réplica:
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"
volumes:
- portainer_data:/data
networks:
- agent_network
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
networks:
agent_network:
driver: overlay
attachable: true
volumes:
portainer_data:
[text]
Desplegamos el stack:
[text]
[root@docker-master1 ~]# docker stack deploy --compose-file=portainer-agent-stack.yml portainer
Creating service portainer_portainer
Creating service portainer_agent
Una vez desplegado accedo a Portainer entrando en http://docker-master1:9000. La primera vez que conectemos tendremos que especificar un usuario administrador y su contraseña.
Dentro, podemos echar un vistazo global a nuestro clúster:
Los stacks podemos añadirlos directamente desde la interfaz:
Gestión de servicios, pudiendo actualizarlos, eliminarlos o escalar dentro del clúster:
Visión del clúster swarm:
En cuanto a las imágenes de docker, podemos hacer pull desde DockerHub, importarlas o crear nuestros ficheros Dockerfile con las especificaciones necesarias:
Gestión de volúmenes:
Como vemos Portainer es una herramienta bastante completa e intuitiva desde la que poder administrar nuestro clúster de Docker Swarm.
Tenéis el repositorio del proyecto en GitHub.







