En esta entrada vamos a ver que son y como se configuran los servicios en Docker.
¿Qué son los servicios en Docker?
Los servicios son una forma de orquestar la gestión, iniciación y despliegue de los contenedores de Docker dentro de un clúster.
Las principales ventajas que ofrecen los servicios son:
- Alta disponibilidad: En función de las replicas que definamos se crearán tareas en cada uno de los nodos de tal forma que si por ejemplo se cayera un nodo el servicio se seguiría prestando entre el resto de nodos disponibles y además docker automáticamente crearía una nueva tarea en alguno de los nodos que queden disponibles para mantener el número de replicas que hayamos establecido.
- Balanceo cargas de trabajo: Docker es capaz de mantener un equilibrio en las cargas de trabajo de manera automática repartiéndolas entre todos los nodos disponibles.
- Facilidad de actualizar nuevas versiones de las imágenes: Una ventaja es que podremos aplicar una actualización de una imagen entre todos los nodos simplemente ejecutando un único comando, esto nos evitará tener que ir aplicando la actualización nodo por nodo.
Creación de un servicio
Para este tutorial vamos a crear un servicio que desplegará una imagen con Apache.
El servicio que vamos a crear lo llamaremos ApacheWeb, estará basado en la imagen bitnami/apache, tendrá 3 réplicas (para así darle alta disponibilidad y balanceo de carga) y estará escuchando por el puerto 8080.
Nota: Una vez ejecutemos el comando tendremos que ser pacientes y esperar unos minutos (variará en función del tamaño de la imagen) ya que la imagen tendrá que descargarse en cada uno de los nodos que forman parte de nuestro clúster.
[root@DOCKER1 sergio.portillo]# docker service create --name ApacheWeb -p 8080:8080 --replicas 3 bitnami/apache:2.4.34 w1p1u5aqyh37q0zhyjfi3bqnz overall progress: 3 out of 3 tasks 1/3: running [==================================================>] 2/3: running [==================================================>] 3/3: running [==================================================>] verify: Service converged
Y listo ya tendremos creado nuestro primer servicio, así de fácil y rápido.
En que nodos se están ejecutando las tareas asociadas al servicio y cual es su estado
Si queremos saber en que nodos se está ejecutando nuestro servicio y si se están ejecutando o no utilizaremos el comando:
[root@DOCKER1 sergio.portillo]# docker service ps ApacheWeb ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 48d9zr8t8xil ApacheWeb.1 bitnami/apache:2.4.34 DOCKER4 Running Running 2 minutes ago 4dponx239fip ApacheWeb.2 bitnami/apache:2.4.34 DOCKER1 Running Running 2 minutes ago 72f04hiezpnx ApacheWeb.3 bitnami/apache:2.4.34 DOCKER2 Running Running 2 minutes ago
Ver los servicios existentes en el cluster
Si queremos ver los servicios existentes en el clúster simplemente ejecutamos el siguiente comando para que nos aparezca un listado de todos los servicios existentes:
[root@DOCKER1 sergio.portillo]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS w1p1u5aqyh37 ApacheWeb replicated 3/3 bitnami/apache:2.4.34 *:8080->8080/tcp
Ver información detallada sobre un servicio
Si queremos ver información detallada sobre un servicio en concreto utilizaremos el siguiente comando:
[root@DOCKER1 sergio.portillo]# docker service inspect --pretty ApacheWeb ID: w1p1u5aqyh37q0zhyjfi3bqnz Name: ApacheWeb Service Mode: Replicated Replicas: 3 Placement: UpdateConfig: Parallelism: 1 On failure: pause Monitoring Period: 5s Max failure ratio: 0 Update order: stop-first RollbackConfig: Parallelism: 1 On failure: pause Monitoring Period: 5s Max failure ratio: 0 Rollback order: stop-first ContainerSpec: Image: bitnami/apache:2.4.34@sha256:c4bd4603de924246074ef42d80956ea7d012f65a02d0384c974bc9daebd7bc93 Init: false Resources: Endpoint Mode: vip Ports: PublishedPort = 8080 Protocol = tcp TargetPort = 8080 PublishMode = ingress
Aumentar o disminuir el número de réplicas
Cuando creamos el servicio establecimos 3 réplicas pero puede darse el caso que nuestro servicio tenga que aguantar una carga de trabajo mayor y queramos ampliar el número de réplicas (lo mismo sería si queremos disminuirlas porque en la creación lo hubiéramos sobredimensionado).
Simplemente ejecutamos el siguiente comando indicando el nombre del servicio a redimensionar y el número de replicas que queremos.
[root@DOCKER1 sergio.portillo]# docker service scale ApacheWeb=5 ApacheWeb scaled to 5 overall progress: 5 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] verify: Service converged
Y como podemos apreciar el número de réplicas después de ejecutar el comando ha pasado de 3 a 5.
[root@DOCKER1 sergio.portillo]# docker service ps ApacheWeb ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 48d9zr8t8xil ApacheWeb.1 bitnami/apache:2.4.34 DOCKER4 Running Running 4 minutes ago 4dponx239fip ApacheWeb.2 bitnami/apache:2.4.34 DOCKER1 Running Running 4 minutes ago 72f04hiezpnx ApacheWeb.3 bitnami/apache:2.4.34 DOCKER2 Running Running 4 minutes ago bcir0l15s76u ApacheWeb.4 bitnami/apache:2.4.34 DOCKER3 Running Running about a minute ago lsv1y189ywzz ApacheWeb.5 bitnami/apache:2.4.34 DOCKER3 Running Running about a minute ago
Actualizar servicios
Para actualizar la imagen asociada a un servicio en todos los nodos simplemente tendremos que ejecutar el siguiente comando indicando el nombre de la imagen, la versión a la que queremos actualizar, el número de tareas en paralelo que queremos se actualicen y el intervalo en segundos entre una actualización y otra.
En este ejemplo actualizaremos nuestro servicio desde la versión 2.4.43 a la versión 2.4.46 y diremos que en paralelo se actualicen sólo 2 tareas y entre una actualización y otra pasen 10 segundos.
[root@DOCKER1 sergio.portillo]# docker service update --image bitnami/apache:2.4.46 --update-parallelism 2 --update-delay 10s ApacheWeb ApacheWeb overall progress: 5 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] verify: Service converged
Y como podemos comprobar la versión de nuestra imagen se ha actualizado a la versión 2.4.46 en todas las tareas que hay repartidas entre los distintos nodos.
[root@DOCKER1 sergio.portillo]# docker service ps ApacheWeb | grep :2.4.46 zfejwe6516ij ApacheWeb.1 bitnami/apache:2.4.46 DOCKER4 Running Running 3 minutes ago ykx8gt39d49u ApacheWeb.2 bitnami/apache:2.4.46 DOCKER2 Running Running 2 minutes ago k97vd38rg8jb ApacheWeb.3 bitnami/apache:2.4.46 DOCKER1 Running Running 2 minutes ago kp9d2cl7js8v ApacheWeb.4 bitnami/apache:2.4.46 DOCKER3 Running Running 2 minutes ago l5bpvecynlha ApacheWeb.5 bitnami/apache:2.4.46 DOCKER4 Running Running 3 minutes ago
Como eliminar un servicio
Por último vamos a eliminar el servicio ApacheWeb que hemos usado para este tutorial. Para ello ejecutamos el siguiente comando para eliminarlo completamente de nuestro clúster.
[root@DOCKER1 sergio.portillo]# docker service rm ApacheWeb ApacheWeb
Y eso es todo en lo que se refiere a la gestión de servicios en Docker.
Espero os haya sido de utilidad.
Entradas relacionadas
- Como crear un Clúster en Docker
- Instalar Docker en CentOS 8
- Instalar Docker en Windows Server 2019
- Instalar Docker en Windows 10
Me dedico a la Administración de Sistemas y he creado este blog para compartir mis conocimientos con toda la comunidad y así aportar mi granito de arena y ayudar a todo el que lo necesite.
Buenas noches estimado, útil material como siempre. Quisiera saber sí puede tratar un tema en comparativa con Docker y Kubernets y sí se puede explicar cómo aplicarla a gestores de bases de datos como Oracle. Muchas gracias por todo.
Hola Jose,
Me lo apunto ya que poco a poco voy a ir generando más contenido relacionado con Docker y Kubernetes.
Saludos.