No nosso tutorial sobre o Docker, ex­pli­ca­mos a pla­ta­forma de vir­tu­a­li­za­ção Docker e for­ne­ce­mos ins­tru­ções fáceis de seguir sobre como utilizá-la no seu sistema Ubuntu 22.04.

Docker: estrutura e fun­ci­o­na­li­da­des

Com o slogan «Build, Ship and Run Any App, Anywhere», a pla­ta­forma de con­ten­to­res de código aberto Docker apresenta-se como uma al­ter­na­tiva flexível e eficiente à emulação de com­po­nen­tes de hardware baseada em máquinas virtuais (VM).

Ao contrário da vir­tu­a­li­za­ção tra­di­ci­o­nal de hardware, que implica iniciar di­fe­ren­tes sistemas con­vi­da­dos num mesmo sistema anfitrião (host), o Docker permite que as apli­ca­ções sejam exe­cu­ta­das como processos isolados dentro do mesmo sistema, graças aos con­ten­to­res. Assim, na vir­tu­a­li­za­ção de ser­vi­do­res baseada em con­ten­to­res, consegue-se uma vir­tu­a­li­za­ção ao nível do sistema operativo.

Imagem: Comparación entre máquinas virtuales y contenedores de Docker
Mientras que cada máquina virtual inicia su propio sistema operativo, los con­te­ne­do­res de Docker comparten el núcleo (kernel

A principal vantagem da vir­tu­a­li­za­ção baseada em con­ten­to­res reside no facto de as apli­ca­ções com re­qui­si­tos di­fe­ren­tes poderem ser exe­cu­ta­das de forma isolada, sem a so­bre­carga de sistemas an­fi­triões separados. Além disso, as apli­ca­ções em con­ten­to­res podem ser uti­li­za­das em várias pla­ta­for­mas e em diversas in­fra­es­tru­tu­ras, sem ne­ces­si­dade de as adaptar às con­fi­gu­ra­ções de hardware ou software do sistema anfitrião.

O Docker é o projeto de software mais conhecido entre aqueles que oferecem tec­no­lo­gia de vir­tu­a­li­za­ção baseada em con­ten­to­res. A pla­ta­forma de código aberto é composta por três com­po­nen­tes prin­ci­pais: o motor Docker (Docker Engine), as imagens Docker e o re­po­si­tó­rio Docker Hub.

Imagens do Docker

À se­me­lhança das máquinas virtuais, os con­ten­to­res Docker baseiam-se em imagens Docker, que são modelos de leitura única com todas as ins­tru­ções ne­ces­sá­rias para que o motor Docker crie um contentor. Uma imagem Docker é uma re­pre­sen­ta­ção portátil de um contentor, apre­sen­tada na forma de um ficheiro de texto, ou seja, um Doc­ker­file. Antes de iniciar um contentor num sistema, é carregado um pacote com a imagem cor­res­pon­dente, a menos que esta já esteja ar­ma­ze­nada lo­cal­mente. A imagem carregada contém todos os sistemas de ficheiros com os pa­râ­me­tros ne­ces­sá­rios para a execução. Um contentor é es­sen­ci­al­mente um processo em execução de uma imagem.

Docker Hub

O Docker Hub é um registo de re­po­si­tó­rios de software na nuvem, ou seja, funciona como uma espécie de bi­bli­o­teca para imagens Docker. É um serviço online que contém re­po­si­tó­rios públicos e privados. Os re­po­si­tó­rios públicos permitem que os uti­li­za­do­res carreguem as suas próprias imagens e as partilhem com a co­mu­ni­dade. Aqui encontram-se inúmeras imagens Docker oficiais criadas pela equipa de pro­gra­ma­do­res, bem como projetos de código aberto con­so­li­da­dos. Por outro lado, nem todos têm acesso às imagens dos re­po­si­tó­rios privados, embora estas possam ser par­ti­lha­das dentro da mesma empresa ou num de­ter­mi­nado grupo. O re­po­si­tó­rio do Docker Hub é acessível através de hub.docker.com.

Motor Docker

O cerne de qualquer projeto Docker é o seu motor, uma aplicação cliente-servidor de código aberto dis­po­ní­vel em todas as pla­ta­for­mas na versão atual.

A ar­qui­te­tura básica do motor Docker é composta por três com­po­nen­tes prin­ci­pais: um daemon Docker, que funciona como servidor, uma interface de pro­gra­ma­ção (API) baseada em REST (Re­pre­sen­ta­ti­o­nal State Transfer) e o terminal do sistema operativo (Command-Line Interface, CLI) como interface de uti­li­za­dor (cliente).

  • Daemon do Docker: o motor do Docker utiliza um processo daemon como servidor, que é executado em segundo plano no sistema anfitrião e permite o controlo central do motor. Além disso, é res­pon­sá­vel pela criação e gestão de imagens, con­ten­to­res ou redes.
  • A API REST: es­pe­ci­fica um conjunto de in­ter­fa­ces que permite que outros programas interajam e dêem ins­tru­ções ao daemon. Um deles é o terminal do sistema operativo.
  • O terminal: o Docker utiliza o terminal do sistema operativo como programa cliente, o qual interage com o daemon através da API REST e permite aos uti­li­za­do­res controlar o daemon através de scripts ou comandos.
Dica

Em 2017, o motor Docker passou a chamar-se Docker Community Edition (abreviado como Docker CE), embora a do­cu­men­ta­ção oficial e os re­po­si­tó­rios do Docker continuem a utilizar, na sua maioria, o nome antigo. Para além do Docker CE, existe também o Docker En­ter­prise Edition (Docker EE), que oferece algumas fun­ci­o­na­li­da­des premium. No entanto, o Docker EE não é gratuito e destina-se prin­ci­pal­mente a empresas.

Com os comandos do Docker, os uti­li­za­do­res podem executar, parar ou gerir os con­ten­to­res de software di­re­ta­mente a partir do terminal. Uti­li­zando o comando docker em conjunto com ins­tru­ções como build (criar), pull (trans­fe­rir) ou run (executar), é possível comunicar com o daemon, per­mi­tindo que o cliente e o servidor estejam no mesmo sistema. Além disso, também é possível comunicar com o daemon a partir de outro sistema. A co­mu­ni­ca­ção entre o cliente e o servidor pode ser realizada através da API REST, sockets UNIX ou uma interface de rede, de­pen­dendo do tipo de ligação ne­ces­sá­ria.

A imagem seguinte mostra como os com­po­nen­tes in­di­vi­du­ais do Docker se combinam, uti­li­zando os comandos docker build, docker pull e docker run como exemplos:

Imagem: Presentación esquemática de la arquitectura Docker
'La ar­qui­tec­tura Docker se basa en la com­bi­na­ción de cliente (terminal'), servidor (daemon do Docker) e re­po­si­tó­rio (Docker Hub)“

