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