Usando o Docker de Python

Olá! hoje continuamos com o tema Docker. Vamos falar sobre como integrar Docker com python, ou seja, como usar Docker de python chamando o Docker API.

Vamos começar!

Utilizar docker desde python

Como já sabe por outros artigos que fizemos ( tais como https://aprendeit.com/pt/comecar-com-o-docker/) Docker é um sistema de virtualização baseado em contentores. É muito poderoso e versátil. E hoje mostramos-lhe como utilizar o seu API da Python para o integrar nos seus desenvolvimentos e scripts. Mesmo para fazer o seu próprio orquestrador (embora Kubernetes possa ser mais adequado para isto, mas falaremos sobre isso mais tarde).

A partir do Docker API para Python pode realizar uma grande variedade de operações. Pode criar contentores, gerir os já existentes, gerir imagens, e assim por diante.

Vamos dar um passo de cada vez:

1. Instalação do pacote de api Docker

Partimos do princípio de que já temos o Docker instalado no sistema (se não, podemos ver como o fazer no artigo https://aprendeit.com/como-empezar-con-Docker/ ). Assim, o passo seguinte é instalar o pacote Docker API com pip.

Para começar, temos de instalar pip se não o tivermos instalado.
Sobre os Centos 7:

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

Em Debian:

# apt-get instal python-pip

Uma vez instalado o pip, instalamos o módulo 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


Agora que temos o módulo Python instalado para trabalhar com o Docker, podemos começar:

2. Por onde começar

Tudo o que vamos fazer agora pode ser feito a partir da consola Python ou a partir de um guião, neste caso vamos concentrar-nos num guião.

1. Declarar o estivador utilizado

Antes de mais temos de declarar qual o Docker que vamos utilizar, isto pode ser feito de várias maneiras:

import docker

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

Outra forma de o declarar é:

import docker

client = docker.from_env()

2. Criar recipiente e iniciá-los

Para criar contentores e para todas as outras operações que iremos mostrar, devemos sempre declarar primeiro o Docker utilizado. Então chamaremos o método de execução, os parâmetros são: run(IMAGE,name=”NOME DO CONTENEDOR”, tty=True,detach=True, stdin_open=True ).Se a imagem não for descarregada demorará um pouco mais, veremos mais tarde como listar as imagens disponíveis.

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 recipientes

Quando solicitamos a lista, devolverá uma matriz com as identificações dos contentores gerados. Quando o fazemos com containers.list() é o mesmo que se fossemos docker ps, apenas nos mostra os levantados, para ver todos eles, é necessário executá-lo com o parâmetro all=True, ou seja 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: [,]

Aqui está um exemplo:

docker ps

4. Arranque e paragem de contentores

A partir de uma lista de contentores, podemos trabalhar neles, fechando-os, apagando-os e iniciando o seu funcionamento.

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()

No código acima referido, fazemos vários loops para actualizar o estado, o resultado seria:

[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 um recipiente, este tem primeiro de ser parado, e podemos fazê-lo como fazemos com “.stop()” mas nós pomos em prática “.remove()“.

5. Listar imagens

Para ver as imagens é bastante semelhante à forma como o fazemos com os contentores, chamamos ao método “.list()” de imagens:

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 exemplo:

[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']

 

Se estiver interessado em aprender Docker, pode adquirir o nosso livro aqui.

Docker para novatosDocker para novatos

E isto é apenas uma pequena parte do que pode ser feito, pode encontrar toda a informação sobre a livraria em https://docker-py.readthedocs.io/en/stable/client.html uma vez que é o sítio oficial.

E é tudo por hoje, espero que tenham gostado.

Se gostou, por favor deixe um comentário e/ou partilhe o artigo nas suas redes sociais.

Até breve!

Deixe um comentário