O comando docker build instrui o daemon a criar uma imagem (linha pon­ti­lhada), uti­li­zando o Doc­ker­file cor­res­pon­dente. O comando docker pull (linha tracejada) é executado quando o uti­li­za­dor não criou a imagem, mas a obtém de um re­po­si­tó­rio no Docker Hub. Se for ordenado ao daemon que inicie um contentor com o comando docker run, este verifica primeiro se a imagem ne­ces­sá­ria está ar­ma­ze­nada lo­cal­mente. Se for esse o caso, o contentor é iniciado (linha contínua). Caso contrário, o daemon obtém a imagem di­re­ta­mente do re­po­si­tó­rio.

Trabalhar com o Docker

Chegou a hora de se fa­mi­li­a­ri­zar com as pos­si­bi­li­da­des de aplicação da pla­ta­forma de con­ten­to­res. Se ainda não instalou o motor Docker, pode fazê-lo através do terminal do Linux. En­con­trará ins­tru­ções sobre como proceder no nosso artigo«Instalar o Docker no Ubuntu 22.04». A seguir, aprenderá a utilizar o motor Docker a partir da consola, conhecerá as ca­pa­ci­da­des do Docker Hub e com­pre­en­derá por que razão os con­ten­to­res re­pre­sen­tam uma revolução na gestão de apli­ca­ções.

Como gerir o motor Docker

Desde a versão 16.04, o Ubuntu utiliza o programa systemd(abre­vi­a­tura de «system daemon») para gerir processos.O systemd éum processo init que também pode ser utilizado noutras dis­tri­bui­ções Linux, como o RHEL, o CentOS ou o Fedora, e é ge­ral­mente iden­ti­fi­cado com o ID de processo 1. Como primeiro processo do sistema, o daemon é res­pon­sá­vel por iniciar, parar e mo­ni­to­ri­zar os restantes processos. Nas versões an­te­ri­o­res do Ubuntu (14.10 e an­te­ri­o­res), oprograma upstart en­car­re­gava-se dessas funções.

Também é possível controlar o daemon do Docker através do systemd. Na ins­ta­la­ção padrão, a pla­ta­forma de con­ten­to­res está con­fi­gu­rada para que o daemon seja iniciado au­to­ma­ti­ca­mente ao arrancar o sistema. No entanto, a con­fi­gu­ra­ção pre­de­fi­nida pode ser alterada uti­li­zando a fer­ra­menta de linha de comandos systemctl.

Para controlar um processo ou verificar o seu estado, pode enviar comandos ao systemd através do systemctl. A sintaxe desse comando é a seguinte:

systemctl [OPCIÓN] [COMANDO]
bash

Alguns comandos referem-se a de­ter­mi­na­dos recursos, como o Docker. A ter­mi­no­lo­gia do systemd refere-se a esses recursos como «units» (unidades). Nesse caso, o comando deriva das ins­tru­ções cor­res­pon­den­tes e do nome da unidade a que se destina.

Se quiser ativar (enable) ou desativar (disable) o arranque au­to­má­tico do daemon do Docker, utilize a fer­ra­menta systemctl com os seguintes comandos:

sudo systemctl enable docker
sudo systemctl disable docker
bash

O systemctl também permite verificar o estado de uma unidade:

sudo systemctl status docker
bash

