Que novedades tiene Docker 1.12 – Segunda parte

Como ya introdujimos en el anterior post Novedades de Docker 1.12 la novedad más importante se debe a la integración completa de Docker Swarm en el propio núcleo del programa.

Haber integrado Docker Swarm nos permite desde el mismo comando tener todo bajo control en lo que a servicios se refiere:

  • Declara el estado del servicio
  • Actualizaciones sin perdida de servicio
  • Tener una monitorización personalizada del estado de los servicios
  • Conciliación de los servicios para comprobar si el estado es el que queremos.

En la primera parte vimos como se declaran los servicios y en este vamos a comprobar como podemos hacer una actualización de nuestros contenedores sin que tengamos perdida de servicio.

Para ello vamos a continuar desde la situación que ya teníamos de 2 nodos, uno principal y otro secundario. En los que hemos desplegado la aplicación de pruebas instavote/vote y la hemos escalado a 4 contenedores para tener 2 en cada nodo.

El primer ejemplo va a ser una actualización masiva, osea que se destruirán los contenedores y se crearán con la nueva versión a la vez. Siempre pensando en lo que el hardware nos permita ya que aunque queramos actualizar 100 contenedores a la vez si el hardware (o máquina virtual) no es potente habrá demoras.

Vamos con la primera actualización:

>_ docker service update --image instavote/vote:movies demo

Actualización de los contenedores

Si queremos verificar el cambio en los contenedores lo podemos comprobar con service tasks

>_ docker service tasks demo
ID                         NAME    SERVICE  IMAGE                  LAST STATE           DESIRED STATE  NODE
b5vr32jnjgctsuigiz7xk0aan  demo.1  demo     instavote/vote:movies  Preparing 6 seconds  Running        ip-172-31-22-89
dgvsa201bzwnbsjxviyttaxs8  demo.2  demo     instavote/vote:movies  Running 9 seconds    Running        ip-172-31-24-241
2x723b8mcvx6jxfuma3kmulhn  demo.3  demo     instavote/vote:movies  Preparing 7 seconds  Running        ip-172-31-22-89
bwug8pi2k7ghr827x66veludf  demo.4  demo     instavote/vote:movies  Running 9 seconds    Running        ip-172-31-24-241

Con esta simple orden conseguimos actualizar todos los nodos a la vez. Obviamente no perdemos servicio dado que no tenemos muchos contenedores ni tampoco un número elevado de nodos.

En la actualización no solo tiene que ser la imagen, también podemos actualizar la red, el directorio de trabajo o el comando del contenedor.

Para no tener perdida de servicio en un sistema muy grande, lo mejor es que esta actualización se haga progresivamente. Para ello el comando update tiene un dos módificadores que nos permiten gestionar esta migración:

  • --update-parallelism que indica el número de contenedores que vamos a migrar a la vez.
  • --update-delay que indica el tiempo entre la migración de los grupos de contenedores.

Vamos a hacer una actualización de los contenedores, pero esta vez no queremos que haya perdida de servicio. Para que se vea más claro vamos a darle un delay de un minuto o dos. Con esto veremos como poco a poco se van actualizando los contenedores.

>_ docker service update --update-delay 20s --update-parallelism 1 --image instavote/vote:indent demo

Podremos ir viendo en el sistema como se ve actualizando.

>_ docker service tasks demo 
ID                         NAME    SERVICE  IMAGE                  LAST STATE          DESIRED STATE  NODE
9m2rnu10pcznbc29hewmawu9z  demo.1  demo     instavote/vote:movies  Running 20 hours    Running        ip-172-31-24-241
egs1ykz41yuje3ayv3cjq6620  demo.2  demo     instavote/vote:movies  Running 33 minutes  Running        ip-172-31-24-241
8ilhvqhfqbzzyid7yrj4i5wcj  demo.3  demo     instavote/vote:indent  Running 51 seconds  Running        ip-172-31-22-89
b47rc3qgvmf9enfxswcafyhjh  demo.4  demo     instavote/vote:movies  Running 33 minutes  Running        ip-172-31-24-241
edusnxrg78uz6b08ohiz9ze3x  demo.5  demo     instavote/vote:movies  Running 5 minutes   Running        ip-172-31-22-89
135euxd7odb8o0c087qaynfmf  demo.6  demo     instavote/vote:indent  Running 20 seconds  Running        ip-172-31-22-89
>_ docker service tasks demo 
ID                         NAME    SERVICE  IMAGE                  LAST STATE              DESIRED STATE  NODE
7y91m2ammyo8t12m453msxlha  demo.1  demo     instavote/vote:indent  Running About a minute  Running        ip-172-31-24-241
egs1ykz41yuje3ayv3cjq6620  demo.2  demo     instavote/vote:movies  Running 35 minutes      Running        ip-172-31-24-241
8ilhvqhfqbzzyid7yrj4i5wcj  demo.3  demo     instavote/vote:indent  Running 2 minutes       Running        ip-172-31-22-89
6j3ewrix42t9fkdqc1t00qlyg  demo.4  demo     instavote/vote:indent  Running About a minute  Running        ip-172-31-24-241
eyt7oky9a1lhunzfv9zvyq2zt  demo.5  demo     instavote/vote:indent  Running 28 seconds      Running        ip-172-31-22-89
135euxd7odb8o0c087qaynfmf  demo.6  demo     instavote/vote:indent  Running 2 minutes       Running        ip-172-31-22-89

Actualización de los contenedores

Si visitásemos continuamente la aplicación comprobaríamos como la actualización es totalmente silenciosa y sin perdida de servicio. Este tipo de funcionamiento es muy similar a otros sistemas como por ejemplo [Kubernetes.io][3]. Pero dada la reducida complejidad que ha adquirido Docker es el método más sencillo para crear un cluster sobre todo si tu proveedor no es Google Cloud

Espero que esta nueva versión se ponga rápidamente de manera estable y la podamos usar.

Hasta pronto y si te ha gustado o quieres decir algo, comenta o retwittea. Se agradece.

Leave a comment

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *