En la primera parte de esta serie de corta de dos post que puedes leer aquí, se explicaba cómo instalar el SDK de Python para interactuar con un servicio de Docker y consultar características básicas de dicho servicio así como la posibilidad de listar contenedores, imágenes y volúmenes. A continuación, se hablará sobre algunas de las cosas que se pueden hacer con un objeto DockerClient

Gestionar Contenedores

Como se ha visto en la primera parte de estos posts, la clase Containers a la que se puede acceder desde el cliente de Docker, permite listar, crear, eliminar y modificar contenedores de una forma muy simple. De hecho, si se sabe cómo utilizar el cliente de Docker para Linux, entender los métodos disponibles en dicha clase resultará algo natural y bastante sencillo ya que es muy similar a lo que se puede hacer con el cliente de Docker. La documentación disponible del SDK de Python ayuda a comprender los métodos y parámetros disponibles.
El primer método que merece la pena analizar es run el cual simplemente permite ejecutar un contenedor con los parámetros indicados. Dichos parámetros incluyen cosas como el nombre de la imagen, recursos que se van a asignar al contenedor en términos de CPU y memoria, volúmenes, servidores DNS personalizados, conexiones con otros contenedores por medio de una red existente, puntos de montaje, puertos internos y externos y hasta un listado de capabilities en Linux. Por ejemplo:

El objeto que devuelve la invocación del método run permite acceder a información del contenedor, pero no solo eso, permite también gestionar su estado y acceder a la información de los logs que se van registrando.

Como se puede apreciar utilizando la instancia del objeto Container se pueden hacer muchas cosas, todas ellas se encuentran debidamente documentadas en resultan fáciles de implementar.

Gestionar imágenes

Del mismo modo que ocurre con los contenedores, es posible gestionar imágenes utilizando el SDK de Docker para Python. Es posible construir imágenes desde cero con el método build o hacer un pull de una imagen existente, algo que de hecho, también se hace de forma automática cuando se crea un contenedor con el método run o simplemente cuando se intenta crear un contenedor y la imagen especificada no se encuentra disponible localmente en el servicio de Docker.

Todas las operaciones que se aprecian en la imagen anterior se encuentran disponibles en la documentación correspondiente a la clase Images. Con métodos sencillos se pueden hacer cosas como listar, modificar o eliminar imágenes, además la clase Image cuenta con varios métodos que permiten descargar el contenido de la imagen localmente en un fichero en formato tar.gz o crear nuevas tags. Lo mismo que se hace con el cliente de Docker.

Gestionar redes.

Las redes en Docker representan uno de los elementos más básicos y potentes en el mundo de los contenedores utilizando esta tecnología y por supuesto, permiten conectar contenedores entre sí o aislarlos siguiendo una serie de criterios previamente establecidos. Nuevamente, el objeto DockerClient permite realizar todas las gestiones relacionadas con las redes por medio de la clase Networks

Se pueden crear redes, eliminarlas y conectarlas con contenedores que se encuentren previamente creados. Es equivalente a utilizar el comando docker network en el cliente de Docker para Linux.

Gestionar volúmenes.

Otra característica muy común en el mundo de Docker es precisamente la posibilidad de almacenar información de manera persistente por medio de los volúmenes. Los contenedores se caracterizan por ser efímeros y precisamente por ese motivo, los volúmenes representan una solución efectiva al problema de la persistencia en dichos entornos. Se pueden crear de dos formas si utiliza el cliente de Docker, o bien de forma implícita en el proceso de creación de contenedores o de forma explicita por medio del comando “docker volume“. En el caso del SDK de Python para Docker, este comportamiento se conserva. Es decir, en el momento en el que se invoca el método client.Containers.run si se indica que se debe crear un volumen, éste se creará durante el proceso de creación del contenedor y si se utiliza la clase client.Volumes será posible crear volúmenes de forma explicita los cuales luego se pueden vincular a un contenedor.

En este segundo post se ha podido comprobar lo fácil que puede ser gestionar un servicio de Docker utilizando el SDK de Python, algo que puede venir muy bien a la hora de gestionar contenedores o cualquier otro componente disponible en el servicio de Docker.

Un saludo y Happy Hack!
Adastra.