Se o Docker estiver ativo no sistema Ubuntu, a saída no terminal deverá ser a seguinte:

Imagem: La consulta de estado con systemctl muestra que el motor Docker está activo (running)
Consulta de estado con systemctl: el motor Docker está activo (running)

Se o motor do Docker estiver de­sa­ti­vado, o estado aparecerá como inativo (dead), pelo que será ne­ces­sá­rio iniciar o daemon do Docker ma­nu­al­mente para executar os con­ten­to­res.

Imagem: La consulta de estado con systemctl muestra: el motor Docker está inactivo (dead)
Consulta de estado con systemctl: el motor Docker está inactivo (dead)

Se quiser iniciar, parar ou reiniciar o motor Docker ma­nu­al­mente, utilize o systemd com um dos seguintes comandos:

Para iniciar o daemon de­sa­ti­vado, utilize o systemctl jun­ta­mente com o comando start:

sudo systemctl start docker
bash

Se o que pretende é parar o daemon do Docker, utilize o comando stop:

sudo systemctl stop docker
bash

Para reiniciar o motor, utilize restart:

sudo systemctl restart docker
bash

Como utilizar o Docker Hub

Se o motor Docker re­pre­senta o coração da pla­ta­forma de con­ten­to­res, o Docker Hub é a alma do projeto de código aberto, pois é aqui que a co­mu­ni­dade se reúne. Os uti­li­za­do­res encontram neste re­po­si­tó­rio na nuvem tudo o que precisam para dar vida à sua ins­ta­la­ção do Docker.

O serviço online dis­po­ni­bi­liza vários re­po­si­tó­rios oficiais com mais de 100 000 apli­ca­ções gratuitas. Os uti­li­za­do­res também têm a pos­si­bi­li­dade de criar as suas próprias imagens e partilhá-las com grupos de trabalho. Para além do apoio pro­fis­si­o­nal prestado pela equipa de pro­gra­ma­do­res, aqui também é possível interagir com a co­mu­ni­dade de uti­li­za­do­res. No GitHub, os uti­li­za­do­res têm acesso a um fórum de apoio.

Imagem: Docker Hub: apartado de registro
El Docker ID personal se crea de forma gratuita en el apartado del registro / Fuente: hub.docker.com

Registar-se no Docker Hub

O registo no Docker Hub é gratuito e requer apenas um endereço de e-mail e um Docker ID próprio, que será pos­te­ri­or­mente utilizado como nome do espaço pessoal para o re­po­si­tó­rio e permite aceder a todos os serviços do Docker. A oferta inclui o Docker Hub, o Docker Cloud, a Docker Store e alguns programas Beta. Além disso, com o Docker ID, obtém-se acesso ao centro de as­sis­tên­cia do Docker, bem como ao Docker Success Portal e aos fóruns do Docker.

Podes registar-te seguindo estes cinco passos:

  1. Escolha um Docker ID: durante o registo, deve escolher um nome de uti­li­za­dor que mais tarde se tornará o seu ID.
  2. Introduza o seu endereço de e-mail: introduza um endereço de e-mail ativo, pois servirá para confirmar a inscrição no Docker Hub.
  3. Crie uma palavra-passe: escolha uma palavra-passe.
  4. Envie a inscrição: clique em «Sign up» para confirmar a sua inscrição. Se todos os dados tiverem sido pre­en­chi­dos cor­re­ta­mente, será enviado um link de ve­ri­fi­ca­ção para o endereço fornecido.
  5. Confirme o seu endereço de e-mail: confirme a sua conta de e-mail clicando no link de ve­ri­fi­ca­ção.

Depois de se registar, poderá aceder di­re­ta­mente aos serviços online do projeto Docker a partir do navegador. Aqui poderá criar re­po­si­tó­rios e grupos de trabalho, bem como procurar recursos de acesso público através da fun­ci­o­na­li­dade «Explorar».

Imagem: Panel de control de Docker Hub
En el panel de control de Docker Hub puedes ad­mi­nis­trar los re­po­si­to­rios y grupos de trabajo / Fuente: hub.docker.com

Também podes registar-te di­re­ta­mente a partir da consola do sistema operativo uti­li­zando o comando docker login. Podes encontrar uma ex­pli­ca­ção detalhada sobre o comando na do­cu­men­ta­ção do Docker.

Em princípio, os uti­li­za­do­res sem conta nem Docker ID também podem aceder ao Docker Hub, embora só possam des­car­re­gar imagens dos re­po­si­tó­rios de acesso público e não possam carregar (push) as suas próprias imagens.

Criar re­po­si­tó­rios no Docker Hub

A conta gratuita no Docker Hub inclui um re­po­si­tó­rio de acesso privado e permite criar quantos re­po­si­tó­rios de acesso público quiser. No entanto, pode des­blo­quear mais re­po­si­tó­rios de acesso privado através de uma atu­a­li­za­ção paga.

