Utilizar docker desde Python

¡Hola! Hoy continuamos con el tema docker. Hablaremos de como integrar docker con python, es decir, como utilizar docker desde python llamando a la API de docker.

¡Comenzamos!

Utilizar docker desde python

Como ya sabéis por otros artículos que hemos realizado ( como https://aprendeit.com/como-empezar-con-docker/) docker es un sistema de virtualización basado en contenedores. Es muy potente y versátil. Y hoy os enseñamos a utilizar su API desde python para integrarlo en vuestros desarrollos y scripts. Incluso para poder haceros vuestro propio orquestador (aunque para esto puede interesar mas kubernetes, pero de esto ya hablaremos).

Desde la API de docker para python se pueden realizar una gran variedad de operaciones. Se pueden crear contenedores, manejar los existentes, gestionar imágenes, etc.

Vamos por partes:

1. Instalando el paquete de api de docker

Partimos de la base de que ya tenemos docker instalado en el sistema (si no es así podemos ver como hacerlo en el articulo https://aprendeit.com/como-empezar-con-docker/ ). Por lo que el siguiente paso es instalar con pip el paquete de la API de docker.

Para empezar debemos instalar pip si no lo tenemos instalado.
En Centos 7:

# yum install epel-release
# yum -y install python-pip

En Debian:

# apt-get instal python-pip

Una vez instalado pip, instalamos el modulo de python “docker”:

root@host :~# pip install docker
Collecting docker
  Downloading https://files.pythonhosted.org/packages/e1/58/938fbc7acd98302ca4872f5eab8ab811498e342ab5aec0c1609f22e0aeda/docker-3.6.0-py2.py3-none-any.whl (131kB)
    100% |████████████████████████████████| 133kB 989kB/s 
Requirement already satisfied: backports.ssl-match-hostname>=3.5; python_version < "3.5" in /usr/local/lib/python2.7/dist-packages (from docker) (3.5.0.1) Requirement already satisfied: docker-pycreds>=0.3.0 in /usr/local/lib/python2.7/dist-packages (from docker) (0.4.0)
Requirement already satisfied: ipaddress>=1.0.16; python_version < "3.3" in /usr/lib/python2.7/dist-packages (from docker) (1.0.17) Requirement already satisfied: requests!=2.18.0,>=2.14.2 in /usr/local/lib/python2.7/dist-packages (from docker) (2.19.1)
Requirement already satisfied: six>=1.4.0 in /usr/lib/python2.7/dist-packages (from docker) (1.11.0)
Requirement already satisfied: websocket-client>=0.32.0 in /usr/local/lib/python2.7/dist-packages (from docker) (0.54.0)
Requirement already satisfied: idna<2.8,>=2.5 in /usr/lib/python2.7/dist-packages (from requests!=2.18.0,>=2.14.2->docker) (2.6)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python2.7/dist-packages (from requests!=2.18.0,>=2.14.2->docker) (2018.8.24)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python2.7/dist-packages (from requests!=2.18.0,>=2.14.2->docker) (3.0.4)
Requirement already satisfied: urllib3<1.24,>=1.21.1 in /usr/local/lib/python2.7/dist-packages (from requests!=2.18.0,>=2.14.2->docker) (1.23)
Installing collected packages: docker
Successfully installed docker-3.6.0


Ahora que ya tenemos instalado el modulo de python para trabajar con docker podemos empezar:

2. Por donde empezamos

Todo lo que vamos a hacer ahora se puede hacer desde la consola de python o desde un script, en este caso lo orientaremos a un script.

1. Declaramos el docker usado

En primer lugar debemos declarar cual es el docker que vamos a usar esto se puede hacer de varias formas:

import docker

client = docker.DockerClient(base_url='unix://var/run/docker.sock')

Otra forma de declararlo es:

import docker

client = docker.from_env()

2. Crear contenedor y arrancarlos

Para crear contenedores y para todas las demás operaciones que mostraremos siempre debemos declarar primero el docker usado. Después llamaremos al método run, los parámetros son: run(IMAGE,name=”NOMBRE DEL CONTENEDOR”, tty=True,detach=True, stdin_open=True ). Si la imagen no está descargada tardará un poco mas, mas adelante veremos como listar las imágenes disponibles.

import docker
#Declaramos declaramos el docker usado
client = docker.from_env()

client.containers.run("centos:7",name="Prueba1", tty=True, detach = True, stdin_open = True)

3. Listar contenedores

Cuando solicitemos el listado nos devolverá un array con los IDs de los contenedores generados. Al hacerlo con containers.list() es igual que si hiciesemos docker ps, solo nos muestra los levantados, para ver todos, es necesario ejecutarlo con el parámetro all=True, es decir client.containers.list(all=True)

import docker
#Declaramos declaramos el docker usado
client = docker.from_env()

lista = []
lista = client.containers.run("centos:7",name="Prueba1", tty=True, detach = True, stdin_open = True)
#Nos devolverá un array de objetos container como: [,]

Aquí se puede ver un ejemplo:

docker ps

4. Arrancar y parar contenedores

A partir de una lista de contenedores, podemos trabajar sobre ellos, apagandolos, eliminándolos y arrancándolos.

import docker
#Declaramos declaramos el docker usado
client = docker.from_env()

lista = []
lista = client.containers.list(all=True)
for contenedor in lista:
    print("su id es {0} y su nombre {1} ".format(contenedor.id,contenedor.name))
    print(contenedor.status)
    contenedor.stop()

lista = client.containers.list(all=True)
for contenedor in lista:
    print(contenedor.status)
    contenedor.start()

lista = client.containers.list(all=True)
for contenedor in lista:
    print(contenedor.status)
    contenedor.status()

En el anterior código hacemos varios bucles para actualizar el estado, el resultado sería:

[root@dev ~]# python
Python 2.7.5 (default, Jul 13 2018, 13:06:57) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import docker
>>> #Declaramos declaramos el docker usado
... client = docker.from_env()
>>> 
>>> lista = []
>>> lista = client.containers.list(all=True)
>>> for contenedor in lista:
...     print("su id es {0} y su nombre {1} ".format(contenedor.id,contenedor.name))
...     print(contenedor.status)
...     contenedor.stop()
... 
su id es 0f5278995d793e6627ec1086094a38052e83089ee43fa150ed8e1fb55c6d6c0a y su nombre Prueba1 
running
>>> lista = client.containers.list(all=True)
>>> for contenedor in lista:
...     print(contenedor.status)
...     contenedor.start()
... 
exited
>>> lista = client.containers.list(all=True)
>>> for contenedor in lista:
...     print(contenedor.status)
...     contenedor.status()
... 
running

Para eliminar un contenedor, primero debe estar parado y podemos hacerlo como hacemos con “.stop()” pero ponemos en su lugar “.remove()“.

5. Listar imagenes

Para ver las imágenes se parece bastante a como lo hacemos con los contenedores, se llama al método “.list()” de images:

import docker
#Declaramos declaramos el docker usado
client = docker.from_env()

lista = []
lista = client.images.list()
for image in lista:
   print(image.id)
   print(image.tags)
#Nos devolverá un array de objetos image con los datos de las imagenes locales

Por ejemplo:

[root@dev ~]# python
Python 2.7.5 (default, Jul 13 2018, 13:06:57) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import docker
>>> #Declaramos declaramos el docker usado
... client = docker.from_env()
>>> 
>>> lista = []
>>> lista = client.images.list()
>>> for image in lista:
...    print(image.id)
...    print(image.tags)
... #Nos devolverá un array de objetos image
... 
sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb
[u'docker.io/centos:7']
sha256:dc496f71dbb587a32a007a0ffb420d1b35c55ec31cda99c0f5336954623f8368
[u'docker.io/alpine:3.5']
sha256:174b26fe09c724368aa2c3cc8f2b979b915a33f7b50c94cd215380d56147cd60
[u'docker.io/alpine:3.4']
sha256:c78b5648029c3636a0c6d056eeba8c3a2e970976342ee156155db19ca81c6f5e
[u'docker.io/alpine:3.3']
sha256:4558d96d24b5acf7d9bdaa060124ae787fa38093eb00538b88378833de5a223d
[u'docker.io/alpine:3.2']
sha256:f36c4228b2c6863208de3a13f2e467476d00ab492416c0aadcfc0e247db1ee03
[u'docker.io/alpine:3.1']
sha256:de4761d9f0371cbace6a4c2ebef14b14ce30185a7fcedb5e04b170130e7e642d
[u'docker.io/alpine:edge']
sha256:196d12cf6ab19273823e700516e98eb1910b03b17840f9d5509f03858484d321
[u'docker.io/alpine:3.8', u'docker.io/alpine:latest']
sha256:34ea7509dcad10aa92310f2b41e3afbabed0811ee3a902d6d49cb90f075fe444
[u'docker.io/alpine:3.7']
sha256:94627dfbdf19f1344aae6ef72db6ff30c5148b60e1091de098807ec4b42febbc
[u'docker.io/alpine:3.6']
sha256:b1666055931f332541bda7c425e624764de96c85177a61a0b49238a42b80b7f9
[u'docker.io/bfirsh/reticulate-splines:latest']
sha256:93f518ec2c41722d6c21e55f96cef4dc4c9ba521cab51a757b1d7272b393902f
[u'docker.io/alpine:2.7']
sha256:e738dfbe7a10356ea998e8acc7493c0bfae5ed919ad7eb99550ab60d7f47e214
[u'docker.io/alpine:2.6']

 

Si estás interesado en aprender Docker puedes puedes adquirir nuestro libro aquí.

Docker para novatosDocker para novatos

Y esto es solo una pequeña parte de lo que se puede llegar a hacer, puede consultarse toda la información sobre la librería en https://docker-py.readthedocs.io/en/stable/client.html ya que es la web oficial.

Y esto ha sido todo por hoy, espero que os haya gustado.

Os agradecemos que si os ha gustado dejeis vuestro comentario y/o compartáis el artículo en vuestras redes sociales.

¡Nos vemos!

Deja una respuesta