Tabla de contenido
¡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!
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:
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 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!