Para criar um re­po­si­tó­rio, siga os seguintes passos:

  1. Escolha um espaço de nomes: quando cria um re­po­si­tó­rio, é-lhe atribuído au­to­ma­ti­ca­mente o espaço de nomes do seu Docker ID, embora também lhe possa ser atribuído o de uma or­ga­ni­za­ção à qual pertença.
  2. Dê um nome ao re­po­si­tó­rio: atribua um nome ao re­po­si­tó­rio que está a criar.
  3. Adicione uma descrição: adicione uma descrição ao re­po­si­tó­rio.
  4. Configure a segurança: decida se pretende criar um re­po­si­tó­rio de acesso público (public) ou um ao qual apenas você ou a sua or­ga­ni­za­ção possam aceder (private).

Clique em «Create» para confirmar a criação.

Imagem: Docker Hub: formulario para crear un repositorio
Tu re­po­si­to­rio se creará di­rec­ta­mente en el espacio de nombres de tu Docker ID / Fuente: hub.docker.com

Criar equipas e or­ga­ni­za­ções

Através do Docker Hub, o Docker oferece uma pla­ta­forma na nuvem onde é possível gerir a criação de imagens de forma cen­tra­li­zada e partilhá-las fa­cil­mente com grupos de trabalho, aos quais o Docker denomina «or­ga­ni­za­ções». Tal como acontece com as contas de uti­li­za­dor, as or­ga­ni­za­ções também recebem um ID in­di­vi­dual, através do qual podem des­car­re­gar imagens ou partilhá-las com outros uti­li­za­do­res. As funções e per­mis­sões de cada membro são or­ga­ni­za­das em equipas. Desta forma, por exemplo, apenas os uti­li­za­do­res que pertencem ao grupo «Owners» podem criar re­po­si­tó­rios privados ou públicos e atribuir per­mis­sões de acesso.

Também podes criar e gerir os grupos de trabalho através do painel de controlo. Para mais in­for­ma­ções sobre a gestão de equipas e or­ga­ni­za­ções, consulta a do­cu­men­ta­ção do Docker.

Como trabalhar com imagens e con­ten­to­res

O Docker Hub é o principal ponto de acesso aos recursos oficiais do Docker e constitui o ponto de partida para a nossa in­tro­du­ção à gestão de imagens e con­ten­to­res. Aqui, a equipa de pro­gra­ma­do­res apresenta, entre outras, a imagem de de­mons­tra­ção «whalesay», que será utilizada como base no tutorial do Docker que se segue.

Des­car­re­gar imagens do Docker

Para encontrar a imagem whalesay, aceda à página inicial do Docker Hub e introduza o termo whalesay na barra de pesquisa situada à direita do logótipo do Docker.

Imagem: Función de búsqueda en Docker Hub
Busca en la barra de búsqueda de Docker Hub o con la pestaña “Explore” / Fuente: hub.docker.com

Nos re­sul­ta­dos da pesquisa, clique no recurso com a etiqueta docker/whalesay para aceder ao re­po­si­tó­rio público desta imagem. Os re­po­si­tó­rios Docker têm sempre a mesma estrutura: na parte superior, é apre­sen­tado o título da imagem, a categoria do re­po­si­tó­rio e a data da última atu­a­li­za­ção (last pushed).

Imagem: Interfaz web de un repositorio Docker
En los re­po­si­to­rios, los usuarios en­cu­en­tran nor­mal­mente toda la in­for­ma­ción necesaria para la creación de imágenes / Fuente: hub.docker.com

Cada re­po­si­tó­rio Docker inclui também as seguintes secções:

  • Descrição: descrição detalhada e ins­tru­ções de uti­li­za­ção.
  • Comando Docker Pull: consola de linha de comandos para des­car­re­gar imagens do re­po­si­tó­rio (pull).
  • Pro­pri­e­tá­rio: in­for­ma­ções sobre o criador do re­po­si­tó­rio.
  • Co­men­tá­rios: área de co­men­tá­rios no final da página.

Nas janelas de in­for­ma­ção do re­po­si­tó­rio, pode ver-se que o whalesay é uma adaptação do script Perl de código aberto cowsay. O programa, de­sen­vol­vido por Rony Monroe em 1999, gera uma re­pre­sen­ta­ção gráfica ASCII de uma vaca que aparece no terminal do uti­li­za­dor jun­ta­mente com uma mensagem.

Para des­car­re­gar a imagem docker/whalesay, utilize o comando docker pull com a seguinte sintaxe:

docker pull [OPTIONS] NAME [:TAG|@DIGEST]
bash

O comando docker pull instrui o daemon a des­car­re­gar uma imagem do re­po­si­tó­rio. Para que ele possa iden­ti­fi­car a imagem, deve indicar o seu nome (NAME). Também pode indicar ao Docker como deve executar o comando pre­ten­dido através de opções (OPTIONS) e, op­ci­o­nal­mente, in­tro­du­zir tags (:TAG) ou números de iden­ti­fi­ca­ção únicos (@DIGEST) que permitem des­car­re­gar uma versão es­pe­cí­fica de uma imagem.

Para criar uma cópia local da imagem docker/whalesay, utilize o seguinte comando:

docker pull docker/whalesay
bash

Em geral, isso não é ne­ces­sá­rio, pois quando se pretende iniciar um contentor, o daemon do Docker des­car­rega au­to­ma­ti­ca­mente as imagens do re­po­si­tó­rio, caso não as encontre no sistema local.

Iniciar imagens do Docker como con­ten­to­res

Para iniciar uma imagem do Docker, utilize o comando docker run com a seguinte estrutura básica:

docker run [OPTIONS] IMAGE [:TAG|@DIGEST] [CMD] [ARG…]
bash

A única parte obri­ga­tó­ria do comando docker run é o nome da imagem do Docker que pretende iniciar. No entanto, ao iniciar um contentor, também pode es­pe­ci­fi­car outras opções, TAGs e DIGEST. Além disso, pode combinar o comando docker run com outros comandos que são exe­cu­ta­dos ao iniciar o contentor. Neste caso, o comando CMD (COMMAND) definido pelo criador, que é executado au­to­ma­ti­ca­mente ao iniciar o contentor, é subs­ti­tuído. Com ar­gu­men­tos adi­ci­o­nais (ARG…), pode definir outras con­fi­gu­ra­ções opcionais, como adicionar uti­li­za­do­res ou trans­fe­rir variáveis de ambiente (en­vi­ron­ment variables).

Utilize o seguinte comando:

docker run docker/whalesay cowsay boo
bash

para des­car­re­gar o script Perl cor­res­pon­dente como imagem e executá-lo num contentor. Verás que o whalesay difere bastante do script original.

Imagem: Salida en la terminal del contenedor docker/whalesay: la ballena dice “boo”
Si se ejecuta “docker/whalesay” con el comando estándar, la ballena de Docker se limita a un breve “boo”

Ao executar a imagem docker/whalesay, o script exibe na consola um gráfico ASCII com a forma de uma baleia, bem como a mensagem «boo» gerada pelo comando cowsay.

Tal como no teste anterior, o daemon irá primeiro procurar a imagem no diretório local de ficheiros. Se não encontrar um pacote com o mesmo nome, inicia um download a partir do re­po­si­tó­rio do Docker através de um comando pull. Por fim, o daemon irá iniciar o programa cowsay mo­di­fi­cado. Assim que terminar, o contentor será encerrado au­to­ma­ti­ca­mente.

Tal como acontece com o cowsay, o whalesay do Docker também permite alterar a saída de texto no terminal. Ex­pe­ri­menta esta fun­ci­o­na­li­dade subs­ti­tuindo a mensagem «boo» no comando de saída por outra sequência de ca­rac­te­res, como uma piada sobre baleias.

sudo docker run docker/whalesay cowsay What did the shark say to the whale? What are you blubbering about?
bash
Imagem: Salida en la terminal del contenedor docker/whalesay: la ballena muestra un mensaje de texto personalizado
La ballena puede mostrar mensajes de texto per­so­na­li­za­dos

Vi­su­a­li­zar todas as imagens do Docker no sistema local

Para verificar se des­car­re­gou uma imagem es­pe­cí­fica, pode aceder a uma visão geral de todas as imagens no seu sistema local uti­li­zando o seguinte comando:

sudo docker images
bash

O comando docker images (ou, em al­ter­na­tiva, docker image ls) mostra todas as imagens locais, jun­ta­mente com in­for­ma­ções sobre o tamanho do ficheiro, a etiqueta e o ID de cada imagem.

Imagem: Listado de todas las imágenes en el sistema local
La lista de imágenes des­car­ga­das muestra “hello-world” y “docker/whalesay”

Ao iniciar um contentor, a imagem sub­ja­cente é des­car­re­gada do re­po­si­tó­rio como uma cópia e guardada per­ma­nen­te­mente no seu com­pu­ta­dor, o que lhe permite poupar tempo em acessos futuros. Só precisará de uma nova descarga se a fonte da imagem mudar, como acontece quando há uma versão atu­a­li­zada dis­po­ní­vel no re­po­si­tó­rio.

Ver todos os con­ten­to­res no sistema local

Se quiser ver todos os con­ten­to­res que estão a ser exe­cu­ta­dos ou que já foram exe­cu­ta­dos no sistema, deve utilizar o comando ocker ps jun­ta­mente com a opção --all (abreviado como: -a):

sudo docker ps -a
bash
Imagem: Vista general de todos los contenedores en el sistema local
La vista general muestra todos los con­te­ne­do­res iniciados en el motor Docker

As in­for­ma­ções obtidas no terminal incluem o ID do contêiner em questão, a imagem sub­ja­cente, o comando executado para o seu arranque, a hora de arranque e o seu estado atual.

Se quiser ver apenas os con­têi­ne­res que estão atu­al­mente em execução, utilize o comando docker ps sem nenhuma opção:

sudo docker ps
bash

No entanto, neste momento não deverá ter nenhum contêiner em execução no seu sistema.

Criar imagens Docker

Já sabes como encontrar imagens no Docker Hub, des­car­regá-las e executá-las em qualquer sistema onde o motor Docker esteja instalado. No entanto, o Docker não se limita apenas a dis­po­ni­bi­li­zar uma vasta gama de apli­ca­ções no seu re­po­si­tó­rio; também oferece uma grande variedade de recursos para criares as tuas próprias imagens e partilhá-las com outros pro­gra­ma­do­res.

Nos capítulos in­tro­du­tó­rios deste artigo, vimos que cada imagem do Docker é criada a partir de um Doc­ker­file, que funciona como um conjunto de ins­tru­ções para a montagem de imagens. O Doc­ker­file é um ficheiro de texto simples que contém todas as ins­tru­ções de que o Docker necessita para criar uma imagem. Nas secções seguintes, ex­pli­ca­re­mos como escrever um Doc­ker­file e como indicar ao Docker que o utilize como ponto de partida para criar a sua própria imagem.

  1. Crie um novo diretório: a equipa de pro­gra­ma­do­res do Docker recomenda criar um diretório es­pe­cí­fico para cada Doc­ker­file, um processo simples de realizar no terminal do Linux. Utilize o seguinte comando para criar um novo diretório com o nome my­doc­ker­build:
mkdir mydockerbuild
bash
Imagem: Terminal Ubuntu: el comando mkdir
Crear nuevos di­rec­to­rios con el comando “mkdir”
  1. Aceda ao novo diretório: para tal, utilize o comando cd.
cd mydockerbuild
bash
Imagem: Terminal Ubuntu: el comando cd
El comando “cd” te permite acceder a otro di­rec­to­rio de trabajo
  1. Crie um novo ficheiro de texto: editores de texto como o Nano e o Vim permitem-lhe criar ficheiros de texto a partir do terminal do Ubuntu. Crie um ficheiro de texto com o nome Doc­ker­file no seu diretório my­doc­ker­build.
nano Dockerfile
bash
Imagem: Terminal Ubuntu: crear archivos de texto con Nano
Nano es un editor de texto que viene preins­ta­lado en todas las versiones de Ubuntu
  1. Escreva o Doc­ker­file: o ficheiro de texto que acabou de criar irá conter as ins­tru­ções ne­ces­sá­rias para criar a sua nova imagem. Em vez de criar a imagem do zero, neste tutorial do Docker vamos utilizar o comando FROM para usar a imagem docker/whalesay como modelo para a sua nova imagem. Utilize :latest como tag para indicar que deve ser utilizada a versão mais recente da imagem.
FROM docker/whalesay:latest

Até ao momento, a fun­ci­o­na­li­dade do docker/whalesay centra-se em permitir que o uti­li­za­dor escolha as palavras que saem da boca da baleia, de modo a que, no terminal, apareça exa­ta­mente esse texto ao lado do comando de arranque do contentor. Seria muito mais in­te­res­sante se o script gerasse au­to­ma­ti­ca­mente novas saídas de texto, o que é possível graças a programas como o fortunes, dis­po­ní­vel para o sistema Linux, cuja função principal consiste em gerar pro­vér­bios e aforismos di­ver­ti­dos. Pode atualizar o índice de pacotes locais e instalar o fortunes com o seguinte comando:

RUN apt-get -y update && apt-get install -y fortunes

Por fim, defina uma instrução CMD que será executada após o comando RUN, desde que não tenha sido subs­ti­tuída pelo comando (docker run image CMD). Utilize o seguinte comando para executar o programa fortunes com a opção -a («Escolher entre todas as bases de dados») e apre­sen­tar o resultado através do programa cowsay no terminal:

CMD /usr/games/fortune -a | cowsay

Neste momento, o Doc­ker­file deve ter o seguinte conteúdo:

FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay

Tenha em conta o seguinte: os comandos de um Doc­ker­file estão limitados a uma única linha e começam sempre por uma palavra-chave. A sintaxe não distingue entre maiús­cu­las e mi­nús­cu­las, embora se tenha es­ta­be­le­cido que as palavras-chave devem ser escritas em maiús­cu­las.

Imagem: El editor de texto Nano en la terminal de Ubuntu
Puedes controlar el editor de texto Nano con la com­bi­na­ción de teclas que aparecen en la zona inferior de la ventana
  1. Guarde e feche o ficheiro de texto: guarde as suas entradas. Se estiver a utilizar o editor Nano, prima a com­bi­na­ção de teclas [Ctrl] + [O] e confirme com [Enter] para guardar. O Nano irá indicar que foram escritas três linhas no ficheiro se­le­ci­o­nado. Feche o editor de texto com a com­bi­na­ção de teclas [Ctrl] + [X].
  2. Crie imagens a partir do Doc­ker­file: para criar uma imagem a partir de um Doc­ker­file, aceda primeiro ao diretório onde se encontram os ficheiros de texto. A imagem é criada com o comando docker build. Se pretender atribuir um nome es­pe­cí­fico à imagem in­di­vi­du­al­mente ou fornecer-lhe uma etiqueta, utilize a opção -t jun­ta­mente com a com­bi­na­ção do nome escolhido e da etiqueta. O formato padrão é name:tag.

No exemplo seguinte, é criada uma imagem com o nome docker-whale:

docker build -t docker-whale .
bash

O ponto indica que o Doc­ker­file se encontra no diretório atual, embora também seja possível adicionar um caminho de ficheiros ou um URL para os ficheiros originais.

O processo de com­pi­la­ção começa assim que o comando for con­fir­mado com [Enter]. Primeiro, o daemon do Docker verifica se dispõe de todos os ficheiros ne­ces­sá­rios para criar uma imagem, co­nhe­ci­dos como «Context» de acordo com a ter­mi­no­lo­gia do Docker. Em seguida, localiza-se a imagem docker/whalesay com a tag :latest. Se o Contexto ne­ces­sá­rio para a imagem estiver completo, o daemon do Docker iniciará o modelo in­cor­po­rado da imagem uti­li­zando a instrução FROM num contentor tem­po­rá­rio e, em seguida, pros­se­guirá com os comandos seguintes do Doc­ker­file. Neste caso, o comando seguinte é um RUN que instala o programa fortunes.

No final de cada etapa do processo de criação da imagem, o Docker atribui um ID à camada (layer) criada nessa etapa. É im­por­tante ter em conta que cada linha do Doc­ker­file cor­res­ponde a uma camada da imagem cons­truída.

Quando o comando RUN termina, o daemon do Docker encerra o contentor tem­po­rá­rio utilizado para este fim, elimina-o e inicia um novo contentor tem­po­rá­rio para a camada da instrução CMD. Assim que o processo de com­pi­la­ção terminar, o contentor tem­po­rá­rio será encerrado e eliminado. O Docker apre­sen­tará o ID da nova imagem, da seguinte forma:

Successfully built a8f2048c9ab8
Imagem: Terminal Ubuntu: notificaciones de estado durante la creación de la imagen
'Las imágenes Docker se crean en varias capas (layers')“

A imagem recém-criada aparecerá na lista de imagens ar­ma­ze­na­das lo­cal­mente com o nome docker-whale.

sudo docker images
bash
Imagem: Terminal Ubuntu: vista general de todas las imágenes
La imagen recién creada en el listado con todas las imágenes

Para iniciar um contentor com base na imagem que acabou de criar, utilize o comando sudo docker run seguido do nome da sua imagem, desta forma:

sudo docker run docker-whale
bash

Se a imagem tiver sido criada cor­re­ta­mente a partir do Doc­ker­file, a baleia deverá falar com eloquên­cia e de­mons­trar a sua sabedoria. Tem em conta que, sempre que iniciares o contentor, verás uma frase diferente.

Imagem: Contenedor basado en docker-whale: salida del texto en la terminal
Con fortunes la ballena ASCII generará aforismos

Atribuir tags às suas imagens do Docker e carregá-las no Docker Hub

Antes de poder carregar a imagem docker-whale que criou no Docker Hub e, assim, partilhá-la com a co­mu­ni­dade ou com um grupo es­pe­cí­fico, deve associá-la a um re­po­si­tó­rio com o mesmo nome no seu espaço de nomes pessoal. O processo de as­so­ci­a­ção é conhecido como «tagging» na ter­mi­no­lo­gia do Docker.

Siga os passos abaixo para publicar uma imagem no Docker Hub:

  1. Criar um re­po­si­tó­rio: registe-se no Docker Hub com o seu Docker ID e a sua palavra-passe pessoal. Em seguida, crie um re­po­si­tó­rio público e denomine-o docker-whale.
Imagem: Docker Hub: formulario para la creación de un repositorio
Crea un re­po­si­to­rio para la imagen que has creado / Fuente: hub.docker.com
  1. Obter o ID da imagem: utilize o comando docker images para obter o iden­ti­fi­ca­dor da imagem docker-whale que criou.
Imagem: Vista general de todas las imágenes en la terminal de Ubuntu
El comando “docker images” muestra una lista de todas las imágenes guardadas en el sistema

No nosso caso, o ID da imagem é a8f2048c9ab8. Pre­ci­sa­mos do ID para marcar a imagem no passo seguinte.

  1. Marcar a imagem: para marcar a imagem docker-whale, utilize o comando docker tag seguindo o seguinte esquema:
sudo docker tag [Image-ID][Docker-ID]/[Image-Name]:[TAG]
bash

No exemplo atual, o comando que deve in­tro­du­zir no terminal para utilizar o taggear é o seguinte:

sudo docker tag a8f2048c9ab8 [Namespace]/docker-whale:latest
bash

Para verificar se a imagem foi marcada cor­re­ta­mente, aceda à vista geral com docker images. Na lista, o nome do re­po­si­tó­rio deverá mostrar o seu Docker ID.

Imagem: Terminal Ubuntu: vista general de las imágenes antes y después de taggear
Con “docker tag” vinculas las imágenes con tu Docker ID
  1. Carregar a imagem: primeiro, inicie sessão no Docker Hub com o comando docker login:
sudo docker login
bash

O terminal irá solicitar o seu nome de uti­li­za­dor (Docker ID) e a sua palavra-passe.

Imagem: Accede a Docker Hub a través de la terminal Ubuntu
Debes re­gis­trarte para poder subir una imagen a Docker Hub

Depois de entrar, digite o comando docker push para carregar a imagem no re­po­si­tó­rio que criou:

sudo docker push [Namespace]/docker-whale
bash

O processo de car­re­ga­mento não deve demorar mais do que alguns segundos. O terminal mostra-lhe o estado atual.

Imagem: Terminal Ubuntu: notificación de estado tras subir la imagen
Una vez se ha subido la imagen, se encuentra dis­po­ni­ble en Docker Hub con el tag “latest”.

Podes ver a tua imagem se acederes ao Docker Hub a partir do navegador.

Imagem: Docker-Hub: repositorio [Namespace]/docker-whale en la vista detallada
En la vista detallada puedes ver la última ac­tu­a­li­za­ción de tu re­po­si­to­rio / Fuente: hub.docker.com

Se quiseres carregar várias imagens num único re­po­si­tó­rio, utiliza tags di­fe­ren­tes para re­pre­sen­tar as di­fe­ren­tes versões das imagens. Por exemplo:

[Namespace]/docker-whale:latest
[Namespace]/docker-whale:version1
[Namespace]/docker-whale:version2

No separador «Tags», pode aceder a uma visão geral de todas as versões de imagens dis­po­ní­veis num re­po­si­tó­rio.

Imagem: Docker Hub: pestaña “Tags”
En la pestaña “Tags” en­cu­en­tras todas las versiones de una misma imagen / Fuente: hub.docker.com

Pelo contrário, as imagens de projetos di­fe­ren­tes devem estar ar­ma­ze­na­das em re­po­si­tó­rios separados.

Depois de carregar a imagem com sucesso, esta ficará dis­po­ní­vel no re­po­si­tó­rio público para todos os uti­li­za­do­res do mundo.

  1. Ve­ri­fi­ca­ção: verifique se a imagem foi carregada cor­re­ta­mente, tentando des­car­regá-la.

Primeiro, elimine a versão local da imagem para poder des­car­re­gar uma cópia com a mesma etiqueta; caso contrário, o Docker poderá avisar-lhe que a imagem que pretende já se encontra na sua versão mais recente.

Imagem: Estado: “Image is up to date” (“la copia local está actualizada”)
El comando Pull se in­ter­rumpe si la imagen ya existe en local

Elimine as imagens locais do Docker uti­li­zando o comando docker rmi jun­ta­mente com o ID da imagem, que pode ser obtido com docker images. Se ocorrer algum conflito, ou seja, se o Docker indicar que o ID da imagem está a ser utilizado noutros re­po­si­tó­rios ou num contentor, pode forçar a eli­mi­na­ção com a opção --force (abreviado: -f).

sudo docker rmi -f a8f2048c9ab8
bash
Imagem: El comando docker rmi con la opción -f (force)
Utiliza el comando “docker rmi” con la opción “-f” para forzar una eli­mi­na­ción

Volte à vi­su­a­li­za­ção geral de todas as imagens:

sudo docker Images
bash

Os elementos eli­mi­na­dos não devem aparecer na saída do terminal. Utilize o comando pull e indique o re­po­si­tó­rio para des­car­re­gar uma nova cópia da imagem a partir do Docker Hub:

sudo docker pull [Namespace]/€
bash
Imagem: Terminal Ubuntu: descarga desde Docker Hub
La imagen que has creado pre­vi­a­mente se ha des­car­gado con éxito

Mais tópicos e tutoriais sobre o Docker

O universo do Docker é vasto e di­ver­si­fi­cado. Com o tempo, de­sen­vol­veu-se um ecos­sis­tema ativo de fer­ra­men­tas re­la­ci­o­na­das com o Docker. O Docker é par­ti­cu­lar­mente in­te­res­sante para os ad­mi­nis­tra­do­res, es­pe­ci­al­mente quando se utilizam apli­ca­ções complexas que envolvem vários con­ten­to­res em di­fe­ren­tes sistemas paralelos. O Docker oferece várias fun­ci­o­na­li­da­des para or­ques­trar um cluster deste tipo. Pode encontrar mais detalhes sobre o assunto no nosso artigo sobre [or­ques­tra­ção de con­ten­to­res Docker com Swarm e Compose Se quiser trabalhar com o Docker, pode encontrar mais tutoriais no Digital Guide:

  • Volumes de con­ten­to­res Docker
  • Tutorial do Docker Compose

O Docker oferece uma ver­sa­ti­li­dade ex­ce­ci­o­nal em diversos cenários de aplicação. No nosso Guia Digital, en­con­trará os seguintes tutoriais:

  • Redis em con­ten­to­res Docker
  • Instalar um servidor Teamspeak com o Docker

É im­por­tante re­co­nhe­cer que o Docker nem sempre é a opção mais adequada. Na nossa análise das al­ter­na­ti­vas ao Docker, ex­plo­ra­mos as prin­ci­pais al­ter­na­ti­vas. Além disso, apre­sen­ta­mos com­pa­ra­ções diretas entre algumas al­ter­na­ti­vas e o Docker:

  • Ku­ber­ne­tes vs. Docker
  • Openshift vs. Docker
  • Podman vs. Docker
Ir para o menu principal